现代数字系统实验

更新时间:2024-07-08 17:33:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

现代数字系统实验

林丽萍 2007/9

1

目 录

实验1:Quartus入门.................................................................................1

1、2输入与门(电路功能略)........................................................1 2、简单电路的设计.........................................................................15 实验2:简单的组合逻辑电路设计.......................................................22

1.2选1的数据选择器..................................................................22 2.8位宽2选1的数据选择器......................................................23 3.4选1的数据选择器..................................................................26 4.实现3位宽的4选1数据选择器。.........................................27 实验3:七段数码管显示.......................................................................29

1.显示简单字符.............................................................................29 2.显示0~9数字...........................................................................31 3.循环显示4个字符.....................................................................32 实验4:BCD码显示及运算...................................................................35

1.二进制码到BCD码的转换.........................................................35 2.1位BCD加法器..........................................................................36 3.2位BCD加法器..........................................................................38 实验5:触发器和计数器.......................................................................40

1.D触发器和D锁存器...................................................................40 2.计数器.........................................................................................42 3.分频器.........................................................................................51

2

4.时钟.............................................................................................53 实验6:存储器的设计...........................................................................56

1.用LPM实现32×8 RAM..............................................................57 2.用VHDL实现..............................................................................63 3.用片外RAM实现........................................................................65 4.SRAM的应用..............................................................................67 实验7:基于DE2的SOPC系统开发.....................................................68

1.建立一个新的SOPC系统..............................................................68 2.在SOPC Builder中定义目标系统.................................................69 3.分配基地址和中断请求优先级....................................................79 4.显示外设的连接关系....................................................................79 5.指定其他的NiosII设定..................................................................80 6.生成SOPC Builder目标系统.........................................................80 7.将目标集成到Quartus项目中........................................................81 8.下载硬件设计到目标FPGA..........................................................83 9.使用NiosII IDE开发软件..............................................................83 附录:.......................................................................................................88

3

实验1:Quartus入门

Quartus的学习以及了解DE2,通过简单step by step例子的引导。 本实验通过几个简单的例子向大家介绍FPGA开发软件QuartusII的使用流程。

1、2输入与门(电路功能略)

实验步骤:

第1步:打开QuartusII。 第2步:新建一个空项目。

执行File->New Project Wizard命令,进入新建项目向导。如下图所示,填入项目的名称,默认项目保存路径在Quartus安装下,也可修改为其他地址,视具体情况而定。

1

第3步:执行Next,进入向导的下一页进行项目内文件的添加操作,如果没有文件需要添加进项目,则直接按Next按钮既可。

第4步:指定CPLD/FPGA器件,如下图所示,选择芯片系列为“CycloneII”,型号为“EP2C35F672C6N”。选择型号时,可直接在列表框中查找,也可通过指定封装方式(Package)为“FBGA”、引脚数(Pin count)为“672”以及速度等级(Speed grade)为“6”这3个参数值来进行筛选。

7

第13步:功能仿真。

选择Processing->Simulator Tool,窗口如下图所示。选择仿真模式(Simulator mode)为“Functional”,并选择and2gate.vwf文件作为仿真输入(Simulation input)波形文件。点击Generate Functional Simulation Netlist按钮,生成仿真网表。然后点击Start按钮,开始仿真。在仿真完成后,点击Report按钮即可观看仿真的结果,如下图所示。从波形可以看出,程序的逻辑功能是正确的。

8

第14步:时序仿真。

再次选择Processing->Simulator Tool,并将仿真模式设为“Timing”,然后点击Start按钮。最后点击Report按钮查看仿真结果,结果如下图。与功能仿真结果图相比较,可以看出时序仿真的输出带有一定的延迟。

9

第15步:引脚分配。 在之前的编译过程中,Quartus软件已经自动为设计分配了引脚。而在DE2平台上,FPGA与外部器件的连接是确定的,其连接关系可参看附录A和B。如果选择SW0和SW1分别代表输入信号a和b、LEDG0代表输出信号y,则通过附录B查表可知它们分别对应FPGA的引脚PIN_N25、PIN_N26和PIN_AE22。

选择Assignments->Pins命令,打开引脚规划器(Pin Planner),如下图所示。接着双击信号a的Location栏,在下拉框中选择PIN_N25,其他信号通过相同的办法进行分配。

