SOPC实验一【创建一个CPU的最小系统】
- 格式:doc
- 大小:411.50 KB
- 文档页数:5
NIOS教程(1) --------建立一个最小系统简介NIOS是一个用户可配置的通用32位RISC嵌入式处理器,它是SOPC(System On a Programmable Chip,片上可编程系统)的核心。
处理器以软核形式实现,具有高度的灵活性和可配置性。
NIOS的开发包括硬件开发和软件开发两部分。
硬件开发是在Quartus II中实现的,而软件开发部分是在NIOS IDE软件中实现的。
我们首先来介绍NIOS的硬件逻辑开发。
所谓硬件逻辑开发就是用Quartus II 和 SOPC Builder来建立自己需要的软核。
1.先打开QuartusII 9.0SP2软件点击菜单栏FileÆ New Project Wizard,弹出如下对话框点击Next>按钮继续,在此步中,What is the working directory for this project? 是询问你的这个项目工程打算放在哪里?我们改为d:\ask2cb_nios\nios1 (表示整个工程建立在D盘的ask2cb_nios\nios1目录下面) What is the name of this project? 是询问你这个工程项目名是什么?我们改为nios1(表示这是第一个nios示例工程)What is the name of the top-level design entity for this project? 是询问这个工程项目的顶层设计入门名我们改为nios1,表示顶层模块名为nios1改成如下图所示:点击Next>继续提示D盘下面没有ask2cb_nios目录下的nios1这个目录,询问是否要创建它,选择是(y),让QuartusII创建这个目录。
向导开始询问是否有现成的文件需要加到当前新建的工程中?这步不用管它,点击Next>继续,在此步中,向导询问你使用的是何种器件,我们在Device family组合框中,Family下拉列表中选择CycloneII,在Available devices:下面的列表框中选择EP2C5Q208C8,这是我们ASK2CB-5开发板所使用的FPGA主芯片(EP2C5Q208C8),如果您购买的是ASK2CB-8开发板,请选择EP2C8Q208C8。
单片机最小系统制作实验报告单片机最小系统实验报告《单片机原理及应用技术》设计课题:系别:专业:学号:姓名:指导老师:课程设计报告2012年6月单片机最小系统(流水灯的设计)一、单片机简介由于单片机技术在各个领域正得到越来越广泛的应用,世界上许多记成电路生产家相继推出各种类型的单片机,在单片机家族的众多成员中,MCS-51系列单片机以其优越的性能、成熟的技术及高可靠性和高性能价格比,迅速占领了工业测控和自动化工程应用的主要市场,成为国内单片机应用领域中的主流。
目前,可用于MCS-51系列单片机开发的硬件越来越多,与其配套的各类开发系统、各种软件也日趋完善,因此,可以极方便地利用现在资源,开发出用于不同目的的各类应用系统。
单片机最小系统是在以MCS-51单片机为基础上扩展,使其能更方便地运用于测试系统中,不仅具有控制方便、组态简单和灵活性大等优点,而且可以大幅度提高被测试的技术指标,从而能够大大提高产品的质量和数量。
单片机以其功能强、体积小、可靠性高、造价低和开发周期短等优点,称为在实时监测和自动控制领域中广泛应用的期间,在工业生产中称为必不可少的器件,尤其是在日常生活中发挥的作用也越来越大。
普遍来说,单片机又称单片微控制器,是在一块芯片中集成了CPU(中央处理器)、RAM(数据存储器)、ROM(程序存储器)、定时器/ 计数器和多种功能的I/O(输入/ 输出)接口等一台计算机所需要的基本功能部件,从而可以完成复杂的运算、逻辑控制、通信等功能。
二、电路简介在我们的单片机最小系统设计中,有些电路的介绍简单如下:复位电路:由电容串联电阻构成,电容电压不能突变的性质,可以知道,当系统一上电,RST脚将会出现高电平,并且,这个高电平持续的时间由电路的RC值来决定。
典型的51单片机当RST 脚的高电平持续两个机器周期以上就将复位,所以,适当组合RC 的取值就可以保证可靠的复位。
晶振电路:典型的晶振取11.0592MHz (因为可以准确地得到9600波特率和19200波特率,用于有串口通讯的场合)//12MHz (产生精确的us级时歇,方便定时操作(来自: 写论文网:单片机最小系统制作实验报告))。
双MicroBlaze软核处理器的SOPC系统设计双MicroBlaze软核处理器的SOPC系统设计摘要:设计了一款基于双MicroBlaze软核处理器、面向嵌入式领域的SOPC系统,在信息处理繁忙的情况下,实现两软核处理器之间的同步、通信和中断功能,提高信息吞吐率和系统灵活性,降低设备尺寸。
两处理器之间通过Mutex模块实现同步功能,通过Mailbox 模块实现通信和中断功能,通过共享BRAM模块实现大块通信功能,并进行了有效的功能验证。
该SOPC系统在XUPV5-LX110T开发板上得到验证。
测试结果表明,两软核处理器之间有效地实现了同步,通信和中断功能,达到了预期的效果,验证了方案的有效性。
关键词:MicroBlaze;双核;SOPC;Mutex;Mailbox;BRAM 引言随着时代的发展,单核片上可编程系统SOPC(Systern On a Programmable Chip)解决复杂问题的能力与处理速度已很难满足用户的需求,面向多处理器SOPC系统的设计成为片上系统发展的必然趋势。
具有高密度、大容量逻辑的FPGA(Field Programmable Gate Array)的出现使得高性能片上多处理器的设计成为现实。
目前,片上多核系统的设计已有一定发展,但在处理器间通信和中断方面仍需进一步的研究。
本文在处理器间通信和中断控制方面进行了深入的研究。
MicroBlaze是一个被优化过的可以在Xilinx公司FPGA中运行的软核处理器,可以和其他外设IP核一起完成可编程系统芯片的设计。
它具有运行速度快、占用资源少、可配置性强等优点,广泛应用于通信、高端消费市场等领域。
MicroBlaze处理器采用RISC(ReducedInstruction Set Computer)指令集结构和哈佛存储结构,指令、数据总线位宽均为32位。
本文MicroBlaze处理器采用面积优化,流水线分为3级,即取指、译码和执行,减少了硬件开销。
51单片机最小系统制作(推荐初学者)实物图功能:1.流水灯2.数码管动态显示3.蜂鸣器唱歌4.红外遥控接受遥控近照:背面:虽然先看着多点。
但其实一点也不复杂,只能说费事而已。
八位LED灯八位LED灯蜂鸣器:蜂鸣器是从网卡上拆下来的,数码管一、确定任务开发单片机最小系统二、任务分析:该系统具有的功能:(1)具有2位LED数码管显示功能。
(2)具有八路发光二极管显示各种流水灯。
(3)可以完成各种奏乐,报警等发声音类实验。
(4)具有复位功能。
三、功能分析(1)两位LED数码管显示功能,我们可以利用单片机的P0口接两个数码管来现这个功能;(2)八路发光二极管显示可以利用P1口接八个发光二极管实现这个功能;(3)各种奏乐、报警等发声功能可以采用P2.0这个引脚接一蜂鸣器来实现。
(4)利用单片机的第9脚可以设计成复位系统,我们采用按键复位;利用单片机的18、19脚可以设计成时钟电路,我们利用单片机的内部振荡方式设计的。
四、设计框图五、硬件电路设计根据本系统的功能,和单片机的工作条件,我们设计出下面的电路图。
本人又添加了红外一体化接收头。
可以对单片机进行遥控了。
使用USB口供电。
六、元件清单的确定:数码管:共阴极2只(分立)电解电容:10UF的一只30PF的电容2只220欧的电阻9只4.7K的电阻一只1.2K的电阻一只4.7K的排阻一只,12MHZ的晶振一只有源5V蜂名器一只AT89S51单片机一片常开按钮开关1只紧锁座一只(方便芯取下来的,绿色的)发光二极管(5MM红色)8只万能板电路版15*17CMS8550三极管一只4.5V电池盒一只,导线若干。
七、硬件电路的焊接按照原理图把上面的元件焊接好,详细步骤省略。
八、相关程序编写针对上面的电路原理图,设计出本系统的详细功能:(1)、第一个发光二极管点亮,同时数码管显示“1”。
(2)、第二个发光二极管点亮,同时数码管显示“2”。
(3)、依次类推到第八个发光二极管点亮,同时数码管显示“8”。
实验一最小系统实验一、实验目的熟悉最小系统的硬件构成,掌握复位电路、晶振电路、电源电路(尤其是滤波电容的应用),编写一个例程,并在最小系统上运行;了解嵌入式开发的基本思想和过程。
掌握最小系统的构成,在将来的项目运用中能根据不同的场合选择相应的复位电路。
二、实验原理本实验通过一个简短的 Boot 引导程序介绍 ARM 开发平台的启动过程,同时该引导程序也可其他章节程序引导的示例程序。
本程序主要为了让读者能够清晰理解启动程序的基本架构组成部分以及掌握ARM 引导程序的编写方法。
三、主要实验设备1.硬件:宿主机、ARM教学试验箱;2.软件:Windows操作系统、ADS1.2集成开发环境。
四、实验内容构建最小系统,用示波器观察一下晶振电路的波形,测一下晶振正常工作时的电压。
编写一个例程,编译并运行。
设置ARM仿真器的开发环境。
程序架构如下:1.程序头IMPORT MDCNFG ;声明 MDCNFG(读写寄存器)物理地址0x48000000IMPORT MDREFR ;声明 MDREFR(刷新寄存器)0x48000004IMPORT MDMRS ;声明 MDMRS(模式/设置寄存器 0x48000040IMPORT init_MDCNFG ; 声明 init_MDCNFG 0x02000ac9IMPORT init_MDREFR ; 声明 init_MDREFR 0x0011e018IMPORT init_MDMRS ; 声明 init_MDMRS 0x320032IMPORT StackSvc ; 声明 StackSvc 0xa0600000IMPORT StackIrq ; 声明 StackIrq 0xa0605000IMPORT StackFiq ; 声明 StackFiq 0xa060a000IMPORT StackAbt ; 声明 StackAbt 0xa060e000IMPORT StackUnd ; 声明 StackUnd 0xa0714000IMPORT StackUsr ; 声明 StackUsr 0xa0720000IMPORT mainIMPORT宏通知编译器本源码文件需要引用在其他文件中定义的变量或函数。
单片机最小系统实验设计报告一、实验目的(1)熟悉单片机最小系统的组成,上机步骤及调试方法;(2)加深理解C51汇编语言逻辑结构,能够使用汇编进行简单的程序编写;(3)将课上学到的理论知识联系实际,完成简单的电子控制系统;二、实验所需仪器及设备三、实验线路及原理下图为实验板电路图:(1)硬件组成及原理硬件组成:89S52单片机、8D锁存器74LS573两片、16选1译码器74LS154、16位七段数码显示器、轻触开关;原理:采用扫描显示,利用人眼视觉暂留效应,产生稳定的数码显示效果。
基于上述基本原理,利用单片机的P0口作为七段数码显示器的段选控制,通过两片8D 锁存器74LS573将段选控制分配到两组总共16位七段数码显示器上;单片机的P1.0-P1.3作为16位七段数码显示器的位选,而如何用单片机的4个管脚控制两组总共16位的七段数码显示器呢?这里使用的是1片16选1的译码器74LS154。
(2)软件原理程序流程图:显示主循环个按键完成设置、加、在按键子程序中以及加减闪烁的值,数据缓FLASH修改显示缓冲 区闪烁位在显示子程序中,只需负责将显示缓冲区的数据取出来进行显示即可按键子程序说明:KEYIN: JNB SSET,KEYIN1 ;判断SET键是否按下ACALL DELAY1 ;延时去抖动JNB SSET,KEYIN1JB SSET,$ ;判断SET键是否松开INC FLASH ;SET键按下调整闪烁标志位MOV R7,FLASHCJNE R7,#17,KEYIN1;判断FLASH是否已经移出16位MOV FLASH,#0HKEYIN1: MOV TEMP1,R0JNB SSUB,KEYIN2;判断减键是否按下ACALL DELAY1;延时去抖动JNB SSUB,KEYIN2JB SSUB,$ ;判断减键是否松开MOV A,FLASHADD A,#60HMOV R0,ADEC @R0;减键按下修改数据缓冲区对应位的值CJNE @R0,#0FFH,KEYIN2MOV @R0,#0BHKEYIN2: JNB AADD,KEYIN3;判断加键是否按下ACALL DELAY1;延时去抖动JNB AADD,KEYIN3JB AADD,$ ;判断加键是否松开MOV A,FLASHADD A,#60HMOV R0,AINC @R0; 加键按下修改数据缓冲区对应位的值CJNE @R0,#0CH,KEYIN3MOV @R0,#0KEYIN3: MOV R0,TEMP1RET显示子程序:DISP: MOV A,@R0ACALL TAB;查表取得由第一片74LS573送出的段代码的值 ACALL SEGU9;调用第一片74LS573数据锁存子程序MOV A,@R1ACALL TAB1;查表取得由第二片74LS573送出的段代码的值 ACALL SEGU10;调用第二片74LS573数据锁存子程序INC R0;调整显缓指针INC R1;调整显缓指针ACALL SENDBIT;调用位选子程序点亮16位7段LED中的两位 ACALL DELAY;延时CJNE R0,#58H,DISP;判断是否已完成16位显示MOV R0,#50H;显缓指针付初值MOV R1,#58H;显缓指针付初值RET主程序:FLAG EQU 20HFG1 BIT FLAG.0FG2 BIT FLAG.1DATABUF1 EQU 60HDATABUF2 EQU 61HDATABUF3 EQU 62HDATABUF4 EQU 63HDATABUF5 EQU 64HDATABUF6 EQU 65HDATABUF7 EQU 66HDATABUF8 EQU 67HDATABUF9 EQU 68HDATABUF10 EQU 69HDATABUF11 EQU 6AHDATABUF12 EQU 6BHDATABUF13 EQU 6CHDATABUF14 EQU 6DHDATABUF15 EQU 6EHDATABUF16 EQU 6FHFLASH EQU 70H ;TEMP0 EQU 71HTEMP1 EQU 72HTEMP2 EQU 73HTEMP3 EQU 74HTEMP4 EQU 75HSSET BIT P3.0; SET键AADD BIT P1.7; 加键SSUB BIT P1.6; 减键ORG 0000HAJMP MAINORG 0030HMAIN: CLR CSETB FG1MOV R0,#50HMOV R1,#58HMOV TEMP0,#0MOV TEMP2,#40MOV FLASH,#16MOV DATABUF1,#2MOV DATABUF2,#0MOV DATABUF3,#0MOV DATABUF4,#5MOV DATABUF5,#0BHMOV DATABUF6,#0MOV DATABUF7,#3MOV DATABUF8,#0BHMOV DATABUF9,#0MOV DATABUF10,#9MOV DATABUF11,#0BHMOV DATABUF12,#0MOV DATABUF13,#2MOV DATABUF14,#0BHMOV DATABUF15,#5MOV DATABUF16,#0 MAIN1: ACALL KEYINACALL GETDATAMOV A,FLASHCJNE A,#16,MAIN4AJMP MAIN3MAIN4: DJNZ TEMP2,MAIN2MOV TEMP2,#60CPL FG1MAIN2: JB FG1,MAIN3MOV A,FLASHADD A,#50HMOV R0,AMOV @R0,#0AHMOV R0,#50HMAIN3: ACALL DISPAJMP MAIN1GETDATA:MOV TEMP3,R0MOV TEMP4,R1MOV R0,#50H ;//显缓 MOV R1,#60H NEXT: MOV A,@R1MOV @R0,AINC R0INC R1CJNE R0,#60H,NEXTMOV R0,TEMP3MOV R1,TEMP4RETDISP: MOV A,@R0ACALL TABACALL SEGU9MOV A,@R1ACALL TAB1ACALL SEGU10INC R0INC R1ACALL SENDBITACALL DELAYCJNE R0,#58H,DISPMOV R0,#50HMOV R1,#58HRETKEYIN: JNB SSET,KEYIN1ACALL DELAY1JNB SSET,KEYIN1JB SSET,$INC FLASHMOV R7,FLASHCJNE R7,#17,KEYIN1MOV FLASH,#0HKEYIN1: MOV TEMP1,R0JNB SSUB,KEYIN2ACALL DELAY1JNB SSUB,KEYIN2JB SSUB,$MOV A,FLASHADD A,#60HMOV R0,ADEC @R0CJNE @R0,#0FFH,KEYIN2 MOV @R0,#0BHKEYIN2: JNB AADD,KEYIN3ACALL DELAY1JNB AADD,KEYIN3JB AADD,$MOV A,FLASHADD A,#60HMOV R0,AINC @R0CJNE @R0,#0CH,KEYIN3 MOV @R0,#0KEYIN3: MOV R0,TEMP1RETSENDBIT:MOV A,P1ANL A,#0F0HORL A,TEMP0INC TEMP0MOV P1,AMOV R2,TEMP0CJNE R2,#8H,SENDBIT1 MOV TEMP0,#0 SENDBIT1:RETSEGU9: CLR P1.4CLR P1.5MOV P2,ASETB P1.4MOV P1,#0AHRETSEGU10: CLR P1.4CLR P1.5MOV P2,ASETB P1.5MOV P1,#0AHRETTAB: ADD A,#1MOVC A,@A+PCRETDB 0C0H,0F9H,0A4HDB 0B0H,99H,92HDB 82H,0F8H,80HDB 90H,0FFH,0BFHTAB1: ADD A,#1MOVC A,@A+PCRETDB 03H,09FH,25HDB 0DH,99H,49HDB 41H,1FH,01HDB 09H,0FFH,0FDHDELAY1: MOV R7,#200TM2: MOV R6,#100TM1: DJNZ R6,TM1DJNZ R7,TM2RETDELAY: MOV R7,#4TMM2: MOV R6,#50TMM1: DJNZ R6,TM1DJNZ R7,TM2RETEND元件清单:C1:104C2:103C3:103C4:103C5:33pC6:33pC7:220u电解C8:103C9: 220u电解C10:103C11:4.7u电解D1--D8以及DP:LEDD9:1N4001Jmper:IDC-20Jpower:电源接插件Q1—Q9:9012R1—R16:75欧R17—R25:220欧R26—R30:1KRESET以及S1,S2,S3:轻触开关RP1—RP4:4XLED七段数码管RP5—RP6:10K排阻U1:89s52U2:74ls145U3:lm7805U9,U10:74ls573Y1:12M晶振。
一、实验目的1.学习使用SOPC Builder定制最小NiosII系统的硬件开发过程。
2.学习使用NiosII IDE编写简单应用程序的软件开发过程。
3.学习QuartusII、SOPC Builder、NiosII IDE三种工具的配合使用。
二、实验内容本实验通过使用SOPC Builder定制一个只含“cpu、on_chip_ram、uart”最小NiosII系统,从而完成硬件开发。
然后,使用NiosII IDE编写应用程序,编译完成软件开发。
最后用Quartus II分配管脚,编译、下载完成NiosII最小系统的整个开发过程。
打开超级终端或串口调试助手观察实验结果。
三、所用仪器、材料(设备名称、型号、规格等)计算机、Quarters II软件四、实验步骤及结果截图1、打开Quartus II软件,选择“File| New Preject Wizard”,新建工程“Hello_world”。
点击Next,选择工程的安装路径,输入工程名,如图所示:点击Next,输入要添加到工程中的设计文件,默认不添加。
如图所示:点击Next,选择芯片系列Cyclone II,芯片型号EP2C20F484C8。
如图所示:点击Next,EDA工具设置界面如图所示:点击Next,显示建立新工程所有信息,最后点击Finish,完成新工程向导。
2、打开“Tools| SOPC Builder…”进入SOPC Builder。
(注意:若没有打开工程,“Tools| SOPC Builder…”不可选。
)在“Create New system”对话框中为这个Nios II最小系统命名为“nios_small”(注意该名称不能与工程名重复),默认“Verilog”硬件描述语言,点击“OK”。
如图所示:1)点击“OK”,“Device Family”栏选择“CycloneII”,“clk”栏为“50”MHz。
2)添加片内RAM。
接上一篇(原创)基于or1200最小sopc系统搭建(二)--QuartuII工程及DE2平台下载现再为构建的or1200最小系统添加上串口。
先进行仿真,再在DE2上验证,在hyperterminal 上显示hello world!从opencores网站上下载uart16550_latest.tar.gz,在or1200_sopc目录下新建uart16550目录,将uart16550的源码在解压到这个目录。
修改or1200_sys.v文件。
修改后文件如下:module or1200_sys(input clk_i,input rst_n,// buttonsinput[15:0]SW,// uart interfaceinput uart_rxd,output uart_txd,// segmentsoutput[31:0]LEDR);wire rst=~rst_n;// **************************************************// Wires from OR1200 Inst Master to Conmax m0// **************************************************wire wire_iwb_ack_i;wire wire_iwb_cyc_o;wire wire_iwb_stb_o;wire[31:0]wire_iwb_data_i;wire[31:0]wire_iwb_data_o;wire[31:0]wire_iwb_addr_o;wire[3:0]wire_iwb_sel_o;wire wire_iwb_we_o;wire wire_iwb_err_i;wire wire_iwb_rty_i;// **************************************************// Wires from OR1200 Data Master to Conmax m1// **************************************************wire wire_dwb_ack_i;wire wire_dwb_cyc_o;wire wire_dwb_stb_o;wire[31:0]wire_dwb_data_i;wire[31:0]wire_dwb_data_o;wire[31:0]wire_dwb_addr_o;wire[3:0]wire_dwb_sel_o;wire wire_dwb_we_o;wire wire_dwb_err_i;wire wire_dwb_rty_i;// **************************************************// Wires from Conmax s0 to onchip_ram0// **************************************************wire wire_ram0_ack_o;wire wire_ram0_cyc_i;wire wire_ram0_stb_i;wire[31:0]wire_ram0_data_i;wire[31:0]wire_ram0_data_o;wire[31:0]wire_ram0_addr_i;wire[3:0]wire_ram0_sel_i;wire wire_ram0_we_i;// **************************************************// Wires from Conmax s1 to GPIO// **************************************************wire wire_gpio_ack_o;wire wire_gpio_cyc_i;wire wire_gpio_stb_i;wire[31:0]wire_gpio_data_i;wire[31:0]wire_gpio_data_o;wire[31:0]wire_gpio_addr_i;wire[3:0]wire_gpio_sel_i;wire wire_gpio_we_i;wire wire_gpio_err_o;wire wire_gpio_interrupt;// ************************************************** // Wires from Conmax s2 to uart16550// **************************************************wire wire_uart_ack_o;wire wire_uart_cyc_i;wire wire_uart_stb_i;wire[31:0]wire_uart_data_i;wire[31:0]wire_uart_data_o;wire[31:0]wire_uart_addr_i;wire[3:0]wire_uart_sel_i;wire wire_uart_we_i;wire wire_uart_interrupt;or1200_top u_or1200(// System.clk_i(clk_i),.rst_i(rst),.pic_ints_i({18'b0,wire_uart_interrupt,wire_gpio_interrupt}), .clmode_i(2'b00),// Instruction WISHBONE INTERFACE.iwb_clk_i(clk_i),.iwb_rst_i(rst),.iwb_ack_i(wire_iwb_ack_i),.iwb_err_i(wire_iwb_err_i),.iwb_rty_i(wire_iwb_rty_i),.iwb_dat_i(wire_iwb_data_i),.iwb_cyc_o(wire_iwb_cyc_o),.iwb_adr_o(wire_iwb_addr_o),.iwb_stb_o(wire_iwb_stb_o),.iwb_we_o(wire_iwb_we_o),.iwb_sel_o(wire_iwb_sel_o),.iwb_dat_o(wire_iwb_data_o),`ifdef OR1200_WB_CAB.iwb_cab_o(),`endif//`ifdef OR1200_WB_B3// iwb_cti_o(),// iwb_bte_o(),//`endif// Data WISHBONE INTERFACE.dwb_clk_i(clk_i),.dwb_rst_i(rst),.dwb_ack_i(wire_dwb_ack_i),.dwb_err_i(wire_dwb_err_i),.dwb_cyc_o(wire_dwb_cyc_o), .dwb_adr_o(wire_dwb_addr_o), .dwb_stb_o(wire_dwb_stb_o), .dwb_we_o(wire_dwb_we_o), .dwb_sel_o(wire_dwb_sel_o), .dwb_dat_o(wire_dwb_data_o), `ifdef OR1200_WB_CAB.dwb_cab_o(),`endif//`ifdef OR1200_WB_B3// dwb_cti_o(),// dwb_bte_o(),//`endif// External Debug Interface.dbg_stall_i(1'b0),.dbg_ewt_i(1'b0),.dbg_lss_o(),.dbg_is_o(),.dbg_wp_o(),.dbg_bp_o(),.dbg_stb_i(1'b0),.dbg_we_i(1'b0),.dbg_adr_i(0),.dbg_dat_i(0),.dbg_dat_o(),.dbg_ack_o(),//`ifdef OR1200_BIST// // RAM BIST// mbist_si_i(),// mbist_so_o(),// mbist_ctrl_i(),//`endif// Power Management.pm_cpustall_i(0),.pm_clksd_o(),.pm_dc_gate_o(),.pm_ic_gate_o(),.pm_dmmu_gate_o(),.pm_immu_gate_o(),.pm_tt_gate_o(),.pm_cpu_gate_o(),.pm_wakeup_o(),.pm_lvolt_o());wb_conmax_top u_wb(.clk_i(clk_i),.rst_i(rst),// Master 0 Interface.m0_data_i(wire_iwb_data_o), .m0_data_o(wire_iwb_data_i), .m0_addr_i(wire_iwb_addr_o), .m0_sel_i(wire_iwb_sel_o),.m0_we_i(wire_iwb_we_o),.m0_cyc_i(wire_iwb_cyc_o),.m0_stb_i(wire_iwb_stb_o),.m0_rty_o(wire_iwb_rty_i),// .m0_cab_i(),// Master 1 Interface.m1_data_i(wire_dwb_data_o), .m1_data_o(wire_dwb_data_i), .m1_addr_i(wire_dwb_addr_o), .m1_sel_i(wire_dwb_sel_o),.m1_we_i(wire_dwb_we_o),.m1_cyc_i(wire_dwb_cyc_o),.m1_stb_i(wire_dwb_stb_o),.m1_ack_o(wire_dwb_ack_i), .m1_err_o(wire_dwb_err_i),.m1_rty_o(wire_dwb_rty_i),// .m0_cab_i(),// Slave 0 Interface.s0_data_i(wire_ram0_data_o), .s0_data_o(wire_ram0_data_i), .s0_addr_o(wire_ram0_addr_i), .s0_sel_o(wire_ram0_sel_i),.s0_we_o(wire_ram0_we_i),.s0_cyc_o(wire_ram0_cyc_i), .s0_stb_o(wire_ram0_stb_i),.s0_ack_i(wire_ram0_ack_o), .s0_err_i(0),.s0_rty_i(0),//.s0_cab_o(),// Slave 1 Interface.s1_data_i(wire_gpio_data_o), .s1_data_o(wire_gpio_data_i), .s1_addr_o(wire_gpio_addr_i), .s1_sel_o(wire_gpio_sel_i),.s1_we_o(wire_gpio_we_i),.s1_cyc_o(wire_gpio_cyc_i),.s1_stb_o(wire_gpio_stb_i),.s1_ack_i(wire_gpio_ack_o),.s1_err_i(wire_gpio_err_o),.s1_rty_i(0),//.s1_cab_o(),// Slave 2 Interface.s2_data_i(wire_uart_data_o), .s2_data_o(wire_uart_data_i), .s2_addr_o(wire_uart_addr_i), .s2_sel_o(wire_uart_sel_i),.s2_we_o(wire_uart_we_i),.s2_cyc_o(wire_uart_cyc_i),.s2_stb_o(wire_uart_stb_i),.s2_ack_i(wire_uart_ack_o),.s2_err_i(0),.s2_rty_i(0)//,//.s0_cab_o(),);ram0_top u_ram0(.clk_i(clk_i),.rst_i(rst),.wb_stb_i(wire_ram0_stb_i),.wb_cyc_i(wire_ram0_cyc_i),.wb_ack_o(wire_ram0_ack_o),.wb_addr_i(wire_ram0_addr_i),.wb_sel_i(wire_ram0_sel_i),.wb_we_i(wire_ram0_we_i),.wb_data_i(wire_ram0_data_i),.wb_data_o(wire_ram0_data_o));gpio_top u_gpio(// WISHBONE Interface.wb_clk_i(clk_i),.wb_rst_i(rst),.wb_cyc_i(wire_gpio_cyc_i),.wb_adr_i(wire_gpio_addr_i),.wb_dat_i(wire_gpio_data_i),.wb_sel_i(wire_gpio_sel_i),.wb_we_i(wire_gpio_we_i),.wb_stb_i(wire_gpio_stb_i),.wb_dat_o(wire_gpio_data_o),.wb_ack_o(wire_gpio_ack_o),.wb_err_o(wire_gpio_err_o),.wb_inta_o(wire_gpio_interrupt),//`ifdef GPIO_AUX_IMPLEMENT// // Auxiliary inputs interface// .aux_i(),//`endif // GPIO_AUX_IMPLEMENT// External GPIO Interface.ext_pad_i({16'b0,SW}),.ext_pad_o(LEDR),.ext_padoe_o()//,//`ifdef GPIO_CLKPAD// .clk_pad_i()//`endif);uart_top u_uart(.wb_clk_i(clk_i),// Wishbone signals.wb_rst_i(rst),.wb_adr_i(wire_uart_addr_i[4:0]),.wb_dat_i(wire_uart_data_i),.wb_dat_o(wire_uart_data_o),.wb_we_i(wire_uart_we_i),.wb_stb_i(wire_uart_stb_i),.wb_cyc_i(wire_uart_cyc_i),.wb_ack_o(wire_uart_ack_o),.wb_sel_i(wire_uart_sel_i),.int_o(wire_uart_interrupt),// interrupt request // UART signals// serial input/output.stx_pad_o(uart_txd),.srx_pad_i(uart_rxd),// modem signals.rts_pad_o(),.cts_pad_i(1'b0),.dtr_pad_o(),.dsr_pad_i(1'b0),.ri_pad_i(1'b0),.dcd_pad_i(1'b0)//,//`ifdef UART_HAS_BAUDRATE_OUTPUT// .baud_o()//`endif);endmodule修改or1200_sopc.v文件://small sopc with openrisc//`include "or1200_defines.v"module or1200_sopc(//////////////////// Clock Input ////////////////////CLOCK_27,// On Board 27 MHzCLOCK_50,// On Board 50 MHz//////////////////// Push Button ////////////////////KEY,// Pushbutton[3:0]//////////////////// DPDT Switch ////////////////////SW,// Toggle Switch[17:0]//////////////////////// LED ////////////////////////LEDR,// LED Red[17:0]//////////////////////// UART ////////////////////////UART_TXD,// UART TransmitterUART_RXD//, // UART Receiver );//////////////////////// Clock Input ////////////////////////input CLOCK_27;// On Board 27 MHzinput CLOCK_50;// On Board 50 MHz//////////////////////// Push Button ////////////////////////input[3:0]KEY;// Pushbutton[3:0]//////////////////////// DPDT Switch ////////////////////////input[17:0]SW;// Toggle Switch[17:0]//////////////////////////// LED ////////////////////////////output[17:0]LEDR;// LED Red[17:0]//////////////////////////// UART ////////////////////////////output UART_TXD;// UART Transmitter input UART_RXD;// UART Receiverwire CPU_RESET;wire clk_25,clk_10;Reset_Delay delay1(.iRST(KEY[0]),.iCLK(CLOCK_50),.oRESET(CPU_RESET));cpu_pll pll0(.inclk0(CLOCK_50),.c0(clk_25),.c1(clk_10));or1200_sys or1200(.clk_i(clk_25),.rst_n(CPU_RESET),// buttons.SW(SW[15:0]),// segments.LEDR(LEDR[17:0]),// uart interface.uart_rxd(UART_RXD),.uart_txd(UART_TXD)//,);endmodule仿真UART时需要用到UART的接收器核uart_rx。
实验一 SOPC快速入门一、实验目的1、学习Quartus II、SOPC Builder、Nios II IDE的基本操作;2、初步了解SOPC的开发流程,基本掌握Nios II软核的定制流程;3、掌握Nios II软件的开发流程;掌握软件的基本调试方法。
二、实验设备硬件:PC机,DE2 教学实验开发平台;软件:Quartus II 9.0,SOPC Builder9.0,Nios II IDE9.0。
三、实验内容建立可用于控制LED闪烁的简单Nios II处理器系统,具体包括:1、在Quartus II中建立一个工程;2、使用SOPC Builder建立并生成一个简单的基于Nios II的硬件系统;3、在Quartus II工程中编译基于Nios II的硬件系统并生成配置文件.sof;4、在Nios II IDE中建立对应硬件系统的用户C/C++工程,编写一简单用户程序,在Nios II IDE中编译程序生成可执行文件.elf;5、将配置文件.sof和可执行文件.elf都下载到FPGA进行调试运行。
四、实验原理和实验步骤控制LED灯闪烁的用户程序代码很小,可将其固化在片内ROM来执行。
变量、堆栈等空间使用片内RAM,不使用任何片外存储器。
整个系统的框图如图1-1所示。
从图1-1控制LED闪烁的系统框图可知,其它逻辑与Nios II系统一样可存在于FPGA 中。
Nios II系统可与其它片内逻辑相互作用,取决于整个系统的需要。
为了简单起见,本实验在FPGA内不包括其它逻辑。
图1-1 控制LED闪烁的系统框图1、使用Quartus II建立工程Quartus II是以工程(Project)的方式对设计过程进行管理,Quartus II工程中存放创建FPGA配置文件需要的所有设置和设计文件。
因此,每个开发过程开始时都应建立一个Quartus II工程。
(1) 打开Quartus II软件并建立工程①选择“开始”→“程序”→Altera→Quartus II 9.0,打开Quartus II 9.0软件,软件界面如图1-2所示。
一、实验内容:
基本要求:
创建一个CPU的最小系统(NIOS II + 8kB片内RAM + 8kB片内ROM),控制实验板上的8个发光二极管(4个同时亮、4个同时灭,然后循环交替)。
扩展要求:
(1)将8个LED的显示改为流水灯形式。
即8个LED每次亮一个灯,从右向左依次轮流循环显示。
(2)在系统中加入两个控制按键,当按键为不同状态时,8个LED按不同方式进行显示,显示方式自己定义。
二、实验步骤概要:
1、用QuartusII软件建立工作项目,定义系统名称;
2、利用QuartusII软件中的SOPC Builder工具,根据设计的需求配置CPU最小系统。
3、配置完毕后,用SOPC Builder自动生成CPU小系统的硬件电路。
4、返回QuartusII软件,调用CPU硬件,编写顶层文件,设置输入、输出信号,分配引脚,编译,得到下载文件.sof。
5、调用软件集成开发环境,建立软件项目,配置IDE的硬件环境和样板程序。
6、编写、编译并调试程序。
7、下载并运行程序。
三、具体实验步骤:
1、进入QuartusII软件环境,新建一个工程项目MyNiosSystem.qpf,
并设置为Cyclone III EP3C16F484C6 (DE0)
2、定制CPU小系统:
A.进入SOPC Builder,定制一个简单的32位CPU小系统
B.输入系统名称,选V erilog。
C.选择并添加CPU (NIOS II/s),单击Finish
D.选择并添加8 kBytes的片内RAM(on-Chip Memory,选RAM),单击Finish
E.选择并添加8 kBytes的片内和一个8位的PIO
F.选择并添加一个系统的标识符(可选模块)
G.在每个元件的Module Name上面点击鼠标右键,出现下图所示菜单,选Rename将各个模块改为便于记忆的名字,最后得到的结果如下页图所示。
H. 在cpu元件上双击鼠标左键,设置CPU复位地址和系统出现异常时的程序运行的地址, 点击Finish。
I. 选择主菜单
System > Auto-Assign Base Address 和
System > Auto-Assign Base IRQs
让系统自动分配每个元件的基地址和中断请求优先级别。
J.单击System Generation页,再单击右下脚Generate按钮,开始生成CPU的小系统,等几分钟后,出现成功信息。
3、CPU最小系统的使用:
A.返回QuartusII,新建一个原理图文件MyNiosSystem.bdf。
B.选File>New, 新建一个setup.tcl文件,将FPGA器件的引脚号分配给原理图中的输入、输出信号。
(DE0)Setup.tcl文件内容如下:
set_location_assignment PIN_G21 -to CLK
set_location_assignment PIN_H2 -to RST_n
set_location_assignment PIN_C2 -to LED_pio[7]
set_location_assignment PIN_C1 -to LED_pio[6]
set_location_assignment PIN_E1 -to LED_pio[5]
set_location_assignment PIN_F2 -to LED_pio[4]
set_location_assignment PIN_H1 -to LED_pio[3]
set_location_assignment PIN_J3 -to LED_pio[2]
set_location_assignment PIN_J2 -to LED_pio[1]
set_location_assignment PIN_J1 -to LED_pio[0]
C.选择Tools > TclScripts命令,选择Open File,打开刚才编辑的setup.tcl文件,再选中该文件,单击Run按钮。
D.编译整个工程项目至此,硬件系统设计完成。
3、编写CPU应用程序:
A.进入NiosII IDE软件环境,选择C/C++语言,编写CPU应用程序。
单击workbench进入。
B.选择File > Switch Workspace,键入工作空间目录名(即前面创建项目的目录)作为C/C++程序的工作目录。
单击窗口下面的OK按钮,然后再次弹出该窗口。
C. 选择File > New Project,创建新的工程项目,选择hello word 作为新的C程序模板, 点击Finish。
D. 用右键单击hello_world.c, 选Rename命令,将文件名改为:MyLedFlasher.c
E. 将原来的hello_word.c程序删掉,编写自己的C程序
F. 编译C程序。
G. 选择主菜单Run>Run…,配置连接的电缆。
H. 选择Run> Run As > NiosII Hardware,运行程序,等待1分钟左右,才能看到灯的亮灭情况。
四、思考题:
1、QuartusII软件有几种设计流程,各流程之间的关系如何?
两种设计流程:图形编辑输入法,文本编辑输入法。
编辑设计文件,编译,仿真,编辑输入信号,波形文件保存,运行仿真器,属层层递进关系。
2、Nios II有那些特点和优势?
a能够实现复杂的状态机
b拥有全面的SOPC解决方案
c支持广泛的嵌入式软件工具
五、实验体会:
这是SOC课程的第一次实验,由于有详细的指导书指引,我们能较好地完成整个流程,但是还是会存在粗心的情况,某个小地方的设置会导致往后很大的错误,只是比较麻烦的地方,其他部分能通过相互交流很好地解决。
最后也认识到整个流程想要达到的目的和过程中使用的基本原理,达到实验要求。