带有复位和时钟使能的十进制计数器
- 格式:doc
- 大小:15.50 KB
- 文档页数:2
十进制计数器设计十进制计数器设计一、实验目的:熟悉Quartus II的Verilog文本设计流程全过程,学习十进制计数器的设计、仿真,掌握计数器的工作原理。
二、实验原理:计数器属于时序电路的范畴,其应用十分普遍。
该程序设计是要实现带有异步复位、同步计数使能和可预置型的十进制计数器。
该计数器具有5个输入端口(CLK、RST、EN、LOAD、DATA)。
CLK输入时钟信号;RST起异步复位作用,RST=0,复位;EN是时钟使能,EN=1,允许加载或计数;LOAD是数据加载控制,LOAD=0,向内部寄存器加载数据;DATA是4位并行加载的数据。
有两个输出端口(DOUT和COUT)。
DOUT的位宽为4,输出计数值,从0到9;COUT是输出进位标志,位宽为1,每当DOUT为9时输出一个高电平脉冲。
RST在任意时刻有效时,如CLK非上升沿时,计数也能即刻清0;当EN=1,且在时钟CLK的上升沿时刻LOAD=0,4位输入数据DATA被加载,但如果此时时钟没有上升沿,尽管出现了加载信号LOAD=0,依然未出现加载情况;当EN=1,RST=1,LOAD=1时,计数正常进行,在计数数据等于9时进行输出高电平。
三、实验任务:在Quartus II上将设计好的程序进行编辑、编译、综合、适配、仿真,从时序仿真图中学习计数器工作原理,了解计数器的运行情况及时钟输入至计数器数据输出的延时情况。
四、实验步骤:(一)、建立工作库文件和编辑设计文件任何一项设计都是一项Project(工程),而把一个工程下的所有文件放在一个文件夹内是一个非常好的习惯,以便于我们整理,利用和提取不同工程下的文件,而此文件夹将被EDA软件默认为Work Library(工作库),所以第一步先根据自己的习惯,建立个新的文件夹。
(1)新建文件夹:在盘建立并保存工程,将文件夹取名Jishuqi。
(2)输入源程序:打开Quartus II,选择菜单File→New→DesignFiles→VerilogHDL File→OK(如图1所示)。
74LS192是双时钟方式的十进制可逆计数器。
(bcd,二进制)。
◆ CPU为加计数时钟输入端,CPD为减计数时钟输入端。
◆ LD为预置输入控制端,异步预置。
◆ CR为复位输入端,高电平有效,异步清除。
◆ CO为进位输出:1001状态后负脉冲输出,◆ BO为借位输出:0000状态后负脉冲输出。
74ls192引脚图:74ls192功能表:74LS192是属8421BCD码的十进制计数器,其功能真值表如表4所示。
其中MR是异步清零端,高电平有效。
PL(———)是并行置数端,低电平有效,且在MR=0有效。
CPU和CPu是两个时钟脉冲,当CPd=1,时钟脉冲由CPU端接入。
并且MR=0,PL(———)=1时,74LS192处于加法计数状态;当CPu脉冲从CPd端输入,且MR=0,PL(———)=1时,74LS192处于减法计数状态;CPd=CPu=1时,计数器处于保持状态。
TCu是进位端,TCd是借位端。
表4 74LS192功能真值表MR PL(———)CPu CPd P3 P2 P1 P0 Q3x+1 Q2x+1 Q1x+1 1 ×××××××00 00 1 ×↑d3 d2 d1 d0 d3d2 d10 1 ↑ 1 ××××加法计数0 1 1 ↑××××减法计数0 1 1 1 ××××保持74192的工作原理是:当LD(———)=1,MR=0时,若时钟脉冲加到CPu端,且CPd =1则计数器在预置数的基础上完成加计数功能,当加计数到9时,TCu端发出进位下跳变脉冲;若时钟脉冲加到CPd端,且CPu =1,则计数器在预置数的基础上完成减计数功能,当减计数到0时,TCd 端发出借位下跳变脉冲。
74LS192具有下述功能:①异步清零:MR=1,Q3Q2Q1Q0=0000②异步置数:MR=0,PL(———)=0,Q3Q2Q1Q0=P3P2P1P0③保持:MR=0,PL(———)=1,CPu=CPd=1,Q3Q2Q1Q0保持原态④加计数:MR=0, PL(———)=1,CPu=CP,CPd=1,Q3Q2Q1Q0按加法规律计数⑤减计数:MR=0, PL(———)=1,CPu=1,CPd= CP,Q3Q2Q1Q0按减法规律计数。
EDA技术基础实验报告实验名称:含异步清0和同步时钟使能的十进制加法法计数器姓名:李江虹学号:068专业及班级:通信工程(3)班指导老师:刘文进实验三含异步清0和同步时钟使能的十进制加法法计数器一、实验目的:学习时序电路的设计、仿真和硬件测试,进一步熟悉VHDL设计技术。
二、实验原理实验图1是一含计数使能、异步复位十进制加法计数器,例1是其VHDL描述。
由实验图1所示,图中间是4位锁存器;rst是异步清信号,高电平有效;clk是锁存信号;D[3..0]是4位数据输入端。
当ENA为'1'时,多路选择器将加1器的输出值加载于锁存器的数据端;当ENA为'0'时将"0000"加载于锁存器。
图1 含计数使能、异步复位十进制加法计数器三、实验内容在MAX+plusII上参照例1(4位二进制计数器)进行设计、编辑、编译、综合、适配、仿真。
说明例中各语句的作用,详细描述示例的功能特点,给出其所有信号的时序仿真波形。
【例1】LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT4B ISPORT (CLK : IN STD_LOGIC;RST : IN STD_LOGIC;LOAD : IN STD_LOGIC;DATA :IN STD_LOGIC_VECTOR(3 DOWNTO 0);OUTY : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);COUT : OUT STD_LOGIC );END CNT4B;ARCHITECTURE behav OF CNT4B ISSIGNAL CQI : STD_LOGIC_VECTOR(3 DOWNTO 0); BEGINP_REG: PROCESS(CLK, RST,LOAD)BEGINIF RST = '1' THEN CQI <="0000"; ELSIF CLK'EVENT AND CLK = '1' THEN IF LOAD = '1' THEN CQI <= DATA; ELSIF CQI>="1001"THENCQI<="0000";COUT <='1';ELSECQI<=CQI+1;COUT <='0';END IF;END IF;OUTY <= CQI ;END PROCESS P_REG ;END behav;四、引脚锁定以及硬件下载测试。
十进制计数器设计十进制计数器设计一、实验目的:熟悉Quartus II的Verilog 文本设计流程全过程,学习十进制计数器的设计、仿真,掌握计数器的工作原理。
二、实验原理:计数器属于时序电路的范畴,其应用十分普遍。
该程序设计是要实现带有异步复位、同步计数使能和可预置型的十进制计数器。
该计数器具有5个输入端口(CLK、RST、EN、LOAD、DATA)。
CLK输入时钟信号;RST起异步复位作用,RST=0,复位;EN是时钟使能,EN=1,允许加载或计数;LOAD是数据加载控制,LOAD=0,向内部寄存器加载数据;DATA是4位并行加载的数据。
有两个输出端口(DOUT和COUT)。
DOUT的位宽为4,输出计数值,从0到9;COUT是输出进位标志,位宽为1,每当DOUT为9时输出一个高电平脉冲。
RST在任意时刻有效时,如CLK非上升沿时,计数也能即刻清0;当EN=1,且在时钟CLK的上升沿时刻LOAD=0,4位输入数据DATA被加载,但如果此时时钟没有上升沿,尽管出现了加载信号LOAD=0,依然未出现加载情况;当EN=1,RST=1,LOAD=1时,计数正常进行,在计数数据等于9时进行输出高电平。
三、实验任务:在Quartus II上将设计好的程序进行编辑、编译、综合、适配、仿真,从时序仿真图中学习计数器工作原理,了解计数器的运行情况及时钟输入至计数器数据输出的延时情况。
四、实验步骤:(一)、建立工作库文件和编辑设计文件任何一项设计都是一项Project(工程),而把一个工程下的所有文件放在一个文件夹内是一个非常好的习惯,以便于我们整理,利用和提取不同工程下的文件,而此文件夹将被EDA软件默认为Work Library(工作库),所以第一步先根据自己的习惯,建立个新的文件夹。
(1)新建文件夹:在盘建立并保存工程,将文件夹取名Jishuqi。
(2)输入源程序:打开Quartus II,选择菜单File→New→Design Files→VerilogHDL File→OK(如图1所示)。
74LS160 芯片同步十进制计数器(直接清零)·用于快速计数的内部超前进位·用于n 位级联的进位输出·同步可编程序·有置数控制线·二极管箝位输入·直接清零·同步计数本电路是由4 个主从触发器和用作除2计数器及计数周期长度为除5的3位2进制计数器所用的附加选通所组成。
有选通的零复位和置9输入。
为了利用本计数器的最大计数长度(十进制),可将B输入同QA 输出连接,输入计数脉冲可加到输入A上,此时输出就如相应的功能表上所要求的那样。
LS90可以获得对称的十分频计数,办法是将QD 输出接到A输入端,并把输入计数脉冲加到B输入端,在QA输出端处产生对称的十分频方波。
74160引脚图交流波形图:图1 时钟到输出延迟计数图2 主复位输出延迟,主复位时钟频率,脉冲宽度脉冲宽度,和主复位恢复时间状态图VHDL十进制计数器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity count10 isport (clk:in std_logic;f:buffer integer range 0 to 15;cout:out std_logic);end;architecture aa of count10 isbeginprocess(clk)beginif falling_edge(clk) thenif f=9 thenf<=0;cout<='1';elsef<=f+1;end if;elsenull;end if;end process;end;十进制计数器VHDLlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;--**************实体*****************entity shijinzhi isport(clk: in std_logic;reset: in std_logic;s : out std_logic_vector(5 downto 0);out1: out std_logic_vector(7 downto 0));end shijinzhi;--*****************结构体***********************architecture one of shijinzhi issignal clk_500 : std_logic;--扫描时钟signal clk_1 : std_logic;--1s时钟begin--*************500Hz分频程序********************process(clk)variable cnt1 : integer range 0 to 200;variable cnt2 : integer range 0 to 250;beginif clk'event and clk='1' thenif cnt1=200 thencnt1:=0;if cnt2=250 thencnt2:=0;clk_500<=not clk_500;elsecnt2:=cnt2+1;end if;elsecnt1:=cnt1+1;end if;end if;end process;--***********1Hz分频程序和扫描信号产生********************process(clk_500)variable cnt3 : integer range 0 to 250;beginif clk_500'event and clk_500='1' thenif cnt3=250 thencnt3:=0;clk_1<=not clk_1;elsecnt3:=cnt3+1;end if;end if;end process;--****************************************process(clk_1,reset)variable count1:integer range 0 to 9;beginif reset='0' then count1:=0;elsif clk_1'event and clk_1='1' thenif count1=9 thencount1:=0;elsecount1:=count1+1;end if;end if;if clk_500='1' thencase count1 isWHEN 0 =>s<="111110";out1<="10111111";WHEN 1 =>s<="111110";out1<="10000110";WHEN 2 =>s<="111110";out1<="11011011";WHEN 3 =>s<="111110";out1<="11001111";WHEN 4 =>s<="111110";out1<="11100110";WHEN 5 =>s<="111110";out1<="11101101";WHEN 6 =>s<="111110";out1<="11111101";WHEN 7 =>s<="111110";out1<="10000111";WHEN 8 =>s<="111110";out1<="11111111"; WHEN 9 =>s<="111110";out1<="11101111";when others=>out1<="00000000";end case;end if;end process;end one;。
EDA技术期末复习题1.结构体中包含了四类功能描述语句:语句、______________语句、子程序调用语句和语句。
(P304)2. 下列关于程序包的用法正确的是: ________ (P319)A、一个程序包中只能包含常数说明,VHDL数据类型说明,元件定义和子程序这几种结构之一或他们中的几种B、程序包首可以独立定义和使用C、程序包结构中,必须同时含有程序包首和程序包体D、一个完整的程序包中,程序包首名和程序包体名可以不是同一个名字3. 参数传递说明语句以关键词引导一个类属参量表,通常在实体中的位置处于语句之前。
(P300-301)4. 下列逻辑操作符中哪个的优先级最高:_______。
A. ANDB. ORC. NOTD. XOR5. 下列关于操作符说法不正确的是:_______ (P333)A、关系操作符的操作对象可以是VHDL中的任何数据类型构成的操作数B、关系操作符的返回值是布尔类型数据C、MOD和REM的操作数数据类型只能是整数,运算操作结果也是整数。
D、SLL是左移位操作,右边跟进的位补零6. 下列说法正确的是: _______。
(P332)A、只有BIT型和整型数据可以参与加减运算。
B、操作符是有优先级别的,其中逻辑运算符的级别最低。
C、BIT 、BOOLEAN和STD_LOGIC可以进行逻辑运算D、a nand b nand c 这串运算可以不加括号7. 下列语句中,不属于并行语句的是:________A、进程语句B、CASE语句C、元件例化语句D、WHEN…ELSE…语句8. 下列语句中,不属于顺序语句的是:_______。
A. WHEN…ELSE…语句B. IF语句C. LOOP语句D. CASE语句9. 以下关于VHDL中常量的声明正确的是________A、Constant Width :Integer=8;B、Constant Width :Integer := 8;C、Variable Width :Integer = 8;D、Variable Width :Integer := 8;10. 下列哪个库需要在VHDL程序中明确打开并指定________A、STDB、IEEEC、WORKD、自定义库11. VHDL中最为常用的是库。
74ls160十进制计数器原理
74LS160十进制计数器原理74LS160是一种常用的十进制计数器,它能够实现0至9的循环计数。
它的原理基于二进制计数和锁存器的结合。
该计数器由四个D触发器组成,每个触发器都能存储一个二进制位。
在计数过程中,每当一个触发器的输出从低电平变为高电平时,它会向高位触发器传递一个脉冲信号。
这样,当最低位的触发器计数到9时,它会向高位触发器传递一个脉冲信号,使得高位触发器加1,而最低位触发器归零。
为了实现循环计数,74LS160还包含一个复位功能。
当外部信号复位输入为低电平时,所有触发器的输出都会被清零,计数器重新从0开始计数。
除了计数功能,74LS160还具有一个使能输入。
当使能输入为低电平时,计数器将会被禁用,不再进行计数。
这个功能可以用于控制计数器的启动和停止。
总结起来,74LS160十进制计数器通过二进制计数和锁存器的结合,实现了0至9的循环计数。
它具有复位和使能功能,可以灵活控制计数器的启动和停止。
这使得它在很多应用中都有广泛的使用,如时钟、计时器、频率分析等。
一、实验目的0
1、熟悉Quartus II界面及应用;0
2、设计有时钟使能的两位十进制计数器原理图输入。
0
二、实验设备:0
名称规格数量0
计算机586及以上1台0
Quartus II软件 6.0以上0
三、实验内容0
设计一个有时钟使能的两位十进制计数器原理图输入0
1.设计电路原理图0
建立图形编辑环境,然后分别键入74390、AND4、AND2、NOT、INPUT和OUTPUT元件,连接好电路原理图,结果如图1所示,完成之后保存编译综合结果如图1所示。
0
图1含有时钟使能的2位十进制计数器0
编译结果如下图20
图22位十进制计数器的综合编译结果0
2.建立工程0
为了测试图1电路的功能,可以将conter10.bdf设置成工程,工程名和顶层文件名都取为conter10。
0
3.波形仿真0
完成设计即可对电路的功能进行测试,设置各项参数后,仿真波形如图3所示。
由图可见,电路的功能符合设计要求。
0
图30
图4波形0
四、实验小结0。
10进制加减计数器状态机的VHDL设计一、【设计目的】学习并掌握Quartus II 开发系统的基本操作。
掌握用Quartus II进行文本输入法进行电路设计、编译和仿真方法。
掌握CPLD/FPGA的开发流程。
掌握EDA实验开发系统的使用。
掌握状态机的原理。
掌握简单状态机的VHDL设计方法掌握计数器的设计方法。
掌握带有复位和和时钟使能的10进制计数器的原理。
掌握通用计数器的设计方法。
学习使用VHDL进行时序逻辑电路的设计。
学习利用真值表编写VHDL程序。
学习掌握7段数码显示译码器设计的原理。
掌握VHDL语言方式设计7段数码显示译码器。
学习掌握8位数码管动态扫描显示电路的原理。
掌握VHDL语言设计8位数码管动态扫描显示电路学习VHDL语言设计较复杂的电路方法。
二、【设计任务】设计要求用VHDL语言设计一个状态机,要求具有以下状态和功能中的四种或者四种以上:A.复位功能B.8、10或者16进制加法计数C.8、10或者16进制减法计数D.数码管以任何方式闪动E.8个LED灯以任何方式闪动F.蜂鸣器发声或者播放一段音乐G.并用两位数码管将结果显示出来本次设计选用的功能状态为:A.复位功能B.十进制加法计数C.十进制减法计数D.数码管闪动E.8个led灯闪动F.并用两位数码管将结果显示出来功能实现说明Clk为50MHz的时钟信号输入;rst为复位控制按键(低电平有效);en(0-2)通过三个按键分别控制3种状态(低电平有效)。
1.当en(0)=`0`时,启动加法计数并将结果动态显示到两位数码管上,同时另外的两位数码管的6段以相反方向按顺序闪烁2.当en(1)=`0`时,启动减法计数并将结果动态显示到两位数码管上,同时另外的两位数码管的6段以相反方向按顺序闪烁,闪烁方向与加法的相反;3.当en(2)=`0`时,启动LED闪烁功能,LED灯按顺序逐个流水闪动;4.当rst=`0`时,复位清零;三、【设计代码】library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;-----------------------------------------------------------------------------ENTITY cnt16 ISPORT (clk : IN std_logic; --50MHz时钟信号输入rst : IN std_logic; ---复位功能输入en : IN std_logic_vector(2 DOWNTO 0); ---状态选择输入led8 : OUT std_logic_vector(7 DOWNTO 0); --各段数据输出com8 : OUT std_logic_vector(7 DOWNTO 0)); ---各位数据输出END cnt16;-----------------------*****对各个信号进行定义****------------------------------------- ARCHITECTURE arch OF cnt16 ISsignal cnt : std_logic_vector(25 downto 0 );signal data : std_logic_vector(3 downto 0);signal led8_xhdl : std_logic_vector(7 downto 0);signal com8_xhdl : std_logic_vector(7 downto 0);signal coud1 : std_logic_vector(3 downto 0);signal coud2 : std_logic_vector(3 downto 0);signal s1 : std_logic;signal s2 : std_logic;signal s3 : std_logic;signal coud : std_logic_vector(3 downto 0);signal first : std_logic_vector(3 downto 0); --0000signal second : std_logic_vector(3 downto 0); --0000 0000 0000 1001 signal jinwei: std_logic;------------------------------------------------------------------------------------------------------------- beginled8<=led8_xhdl;com8<=com8_xhdl;----------------------- *****状态控制部分*************--------------------------------------------- process(en)beginif en="110"then ----状态控制,低电平有效s1<='1';s2<='0';s3<='0';else if en="101"thens2<='1';s1<='0';s3<='0';else if en="011"thens3<='1';s1<='0';s2<='0';end if;end if;end if;end process;-------------------------------------------------------------------------------------------------------------------------------**********时钟分频部分********----------------------------------process(clk,rst)beginif(rst='0')thencnt<="00000000000000000000000000";elsif(clk'event and clk='1')thencnt<=cnt+1; -----来一个时钟信号cnt加1end if;end process;----------------------------------------------------------------------------------------------------------------------*****-加减计数器的个位-*******------------------------------- process(cnt(24),rst,s1,s2)beginif(rst='0')thenfirst<="0000";jinwei<='0';elsif(cnt(24)'event and cnt(24)='1')then ---每隔(1/50)*48=0.96s计数一次if (s1='1')thenif(first="1001")then ---10进制计数first<="0000";jinwei<='1';elsejinwei<='0';first<=first+1; ---加法计数end if;else if(s2='1')thenif(first="0000")thenfirst<="1001";jinwei<='1';elsejinwei<='0';first<=first-1; ---减法计数end if;end if;end if;end if;end process;-------------------------------------------------------------------------------------------------------------------*********-加减计数器的十位*******-------------------------- process(jinwei,rst,s1,s2)beginif(rst='0')thensecond<="0000";elsif(jinwei'event and jinwei='1')then ---每来1个位产生的进位信号则十位加(减)1if (s1='1')thenif(second="1001")thensecond<="0000";elsesecond<=second+1;end if;else if(s2='1')thenif(second="0000")thensecond<="1001";elsesecond<=second-1;end if;end if;end if;end if;end process;------------------------------------------------------------------------------------------------------------------------------------------------*****闪动数码管的计数***--------------------------------------- process(cnt(23),rst,s1,s2)beginif(rst='0')thencoud<="0000";else if(cnt(23)'event and cnt(23)='1')then ----每隔(1/50)*46=0.92s计数一次if(s1='1')thenif(coud="0101")thencoud<="0000";elsecoud<=coud+1;end if;else if(s2='1')thenif(coud="0000")thencoud<="0101";elsecoud<=coud-1;end if;end if;end if;end if;end if;end process;--------------------------------------------------------------------------------------------------------------------------***码变换****---------------------------------------------process(coud,rst)begincase coud iswhen"0000" => coud1<="1010";coud2<="1010";when"0001" => coud1<="1011";coud2<="1111";when"0010" => coud1<="1100";coud2<="1110";when"0011" => coud1<="1101";coud2<="1101";when"0100" => coud1<="1110";coud2<="1100";when"0101" => coud1<="1111";coud2<="1011";when others => coud1<="0000";coud2<="0000";end case;end process;--------------------------------------------------------------------------------------------****************显示部分***************--process(rst,s1,s2,s3,cnt(17 downto 16),cnt(25 downto 23))beginif(rst='0')thencom8_xhdl<="11110000";led8_xhdl <= "00000000";else if s1='1'or s2='1'then ----计数以及数码管闪动部分的扫描case cnt(17 downto 16) iswhen"10" => com8_xhdl<="11111110";data<=first;when"01" => com8_xhdl<="11111101";data<=second;when"00" => com8_xhdl<="01111111";data<=coud1;when"11" => com8_xhdl<="10111111";data<=coud2;end case;case data isWHEN "0000" =>led8_xhdl <= "00111111"; --0WHEN "0001" =>led8_xhdl <= "00000110"; --1WHEN "0010" =>led8_xhdl <= "01011011"; --2WHEN "0011" =>led8_xhdl <= "01001111"; --3WHEN "0100" =>led8_xhdl <= "01100110"; --4WHEN "0101" =>led8_xhdl <= "01101101"; --5WHEN "0110" =>led8_xhdl <= "01111101"; --6WHEN "0111" =>led8_xhdl <= "00000111"; --7WHEN "1000" =>led8_xhdl <= "01111111"; --8WHEN "1001" =>led8_xhdl <= "01101111"; --9WHEN "1010" =>led8_xhdl <= "00000001";WHEN "1011" =>led8_xhdl <= "00000010";WHEN "1100" =>led8_xhdl <= "00000100";WHEN "1101" =>led8_xhdl <= "00001000";WHEN "1110" =>led8_xhdl <= "00010000";WHEN "1111" =>led8_xhdl <= "00100000";WHEN OTHERS =>led8_xhdl <= "00000011";END CASE;else if s3='1'then ----8个LED灯闪动的扫描,闪动周期为0.92s-1s case cnt(25 downto 23) iswhen"000" => com8_xhdl<="11111110";led8_xhdl<="10000000" ;when"001" => com8_xhdl<="11111101";led8_xhdl<="10000000" ;when"010" => com8_xhdl<="11111011";led8_xhdl<="10000000" ;when"011" => com8_xhdl<="11110111";led8_xhdl<="10000000" ;when"100" => com8_xhdl<="11101111";led8_xhdl<="10000000" ;when"101" => com8_xhdl<="11011111";led8_xhdl<="10000000" ;when"110" => com8_xhdl<="10111111";led8_xhdl<="10000000" ;when"111" => com8_xhdl<="01111111";led8_xhdl<="10000000" ;end case;end if;end if;end if;end process;end arch;。
实验二:基于HDL十进制计数、显示系统设计一、实验目的:1.掌握基于语言的ISE设计全流程;2.熟悉、应用VerilogHDL描述数字电路;3.掌握基于Verilog的组合和时序逻辑电路的设计方法;4.具有数显输出的十进制计数器的设计。
二、实验原理:1.实验内容:设计具有异步复位,同步使能的十进制计数器,其计数结果可以通过七段数码,管发光二极管进行显示。
其系统原理图如下:2.十进制计数器模块端口信号说明:①输入信号:clk----计数器的时钟信号Clc——异步清零信号,当clc=1时,输出复位为0;当clc=0时,正常计数Ena——使能控制信号,当ena=1时,电路正常累加计数,否则电路不工作输出信号。
②输出信号:SUM[3:0]-------- 计数值的个位。
即,在CLK上升沿检测到SUM=9时,SUM将被置0,开始新一轮的计数。
COUT --------计数值的十位进位,即:只有在时钟CLK上升沿测到SUM=9时,COUT将被置1,其余情况下COUT=0;3.自顶向下的设计思路进行模块划分:整个系统要求设计的模块:十进制计数模块和数码管驱动模块,由于实验按键为实现按键防抖,所以在实验时候需要加入消抖模块:电源按键消抖:通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。
因而在闭合及断开的瞬间均伴随有一连串的抖动,为了产生这种现象而作的措施就是按键消抖。
三、实验过程:按照实验原理的设计思想,做出了以下设计代码:十进制计数器部分:module cnt10(clr,clk,ena,sum,cout);input clr,clk,ena;output[3:0] sum;output cout;reg[3:0] sum;reg cout;always @(posedge clk or posedge clr)beginif(clr)beginsum<=4'b0000;cout<=0;endelse if(ena)beginif(sum==4'b1001)beginsum<=4'b0000;cout <= 1;endelse if(sum<4'b1001)beginsum <= sum+4'b0001;cout<=0;endendendEndmodule数码管驱动模块代码:module led(out_y,sum);output [6:0] out_y;input[3:0] sum;reg [6:0] out_y;always @(sum)begincase(sum)4'b0000:out_y=7'b0111111;4'b0001:out_y=7'b0000110;4'b0010:out_y=7'b1011011;4'b0011:out_y=7'b1001111;4'b0100:out_y=7'b1100110;4'b0101:out_y=7'b1101101;4'b0110:out_y=7'b1111101;4'b0111:out_y=7'b0000111;4'b1000:out_y=7'b1111111;4'b1001:out_y=7'b1101111;default:out_y=7'b00000000;endcaseendendmodule消抖模块部分实验已经给出,最后综合模块代码:module int(clk_50,clk,rest,ena,out_y,cout );input clk_50,clk,rest,ena;output [6:0] out_y;output cout;wire [3:0] out;wire clk_out;wire [6:0] out_y;debounce_module u1(clk_50,rest,clk,clk_out); cnt10 u2(rest,clk_out,ena,out,cout);led u3(out_y,out);Endmodule根据实验要求综合:1.2.相应的引脚约束文件为:NET "clk" LOC = “V16” | PULLDOWN; NET "clk_50" LOC = "C9" ;NET "clr" LOC = "N17" ;NET "cout" LOC = "C11" ;NET "data_out<0>" LOC = "D5" ;NET "data_out<1>" LOC = "C5" ;NET "data_out<2>" LOC = "B6" ;NET "data_out<3>" LOC = "E7" ;NET "data_out<4>" LOC = "F7" ;NET "data_out<5>" LOC = "A4" ;NET "data_out<6>" LOC = "B4" ;NET "ena" LOC = "H18" ;NET "clk" CLOCK_DEDICATED_ROUTE=FALSE; 3.时序仿真为:十进制计数器仿真如下:最后例化后的结果为:思考题比较实验一与实验二的实验过程,说明原理图输入法与HDL输入法的不同的应用环境答:实验一中应用的是原理图完成十进制计数器的数显,工作量相对较大,需要绘制8张原理图,其中还不包括消抖模块。
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity cnt10 is
port(clk1,rst,en:in std_logic;
selin:in std_logic_vector(2 downto 0); selout:out std_logic_vector(7 downto 0);
led7s:out std_logic_vector(6 downto 0); cout:out std_logic);
end;
architecture one of cnt10 is
signal A: INTEGER RANGE 2 DOWNTO 0; signal cq:std_logic_vector(3 downto 0); signal clk2:std_logic;
begin
process(clk1)
begin
if clk1'event and clk1='1'then
if a<2 then a<=a+1;
else
a<=0; clk2 <= not clk2;
end if;
end if;
end process;
process(clk2,rst,en)
variable cqi:std_logic_vector(3 downto 0); begin
if rst='1' then
cqi:=(others=>'0');
elsif clk2'event and clk2='1'then
if en='1' then
if cqi<9 then
cqi:=cqi+1;
else
cqi:=(others=>'0');
end if;
end if;
end if;
if cqi=9 then
cout<='0';
else
cout<='1';
end if;
end process;
process(cq)
begin
case cq is
when"0000"=>led7s<="1000000"; when"0001"=>led7s<="1111001"; when"0010"=>led7s<="0100100"; when"0011"=>led7s<="0110000"; when"0100"=>led7s<="0011001"; when"0101"=>led7s<="0010010"; when"0110"=>led7s<="0000010"; when"0111"=>led7s<="1111000"; when"1000"=>led7s<="0000000"; when"1001"=>led7s<="0010000";
WHEN OTHERS=>NULL;
end case;end process;
process(selin)
begin
case selin is
when"000"=>selout<="00000001"; when"001"=>selout<="00000010"; when"010"=>selout<="00000100"; when"011"=>selout<="00001000"; when"100"=>selout<="00010000"; when"101"=>selout<="00100000"; when"110"=>selout<="01000000"; when"111"=>selout<="10000000"; WHEN OTHERS=>NULL;
end case;end process;
end;。