10

第16步:在仿真正确,并锁定自定引脚后,通过按钮对项目再次编译。

第17步:程序下载(配置FPGA)。

用USB连接线连接DE2的USB Blaster端口和电脑即可进行程序的下载。在DE2平台上,可以对FPGA进行两种模式配置:一种是JTAG模式,通过USB Blaster直接配置FPGA,但掉电后,FPGA中的配置内容会丢失,再次上电需要用电脑重新配置;另一种是在AS模式下,通过USB Blaster对DE2平台上的串行配置器件EPCS16进行编程,平台上电后,EPCS16会自动配置FPGA。通过DE2平台上的SW19选择配置模式,SW19置于RUN位置,即选择JTAG模式配置;置于PROG位置,则选择AS模式对EPCS16进行编程。

第18步:JTAG模式配置。

1)用USB连接线连接DE2和电脑,将SW19置于RUN位置。选择Tools->Programmer命令,打开配置窗口,如下图所示。

11

2)图中第一列显示“No Hardware”,说明未指定硬件设备,单击Hardware Setup按钮,打开硬件设置窗口,如下图所示。双击列表框中的USB-Blaster,然后点击Close按钮,完成硬件设置。

3)从下图可以看出,硬件已经设置完成,而且待配置的文件也已经在文件列表中。然后选中Program/Config选项,单击Start按钮,开始编程。编程结束后,即可在DE2上验证,将SW0和SW1置于1的位置,可以看到LEDG0灯亮。

12

第19步:AS模式配置。

1)首先需要设置串口配置器件,选择Assignments->Settings命令,打开设置窗口如下图所示。

2)单击Device&Pin Options..按钮,打开器件及引脚选项窗口,如下图所示。切换到Configuration页。在Configuration Device下拉框

13

中选择“EPCS16”,单击OK按钮结束配置。

3)将DE2上的SW19置于PROG位置。重新选择Tools->Programmer命令,打开编程窗口,在Mode下拉框中选择“Active Serial Programming”,这时会弹出下图的对话框,提示是否清除现有编程器件,选择“是”即可。

4)接着需要重新添加配置文件,单击Add Files按钮,添加and2.pof配置文件。选中Program/Config选项。单击Start按钮,开始编程。

14

编程结束后,将SW19置于RUN位置,再进行测试。

2、简单电路的设计

用上面同样的方法设计以下3个简单的电路。 1.三态门

电路中共有2个输入信号:数据输入信号din和三态使能信号en。还有一个输出信号dout。三态门的逻辑功能是:当en='1'时,dout<=din;当en='0'时,dout<='Z'。

VHDL程序如下: library ieee;

use ieee.std_logic_1164.all; entity trigate is port(

din,en:in std_logic;

15

dout:out std_logic); end trigate;

architecture behave_trigate of trigate is begin

process(en,din) begin

if (en='1')then dout<=din; else

dout<='Z'; end if;

end process;

end behave_trigate; 实验步骤如下:

第1步:在前面那个项目的基础上新建一个VHDL文件,起名为trigate.vhd,并输入上方的源程序。

第2步:在项目导向(Project Navigator)窗口中,选择文件(Files)管理页面,点开Device Design Files项,右击trigate.vhd文件,选择“Set as Top-Level Entity”选项。目的是将trigate.vhd文件设为项目的顶层实体。

16

第3步:对源程序进行语法检查,直到程序无误。

第4步:功能仿真,新建矢量波形图,起名为trigate.vwf,仿真结果如下图。

第5步:按照下表进行引脚分配。重新编译,并下载。

FPGA信DE2板上号 引脚 器件 dPIN_SW0 in N25 ePIN_SW1 n N26 dPIN_LEDG0 out AE22

17

2.三态与门

利用前面已完成的与门和三态门组合成一个三态与门。与前面两个例子不同的是,在这里不是采用文本编辑器完成设计输入,而是采用图形编辑器。

实验步骤如下:

第1步:首先将上述两个VHDL文件生成为符号(Symbol),以供后续步骤使用。右击and2gate.vhd,选择Create Symbol Files for Current File命令,即生成了and2gate符号。用同样的方法生成trigate符号。

