1、数字电路与逻辑设计实验上实验报告数字电路与逻辑设计实验(上)实验报告学院: 信息与通信工程学院 班级: 2013211119 姓名: 王译锌 学号: 2013210563 班内序号: 16 一、实验名称与任务要求实验名称:数字电路与逻辑设计实验(上)任务要求:本学期数字实验课分为4次,每次4学时,具体安排如下: 实验一: 实验内容:Quartus II原理图输入法设计与实现 实验题目:(1)半加器(2)全加器(3)利用74138实现函数 实验二: 实验内容:用VHDL设计与实现组合逻辑电路 实验题目:(1)数码管译码器(2)8421码转余3码(3)奇校验器实验三: 实验内容:用VHDL设计与实
2、现时序逻辑电路 实验题目:(1)8421十进制计数器(2)分频器(3)将(1)、(2)和数码管译码器 3 个电路进行链接,并下载到实验板显示计数结果实验四: 实验内容:用VHDL设计与实现相关电路 实验题目:数码管动态扫描控制器、点阵行扫描控制器(二选一)二、实验三(3)和实验四模块端口说明与连接图(一)、实验三(3)模块端口说明与连接图实验三(3)要求将8421十进制计数器、分频器和数码管译码器三个电路进行连接。对于整个电路,输入端口包括输入的时钟信号clk,数码管译码器的灭灯bi和试灯lt信号,译码器的地址选择信号address(选择哪一个灯亮)和计数器的清零dclear;输出端口包括数码
3、管译码器的输出控制信号y(控制显示的数字)和对应于输入地址的亮灯信号cat(选择哪一个灯亮)。其端口的VHDL描述如下:ENTITY DisCounter ISPORT(clk : IN STD_LOGIC;lt,bi : IN STD_LOGIC;cclear : IN STD_LOGIC;address : IN STD_LOGIC_VECTOR(2 DOWNTO 0); cat : OUT STD_LOGIC_VECTOR(5 DOWNTO 0);y : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);END DisCounter;8421十进制计数器的输入端口包括输入
4、时钟信号clk,计数清零信号clear;输出包括计数器的计数输出cnt。其VHDL描述如下:COMPONENT Counter10PORT(clk,clear : IN STD_LOGIC;cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END COMPONENT;12分频器的输入端口为输入时钟信号clki;输出端口为经过分频的输出的时钟信号clko。其VHDL描述如下:COMPONENT Div12PORT(clki : IN STD_LOGIC;clko : OUT STD_LOGIC);END COMPONENT;数码管译码器的输入端口包括输入8421码的端
5、口code,灭灯信号bi和试灯信号lt,选择亮灯信号c;输出包括译码结果对应的显示控制信号y和选择需要亮的灯的信号cat。其VHDL实现如下:COMPONENT Seg7_1PORT(code : IN STD_LOGIC_VECTOR(3 DOWNTO 0);lt,bi : IN STD_LOGIC;c : IN STD_LOGIC_VECTOR(2 DOWNTO 0);cat : OUT STD_LOGIC_VECTOR(5 DOWNTO 0);y : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);END COMPONENT;数字显示译码器的连接图如下:(二)、实验四模
6、块端口说明与连接图本实验包括三部分。下面依次介绍端口:1、012345的静态显示该部分输入信号只有时钟信号clk;输出信号包括了对显示的数字的控制信号partout和控制显示数字的LED灯的信号catout。其VHDL实现如下:ENTITY Scan1 ISPORT(clk: IN STD_LOGIC;partout: OUT STD_LOGIC_VECTOR(6 DOWNTO 0);catout: OUT STD_LOGIC_VECTOR(5 DOWNTO 0);END Scan1;其中分频器的输入和输出分别为输入的时钟clki和分频得到的时钟信号clko。其VHDL实现如下:COMPONE
7、NT DivPORT(clki: IN STD_LOGIC;clko: OUT STD_LOGIC);END COMPONENT;译码器的输入只有时钟信号clk;输出包括对显示的数字的控制信号parto和控制显示数字的灯的信号cato。其VHDL实现如下:COMPONENT TranPORT(clki : IN STD_LOGIC;parto: OUT STD_LOGIC_VECTOR(6 DOWNTO 0);cato : OUT STD_LOGIC_VECTOR(5 DOWNTO 0);END COMPONENT;静态显示012345的连接图如下: 2、012345的滚动显示:本实验实现了0
8、12345的滚动显示,即依次显示012345、123450、501234、012345。从外部来看,该电路的端口仍然只有三个。输入信号只有时钟信号clk;输出信号包括了对显示的数字的控制信号partout和控制显示数字的灯的信号catout。其VHDL实现如下:ENTITY Scan2 ISPORT(clk: IN STD_LOGIC;partout: OUT STD_LOGIC_VECTOR(6 DOWNTO 0);catout: OUT STD_LOGIC_VECTOR(5 DOWNTO 0);END Scan2;该电路由五个元件组成,两个分频器分出不同的频率,高频实现对显示的控制,低频实
9、现对移位的控制。两个分频器的原理是一样的,只是具有不同的分频系数而已,故只写出其中一个的VHDL描述:COMPONENT Div1PORT(clki: IN STD_LOGIC;clko: OUT STD_LOGIC);END COMPONENT; 电路中另一个元件Choose实现选择当前显示数字的LED,其包含了一个时钟输入端口clki,一个选择结果的输出端口cato,其VHDL实现如下:COMPONENT ChoosePORT(clki : IN STD_LOGIC;cato : OUT STD_LOGIC_VECTOR(5 DOWNTO 0);END COMPONENT;实现移位功能也定
10、义了一个元件JudgeMove,它有两个输入端口,分别是分频器分出的低频movei和高频tempclki,这两个时钟配合实现移位的功能;输出端口numbero输出了要显示的数(011111表示输出0,101111表示输出1,以此类推)。其VHDL实现如下:COMPONENT JudgeMovePORT(tempclki,movei: IN STD_LOGIC;numbero: OUT STD_LOGIC_VECTOR(5 DOWNTO 0);END COMPONENT;最后一个元件Display把前面元件得到的要显示的数的代码转化为对七段数码管的控制,输入端口numberi为前一元件得到的代码
11、信号,输出端口为代码对应的七段数码管控制信号parto。其VHDL实现如下:COMPONENT DisplayPORT(numberi: IN STD_LOGIC_VECTOR(5 DOWNTO 0);parto: OUT STD_LOGIC_VECTOR(6 DOWNTO 0);END COMPONENT;电路连接图如下:3、012345的滚动与擦除该部分的功能与第二部分类似,有同样的输入输出端口,且各元件也有相同的输入输出端口。只是元件Choose中对于cat控制信号的赋值较之前更为复杂。为了避免重复,不再一一列出。电路连接图如下:三、部分实验原理图或代码(一)、实验一(2)原理图 全加器
12、可以由两个半加器加上外加门来实现,这一点可以由全加器和半加器的表达式清楚的看出。 对全加器:Si=Ai XOR Bi XOR Ci-1; Ci=(Ai XOR Bi) AND Ci-1) OR (Ai AND Bi) 而对于半加器:Si=Ai XOR Bi; Ci= Ai AND Bi(二)、实验三(3)VHDL代码1、总体电路的实现:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY DisCounter ISPORT(clk : IN STD_LOGIC;lt,bi : IN STD_LOGIC;cclear : IN STD_LOGIC;add
13、ress : IN STD_LOGIC_VECTOR(2 DOWNTO 0); cat : OUT STD_LOGIC_VECTOR(5 DOWNTO 0);y : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);END DisCounter;ARCHITECTURE Arch_DC OF DisCounter ISCOMPONENT Div12PORT(clki : IN STD_LOGIC;clko : OUT STD_LOGIC);END COMPONENT;COMPONENT Counter10PORT(clk,clear : IN STD_LOGIC;cnt : O
14、UT STD_LOGIC_VECTOR(3 DOWNTO 0);END COMPONENT;COMPONENT Seg7_1PORT(code : IN STD_LOGIC_VECTOR(3 DOWNTO 0);lt,bi : IN STD_LOGIC;c : IN STD_LOGIC_VECTOR(2 DOWNTO 0);cat : OUT STD_LOGIC_VECTOR(5 DOWNTO 0);y : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);END COMPONENT;SIGNAL clock:STD_LOGIC;SIGNAL cnt:STD_LOGIC_VEC
15、TOR(3 DOWNTO 0);BEGIN u1:Div12 PORT MAP(clki=clk,clko=clock); u2:Counter10 PORT MAP(clk=clock,clear=cclear,cnt=cnt); u3:Seg7_1 PORT MAP(code=cnt,lt=lt,bi=bi,c=address,cat=cat,y=y);END Arch_DC;2、十进制计数器的实现: 实验实现的是8421十进制计数器,计数从0000到1001LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGN
16、ED.ALL;ENTITY Counter10 ISPORT(clk,clear : IN STD_LOGIC;cnt : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END Counter10;ARCHITECTURE Arch_Counter10 OF Counter10 ISSIGNAL Count: STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN PROCESS(clear,clk) BEGIN IF(clear=1) THEN count=0000; ELSIF(clkevent AND clk=1) THEN IF(count=1001)
17、 THEN count=0000; ELSE count=count+1; END IF; END IF; END PROCESS; cnt=count;END Arch_Counter10;3、12分频器的实现:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY Div12 ISPORT(clki : IN STD_LOGIC;clko : OUT STD_LOGIC);END Div12;ARCHITECTURE Arch_Div12 OF Div12 ISSIGNAL t:STD_
18、LOGIC;BEGIN PROCESS(clki) VARIABLE count: INTEGER RANGE 0 TO 5; BEGIN IF(clkiEVENT AND clki=1) THEN IF(count=5) THEN count:=0; t=NOT t; ELSE count:=count+1; END IF; END IF; END PROCESS; clko=t;END Arch_Div12;4、数码管译码器的实现:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY
19、Seg7_1 ISPORT(code : IN STD_LOGIC_VECTOR(3 DOWNTO 0);lt,bi :IN STD_LOGIC;c : IN STD_LOGIC_VECTOR(2 DOWNTO 0);cat : OUT STD_LOGIC_VECTOR(5 DOWNTO 0);y : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);END Seg7_1;ARCHITECTURE Arch_Seg OF Seg7_1 ISBEGIN PROCESS(lt,bi,code) BEGIN IF(bi=1) THEN cat=111111; ELSIF(lt=1)
20、THEN cat=000000; y y y y y y y y y y y y cat cat cat cat cat cat cat catclk,clko=tempclk); u2:Tran PORT MAP(clki=tempclk,parto=partout,cato=catout);END Arch_S1;分频器的实现只需要改变常亮M的值,即可方便实现分频系数的改变。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY Div ISPORT(clki: IN STD_LOGIC;clko: OUT STD_LOGIC);END Div;AR
21、CHITECTURE Arch_Div OF Div ISCONSTANT M: INTEGER :=5;SIGNAL count: INTEGER RANGE 0 TO M;SIGNAL clk: STD_LOGIC;BEGIN PROCESS(clki) BEGIN IF(clkievent and clki=1) THEN IF count=M THEN count=0; clk= NOT clk; ELSE count=count+1; END IF; END IF; END PROCESS; clko cat=011111;part cat=101111;part cat=11011
22、1;part cat=111011;part cat=111101;part cat=111110;part cat=011111;part=1111110; -0 END CASE; END IF; END PROCESS; cato=cat; parto=part;END Arch_Tran;2、012345的滚动显示: 本实验的实现原理与基本要求基本一致。为实现移位,新增了一个分频系数更高的分频器,记分出的信号为move。当move输出一个上升沿的时候,做一个标记记录。当另一个分频系数小的分频器输出的时钟信号tempclk到达上升沿(这意味着显示的LED和数字的改变),若此时move也到
23、了上升沿(通过之前所做的标记来判断),则改变当前输出数码的赋值方式(假设第一位本来显示0,若不移动,接下来应该显示1,而由于需要移动数字,则第二位显示的数字应该为3。此处比较巧妙,在移动信号move到来的第一个tempclk时钟周期内显示其实是错误的,但是因为只有一次且时间短暂,故人眼不会看出);若没有到达上升沿,则同实验一中一样正常显示下一位数。通过这种方法,实现012345的滚动显示。 总体电路的实现: LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL ;ENTITY Scan2 ISPORT(clk: IN STD_LOGIC;partout: OUT STD_LOGIC_VECTOR(6 DOWNTO 0);catout: OUT STD_LOGIC_VECTOR(5 DOWNTO 0);END Scan2;ARCHITECTURE Ar