第2步:新建一个图形文件。选择File->New命令,选择“Diagram/Schematic File”,点击OK按钮完成。将该图形文件另存为tri_and_gate.bdf。图形编辑窗口如下图所示,窗口左边是图形编辑

18

工具条。

第3步:在图形编辑窗口的空白处双击,打开符号库,如下图所示。展开Project项,可以看到有两个之前生成的符号分别是and2gate和trigate。选择and2gate,单击OK按钮,该符号就会出现在图形编辑窗口,单击左键即在窗口内放置该符号。用同样的方法放置trigate符号。

19

第4步:再次打开符号,在name输入栏中输入“input”,符号库自动在库中找到输入(input)符号,并选中“Repeat-insert mode”点击OK按钮,可反复在编辑窗口中放入输入符号,直单击右键取消放置为止。由于输入信号一共有3个,所以需要放入3个输入符号,并将3个输入符号命名为dina、dinb和en。用同样的方法放置1个输出(output)符号,并命名为dout。再选择工具栏中的按钮,将各符号连接起来,结果如图所示。

20

第5步:保存图形文件,并将tri_and_gate.bdf设置为顶层实体。再次编译项目文件,并进行功能仿真,仿真结果如图所示。

第6步:按照下表分配引脚,重新编译并下载验证。

FPGA信DE2上的号 引脚 器件 dPIN_SW0 ina N25 dPIN_SW1 inb N26 ePIN_SW2 n P25 dPIN_LEDG0 out AE22

21

实验2:简单的组合逻辑电路设计 1.2选1的数据选择器

具体步骤:

第1步:新建一个Quartus项目。

第2步:在Quartus项目中新建一个VHDL文件,并命名为mux_2to1.vhd,实现2选1的电路功能,其真值表和电路符号如下图所示。即当s=1时,输出m=y;当s=0时,输出m=x。

代码一:VHDL程序代码如下。 library ieee;

use ieee.std_logic_1164.all; entity mux_2to1 is port(

22

s,x,y:in std_logic; m:out std_logic); end mux_2to1;

architecture behave_mux_2to1 of mux_2to1 is begin

m<=x when s='0' else y ;

end behave_mux_2to1;

第3步:语法检查通过后,进行引脚分配,分配表如下表所示。然后再编译,下载验证。

FPGA信DE2上的号 引脚 器件 sPIN_SW0 N25 xPIN_SW1 N26 yPIN_SW2 P25 mPIN_LEDG0 AE22

2.8位宽2选1的数据选择器

在完成2选1数据选择器之后,将信号x和y的位宽由1位扩展为8位。

更改后的电路图如下:

23

实验步骤如下:

第1步:在代码一中,实体部分关于端口的说明也更改为: entity mux_2to1_8bit is port(

s:in std_logic;

X,Y:in std_logic_vector(7 downto 0); M:out std_logic_vector(7 downto 0)); end mux_2to1_8bit;

而结构体部分代码不变,代码修改后另存为mux_2to1_8bit.vhd。 第2步:接着把mux_2to1_8bit.vhd设定为项目的顶层设计文件。实现方法如下图所示,在项目浏览器(Project Navigator)中选择文件(Files)页,选中mux_2to1_8bit.vhd,单击右键,选择“Set as Top-Level Entity”命令即可。

24

第3步:语法检查,检查通过后再进行引脚分配。

引脚数也由原来的4个增加到25个,引脚分配更改如下表所示。分配完后重新编译项目文件,并下载验证。 FPGA信DE2上的器引脚 号 件 s PIN_SW0 N25 X[查附SW8~7..0] 录表 SW1 Y[SW16~SW同上 7..0] 9 MLEDG7~L同上 [7..0] EDG0

25

3.4选1的数据选择器

在完成2选1电路之后,将电路扩展为4选1数据选择器,电路及其真值表如下图所示。

代码修改如下: library ieee;

use ieee.std_logic_1164.all; entity mux_4to1 is port(

s:in std_logic_vector(1 downto 0); u,v,w,x:in std_logic; m:out std_logic );

end mux_4to1;

architecture behave_mux_4to1 of mux_4to1 is begin

26

m<=u when s=\ v when s=\ w when s=\ x;

end behave_mux_4to1;

文件另存为mux_4to1.vhd。

接着将mux_4to1.vhd设定为项目的顶层设计文件,再进行语法检查和引脚分配。

引脚分配表如下表所示,具体的FPGA引脚可通过查找附录表获取。分配完后重新编译项目文件,并下载验证。

信DE2上的号 器件 SSW1~S[1..0] W0 u SW2 v SW3 w SW4 x SW5 mLEDG0

4.实现3位宽的4选1数据选择器。

电路如下图所示。代码完成后,另存为mux_4to1_3bit.vhd。

27 28

实验3:七段数码管显示 1.显示简单字符

七段数码管显示电路如下图所示:

图中包含一个七段解码器模块,c2~c0是解码器的3个输入,当输入值不同时,输出不同的字符。如表中所示,当输入值为100~111时,输出空格,即数码管全暗。七段数码管的不同段位用数字0~6表示,注意七段数码管是共阳极的,即各管段输入低电平时,数码管亮;否则数码管暗。

具体实验步骤如下:

第1步:新建一个Quartus项目。 第2步:新建一个VHDL文件,实现上述七段解码器。具体代码如下: library ieee;

use ieee.std_logic_1164.all; entity char_7seg is

29

port(

c:in std_logic_vector(2 downto 0); hex:out std_logic_vector(6 downto 0)); end char_7seg;

architecture behave_char_7seg of char_7seg is begin

with c(2 downto 0) select

hex<= \ \ \ \ \ end behave_char_7seg;

保存VHDL文件,并命名为char_7seg.vhd。

第3步:语法检查,通过后,进行引脚分配,分配表如下:

信DE2上的号 器件 C[2SW2~S..0] W0 hexHEX0[6.[6..0] .0]

第4步:编译项目,完成后下载到FPGA中,并验证其功能。

30

2.显示0~9数字

在完成简单字符显示电路之后,设计一个用于显示0~9数字的七段数码管电路。电路图如下图所示,c3~c0是七段数码器的输入,当输入0000~1001时,则输出0~9,如表中所示;当输入1010~1111时,输出空格。

对上述代码进行相应的修改,并将文件另存为num_7seg.vhd。 接着将num_7seg.vhd设定为项目的顶层设计文件,再进行语法检查和引脚分配。

引脚分配表如下表所示,具体的FPGA引脚可通过查找附录表获取。分配完后重新编译项目文件,并下载验证。

信DE2上的号 器件 C[3SW3~S..0] W0 hexHEX0[6.[6..0] .0]

31

3.循环显示4个字符

循环显示4个字符的电路图如下: 电路的工作原理是,输入端U、V、W和X的输入值分别是000、001、010和011,通过s1和s0选择四个输入端其中一个作为七段解码器的输入值,从而显示H、L、E和O任一字符。

这个实验的实现方法有两个,一个是采用图形编辑的方法实现,与实验1中三态与门的实现方法类似。不过事先需要将实验2中的mux_4to1_3bit.vhd添加到本项目中,并为其创建一个符号;同时,为char_7seg.vhd创建一个符号。另一个方法是采用VHDL文本输入,但也需要事先将实验2中的mux_4to1_3bit.vhd添加到本项目中。

方法一:

图形文件的最终效果图如下图所示。图中的inst1和inst分别是mux_4to1_3bit.vhd和char_7seg.vhd所生成的符号。

32

值得注意的是,s[1..0]与输入引脚SW[1..0]连接,其他输入端类似,而hex[6..0]与输出引脚HEX0[6..0]连接。这里的输入和输出引脚全部采用DE2的引脚名称(注意区分大小写),目的是可以省去手动分配引脚的工作。

第1步:首先将图形文件另存为char_4to1_7seg.bdf,并将该文件设定为项目的顶层设计文件,再进行语法检查。

第2步:检查通过后,打开引脚规划(Pin Planner)窗口,命令是Assignments->Pins。

第3步:选择Assignments->Import Assignments..命令,导入DE2_pin_assignments.csv文件,该文件是DE2板上所有引脚的分配。导入之后,可以发现所有输入和输出引脚已经自动完成引脚分配,原因是我们把引脚的名称设定为DE2默认的引脚名称。

第4步:编译下载。 方法二:

通过VHDL代码实现,这里需要用到元件的概念。整个文件的代码如下:

library ieee;

use ieee.std_logic_1164.all;

33

entity char_4to1_7segv is port(

s:in std_logic_vector(1 downto 0);

U,V,W,X:in std_logic_vector(2 downto 0); hex0:out std_logic_vector(6 downto 0)); end char_4to1_7segv;

architecture behave_char_4to1_7segv of char_4to1_7segv is component char_7seg is port(

c:in std_logic_vector(2 downto 0); hex:out std_logic_vector(6 downto 0)); end component;

component mux_4to1_3bit is port(

s:in std_logic_vector(1 downto 0);

u,v,w,x:in std_logic_vector(2 downto 0); m:out std_logic_vector(2 downto 0)); end component;

signal mout:std_logic_vector(2 downto 0); begin

34

u1:mux_4to1_3bit port map(s,U,V,W,X,mout); u2:char_7seg port map(mout,hex0) ; end behave_char_4to1_7segv;

代码中用红色标识出来的就是元件的定义和调用部分。将文件另存为char_4to1_7segv.vhd,并将其设定为项目的顶层设计文件。再进行语法检查、引脚分配和编译下载。

实验4:BCD码显示及运算 1.二进制码到BCD码的转换

二进制码与BCD码之间的转换关系见下表:

表中将4位二进制输入V=v3v2v1v0转换成2位十进制D=d1d0,实现办法是用SW[3..0]作为二进制输入,而用HEX1和HEX0作为十进制输出的显示。从上述表中可以看出,当V<=9时,d1=0、d0=V;反之,d1=1、d0=V-10。

35

实验步骤如下:

第1步:新建一个Quartus项目。 第2步:建立一个VHDL文件,根据上述工作原理编写代码以实现所要求的电路,文件另存为bin_bcd.vhd。由于程序中用到了二进制码与十进制数之间的比较,所以需要添加一个程序包如下:

library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;

第3步:完成代码转换之后,需要将BCD码在数码管上显示,所以需要在项目中添加实验3中完成的num_7seg.vhd文件。

第4步:采用图形编辑方法或元件调用方法都可以完成最终的电路功能。

第5步:编译并下载验证。

2.1位BCD加法器

电路原理是输入两个BCD码A和B以及1位进位输入cin,输出是BCD码的和sum以及1位进位输出cout。例如当A=1001(9)、B=1001(9)、cin=1时,cout=1,sum=1001(9)。电路的输出最大值也就是19。

1位BCD加法器可以利用两个二进制加法器实现,其原理如下图所示。在VHDL中,二进制加法可以直接用A+B实现。不过前提

36

是需要使用std_logic_unsigned.all这个程序包。 程序的部分代码如下: …..

signal m:std_logic_vector(4 downto 0); signal c:std_logic; begin

m<=('0'&A)+('0'&B)+cin;

c<=m(4) or (m(3) and m(2)) or (m(3) and m(1)); cout<=c;

sum<=m(3 downto 0)+('0'&c&c&'0'); …….

这个程序完全是按照上述工作原理图得出的,文件另存为bcd_add_1bit.vhd。由于需要将结果值在数码管上显示,所以需要在项目中添加实验3中完成的num_7seg.vhd文件。

验证电路时可以用SW[0]作为cin输入端,SW[4..1]、SW[8..5]分别作为A和B的输入端,HEX0作为sum的输出端,LEDG[0]作

37

为cout的输出端。

3.2位BCD加法器

从1位BCD加法器扩展为2位BCD加法器,可以采用图形编辑器和VHDL文本输入两种方法实现。输入两个2位BCD码A1A0和B1以及1位进位输入cin,输出2位BCD码和S1S0和1位进位输出cout。验证电路时可用SW[8..1]表示A1A0,SW[16..9]表示B1,SW[0]表示cin;HEX1和HEX0

B0

B0

表示S1S0,LEDG[0]表示cout。

方法1:采用图形编辑器的方法,最终效果图如下所示。

方法2:采用1位BCD加法器的设计思路重新设计一个2位BCD加法器,以下是实现2位BCD加法器的伪代码,可作为编程的思路。

1 T0 = A0 + B0 2 if(T0 > 9) then 3 Z0 = 10; 4 c1 = 1; 5 else

本文来源:https://www.bwwdw.com/article/22d.html

Top