实验三至七ppt课件.ppt
实验三 设计含异步清0和同步时钟使能的加法计数器,(1) 实验目的:学习计数器的设计、仿真和硬件测试,进一步熟悉VHDL设计技术。(2) 实验原理:实验程序为例3-22,,(3) 实验内容1:在Quartus上对例3-22进行编辑、编译、综合、适配、仿真。说明例中各语句的作用,详细描述示例的功能特点,给出其所有信号的时序仿真波形。(4) 实验内容2:引脚锁定以及硬件下载测试,引脚锁定后进行编译、下载和硬件测试实验。将实验过程和实验结果写进实验报告。(5) 实验报告:将实验原理、设计过程、编译仿真波形和分析结果、硬件测试实验结果写进实验报告。,LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT10 IS PORT (CLK,RST,EN : IN STD_LOGIC; CQ : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); COUT : OUT STD_LOGIC ); END CNT10;ARCHITECTURE behav OF CNT10 ISBEGIN PROCESS(CLK, RST, EN) VARIABLE CQI : STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN IF RST = 1 THEN CQI := (OTHERS =0) ; -计数器异步复位 ELSIF CLKEVENT AND CLK=1 THEN -检测时钟上升沿 IF EN = 1 THEN -检测是否允许计数(同步使能) IF CQI 0); -大于9,计数值清零 END IF; END IF; END IF; IF CQI = 9 THEN COUT = 1; -计数大于9,输出进位信号 ELSE COUT = 0; END IF; CQ = CQI; -将计数值向端口输出 END PROCESS;END behav;,实验四、7段数码显示译码器设计,(1) 实验目的:学习7段数码显示译码器设计;学习VHDL的CASE语句应用及多层次设计方法。 (2) 实验原理:7段数码是纯组合电路,通常的小规模专用IC,如74或4000系列的器件只能作十进制BCD码译码,然而数字系统中的数据处理和运算都是2进制的,所以输出表达都是16进制的,为了满足16进制数的译码显示,最方便的方法就是利用译码程序在FPGA/CPLD中来实现。,【例5-18】 LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; ENTITY DECL7S IS PORT ( A : IN STD_LOGIC_VECTOR(3 DOWNTO 0); LED7S : OUT STD_LOGIC_VECTOR(6 DOWNTO 0) ) ; END ; ARCHITECTURE one OF DECL7S IS BEGIN PROCESS( A ) BEGIN CASE A IS WHEN 0000 = LED7S LED7S LED7S LED7S LED7S LED7S LED7S LED7S LED7S LED7S LED7S LED7S LED7S LED7S LED7S LED7S NULL ; END CASE ; END PROCESS ; END ;,图5-18共阴数码管及其电路,例5-18作为7段译码器,输出信号LED7S的7位分别接如图5-18数码管的7个段,高位在左,低位在右。例如当LED7S输出为“1101101”时,数码管的7个段:g、f、e、d、c、b、a分别接1、1、0、1、1、0、1;接有高电平的段发亮,于是数码管显示“5”。注意,这里没有考虑表示小数点的发光管,如果要考虑,需要增加段h,例5-18中的LED7S:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)应改为(7 DOWNTO 0) 。,图5-17 7段译码器仿真波形,(4) 实验内容2:引脚锁定及硬件测试。建议选GW48系统的实验电路模式6(参考附录图8),用数码8显示译码输出(PIO46-PIO40),键8、键7、键6和键5四位控制输入,硬件验证译码器的工作性能。,(5) 实验内容3:用第3章介绍的例化语句,按图5-19的方式连接成顶层设计电路(用VHDL表述),图中的CNT4B是一个4位二进制加法计数器,可以由例3-22修改获得;模块DECL7S即为例5-18实体元件,重复以上实验过程。注意图5-19中的tmp是4位总线,led是7位总线。对于引脚锁定和实验,建议选电路模式6,用数码8显示译码输出,用键3作为时钟输入(每按2次键为1个时钟脉冲),或直接接时钟信号clock0。,图5-19 计数器和译码器连接电路的顶层文件原理图,实验五 8位数码扫描显示电路设计,(1) 实验目的:学习硬件扫描显示电路的设计。(2) 实验原理:图5-20所示的是8位数码扫描显示电路,其中每个数码管的8个段:h、g、f、e、d、c、b、a(h是小数点)都分别连在一起,8个数码管分别由8个选通信号k1、k2、k8来选择。被选通的数码管显示数据,其余关闭。如在某一时刻,k3为高电平,其余选通信号为低电平,这时仅k3对应的数码管显示来自段信号端的数据,而其它7个数码管呈现关闭状态。根据这种电路状况,如果希望在8个数码管显示希望的数据,就必须使得8个选通信号k1、k2、k8分别被单独选通,并在此同时,在段信号输入口加上希望在该对应数码管上显示的数据,于是随着选通信号的扫变,就能实现扫描显示的目的。,图5-20所示的是8位数码扫描显示电路,其中每个数码管的8个段:h、g、f、e、d、c、b、a(h是小数点)都分别连在一起,8个数码管分别由8个选通信号k1、k2、k8来选择。被选通的数码管显示数据,其余关闭。如在某一时刻,k3为高电平,其余选通信号为低电平,这时仅k3对应的数码管显示来自段信号端的数据,而其它7个数码管呈现关闭状态。根据这种电路状况,如果希望在8个数码管显示希望的数据,就必须使得8个选通信号k1、k2、k8分别被单独选通,并在此同时,在段信号输入口加上希望在该对应数码管上显示的数据,于是随着选通信号的扫变,就能实现扫描显示的目的。,。,图5-20 8位数码扫描显示电路,【例5-19】LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY SCAN_LED IS PORT ( CLK : IN STD_LOGIC; SG : OUT STD_LOGIC_VECTOR(6 DOWNTO 0); -段控制信号输出 BT : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );-位控制信号输出 END;ARCHITECTURE one OF SCAN_LED IS SIGNAL CNT8 : STD_LOGIC_VECTOR(2 DOWNTO 0); SIGNAL A : INTEGER RANGE 0 TO 15;BEGINP1:PROCESS( CNT8 ) BEGIN CASE CNT8 IS WHEN 000 = BT BT BT BT BT BT BT BT NULL ;,END CASE ; END PROCESS P1; P2:PROCESS(CLK) BEGIN IF CLKEVENT AND CLK = 1 THEN CNT8 SG SG SG SG SG SG SG SG SG SG SG SG SG SG SG SG NULL ; END CASE ; END PROCESS P3; END;,例5-19是扫描显示的示例程序,其中clk是扫描时钟;SG为7段控制信号,由高位至低位分别接g、f、e、d、c、b、a 7个段;BT是位选控制信号,接图5-20中的8个选通信号:k1、k2、k8 。程序中CNT8是一个3位计数器,作扫描计数信号,由进程P2生成;进程P3是7段译码查表输出程序,与例5-18相同;进程P1是对8个数码管选通的扫描程序,例如当CNT8等于001 时,K2对应的数码管被选通,同时,A被赋值3,再由进程P3译码输出1001111,显示在数码管上即为“3”;当CNT8扫变时,将能在8个数码管上显示数据:13579BDF 。,(3) 实验内容1:说明例5-19中各语句的含义,以及该例的整体功能。对该例进行编辑、编译、综合、适配、仿真,给出仿真波形。实验方式:若考虑小数点,SG的8个段分别与PIO49、PIO48、PIO42(高位在左)、BT的8个位分别与PIO34、PIO35、PIO41(高位在左);电路模式不限,引脚图参考附录图12。将GW48EDA系统左下方的拨码开关全部向上拨,这时实验系统的8个数码管构成图5-20的电路结构,时钟CLK可选择clock0,通过跳线选择16384Hz信号。引脚锁定后进行编译、下载和硬件测试实验。将实验过程和实验结果写进实验报告。(4) 实验内容2:修改例5-19的进程P1中的显示数据直接给出的方式,增加8个4位锁存器,作为显示数据缓冲器,使得所有8个显示数据都必须来自缓冲器。缓冲器中的数据可以通过不同方式锁入,如来自A/D采样的数据、来自分时锁入的数据、来自串行方式输入的数据,或来自单片机等。,实验六 数字频率计的设计,1. 设计思路 图3是8位十进制数字频率计的电路逻辑图,它由一个测频控制信号发生器TESTCTL、8个有时钟使能的十进制计数器CNT10、一个32位锁存器REG32B组成。以下分别叙述频率计各逻辑模块的功能与设计方法。,图3 8位十进制数字频率计逻辑图,1) 测频控制信号发生器设计 频率测量的基本原理是计算每秒钟内待测信号的脉冲个数。这就要求TESTCTL的计数使能信号TSTEN能产生一个1秒脉宽的周期信号,并对频率计的每一计数器CNT10的ENA使能端进行同步控制。当TSTEN高电平时,允许计数;低电平时,停止计数,并保持其所计的数。在停止计数期间,首先需要一个锁存信号LOAD的上跳沿将计数器在前1秒钟的计数值锁存进32位锁存器REG32B中,并由外部的7段译码器译出并稳定显示。锁存信号之后,必须有一清零信号CLR_CNT对计数器进行清零,为下1秒钟的计数操作作准备。测频控制信号发生器的工作时序如图3所示。为了产生这个时序图,需首先建立一个由D触发器构成的二分频器,在每次时钟CLK上沿到来时其值翻转。,其中控制信号时钟CLK的频率取1 Hz,而信号TSTEN的脉宽恰好为1 s,可以用作闸门信号。此时,根据测频的时序要求,可得出信号LOAD和CLR_CNT的逻辑描述。由图6.6可见,在计数完成后,即计数使能信号TSTEN在1 s的高电平后,利用其反相值的上跳沿产生一个锁存信号LOAD,0.5 s后,CLR_CNT产生一个清零信号上跳沿。 高质量的测频控制信号发生器的设计十分重要,设计中要对其进行仔细的实时仿真(TIMING SIMULATION),防止可能产生的毛刺。,图3 测频控制信号发生器工作时序,2) 寄存器REG32B设计 设置锁存器的好处是,显示的数据稳定,不会由于周期性的清零信号而不断闪烁。若已有32位BCD码存在于此模块的输入口,在信号LOAD的上升沿后即被锁存到寄存器REG32B的内部,并由REG32B的输出端输出,然后由实验板上的7段译码器译成能在数码管上显示输出的相对应的数值。,3) 十进制计数器CNT10的设计 如图6.5所示,此十进制计数器的特殊之处是,有一时钟使能输入端ENA,用于锁定计数值。当高电平时计数允许,低电平时禁止计数。,2. VHDL源程序1) 有时钟使能的十进制计数器的源程序CNT10.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; -有时钟使能的十进制计数器ENTITY CNT10 ISPORT (CLK:IN STD_LOGIC; -计数时钟信号 CLR:IN STD_LOGIC; -清零信号 END:IN STD_LOGIC; -计数使能信号 CQ:OUT INTEGER RANGE 0 TO 15;-4位计数结果输出 CARRY_OUT:OUT STD_LOGIC); -计数进位 END CNT10;ARCHITECTURE ART OF CNT10 IS,SIGNAL CQI :INTEGER RANGE 0 TO 15;BEGIN PROCESS(CLK,CLR,ENA) BEGIN IF CLR= 1 THEN CQI= 0; -计数器异步清零 ELSIF CLKEVENT AND CLK= 1 THEN IF ENA= 1 THEN IF CQI9 THEN CQI=CQI+1; ELSE CQI=0;END IF; -等于9,则计数器清零 END IF; END IF; END PROCESS; PROCESS (CQI) BEGIN IF CQI=9 THEN CARRY_OUT= 1; -进位输出 ELSE CARRY_OUT= 0;END IF; END PROCESS; CQ=CQI;END ART;,2) 32位锁存器的源程序REG32B.VHDLIBRARY IEEE; -32位锁存器USE IEEE.STD_LOGIC_1164.ALL;ENTITY REG32B IS PORT(LOAD:IN STD_LOGIC; DIN:IN STD_LOGIC_VECTOR(31 DOWNTO 0); DOUT:OUT STD_LOGEC_VECTOR(31 DOWNTO 0);END REG32B;ARCHITECTURE ART OF REG32B IS BEGINPROCESS ( LOAD, DIN )BEGINIF LOAD EVENT AND LOAD= 1 THEN DOUT=DIN; -锁存输入数据 END IF ; END PROCESS;END ART;,3) 测频控制信号发生器的源程序TESTCTL.VHD LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; -测频控制信号发生器USE IEEE.STD_LOGIC_UNSIGNED.ALLENTITY TESTCTL IS PORT (CLK:IN STD_LOGIC; -1 Hz测频控制时钟 TSTEN:OUT STD_LOGIC; -计数器时钟使能 CLR_CNT:OUT STD_LOGIC; -计数器清零 LOAD:OUT STD_LOGIC); -输出锁存信号END TESTCTL;ARCHITECTURE ART OF TESTCTL IS SIGNAL Dvi2CLK :STD_LOGIC; BEGIN,PROCESS ( CLK )BEGINIF CLKEVENT AND CLK= 1 THEN -1 Hz时钟二分频Div2CLK=NOT Div2CLK;END IF ;END PROCESS;PROCESS ( CLK,Div2CLK )BEGIN IF CLK= 0 AND Div2CLK = 0 THEN -产生计数器清零信号 CLR_CNT= 1; ELSE CLR_CNT= 0 ; END IF; END PROCESS; LOAD=NOT Div2CLK; TSTEN=Div2CLK;END ART;,4) 数字频率计的源程序FREQ.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY FREQ IS PORT(FSIN:IN STD_LOGIC; CLK:IN STD_LOGIC; DOUT:OUT STD_LOGIC_VECTOR(31 DOWNTO 0);END FREQ;ARCHITECTURE ART OF FREQ ISCOMPONENT CNT10 -待调用的有时钟使能的十进制计数器端口定义 PORT(CLK,CLR,ENA:IN STD_LOGIC; CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); CARRY_OUT:OUT STD_LOGIC);,END COMPONENT;COMPONENT REG32B -待调用的32位锁存器端口定义 COMPONENT TESTCTL -待调用的测频控制信号发生器端口定义 SIGNAL TSTEN:STD_LOGIC; SIGNAL CLR_CNT:STD_LOGIC; SIGNAL LOAD:STD_LOGIC; SIGNAL CARRY1:STD_LOGIC; SIGNAL CARRY2:STD_LOGIC; SIGNAL CARRY3:STD_LOGIC; SIGNAL CARRY4:STD_LOGIC; SIGNAL CARRY5:STD_LOGIC; SIGNAL CARRY6:STD_LOGIC; SIGNAL CARRY7:STD_LOGIC; SIGNAL CARRY8:STD_LOGIC; SIGNAL DIN:STD_LOGIC_VECTOR(31 DOWNTO 0);,BEGINU0:TESTCTL PORT MAP(CLK=CLK,TSTEN=TSTEN, CLR_CNT=CLR_CNT,LOAD=LOAD);U1:CNT10 PORT MAP(CLK=FSIN,CLR=CLR_CNT,ENA=TSTEN, CQ=DIN (3 DOWNTO 0),CARRY_OUT=CARRY1);U2:CNT10 PORT MAP(CLK=CARRY1,CLR=CLR_CNT,ENA=TSTEN, CQ=DIN (7 DOWNTO 4),CARRY_OUT=CARRY2);U3:CNT10 PORT MAP(CLK=CARRY2,CLR=CLR_CNT,ENA=TSTEN, CQ=DIN (11 DOWNTO 8),CARRY_OUT=CARRY3);U4:CNT10 PORT MAP(CLK=CARRY3,CLR=CLR_CNT,ENA=TSTEN, CQ=DIN (15 DOWNTO 12),CARRY_OUT=CARRY4);U5:CNT10 PORT MAP(CLK=CARRY4,CLR=CLR_CNT,ENA=TSTEN,,CQ=DIN (19 DOWNTO 16),CARRY_OUT=CARRY5);U6:CNT10 PORT MAP(CLK=CARRY5,CLR=CLR_CNT,ENA=TSTEN, CQ=DIN (23 DOWNTO 20),CARRY_OUT=CARRY6);U7:CNT10 PORT MAP(CLK=CARRY6,CLR=CLR_CNT,ENA=TSTEN, CQ=DIN (27 DOWNTO 24),CARRY_OUT=CARRY7);U8:CNT10 PORT MAP(CLK=CARRY7,CLR=CLR_CNT,ENA=TSTEN, CQ=DIN (31 DOWNTO 28),CARRY_OUT=CARRY8);U9:REG32B PORT MAP(LOAD=LOAD,DIN=DIN(31 DOWNTO 0),DOUT=DOUT);END ART;,3. 硬件逻辑验证 选择实验电路结构图NO.0,由5.2节的实验电路结构图NO.0和图6.5确定引脚的锁定,测频控制器时钟信号CLK(1 Hz)可接CLOCK1,待测频FSIN可接CLOCK0,8位数码显示输出DOUT31.0接PIO47PIO16。 进行硬件验证时方法如下:选择实验模式0,测频控制器时钟信号CLK与CLOCK1信号组中的1 Hz信号相接,待测频FSIN与CLOCK0信号组中的某个信号相接,数码管应显示来自CLOCK0的频率。,实验七 秒 表 的 设 计,1设计思路 今需设计一个计时范围为0.01秒1小时的秒表,首先需要获得一个比较精确的计时基准信号,这里是周期为1/100 s的计时脉冲。其次,除了对每一计数器需设置清零信号输入外,还需在6个计数器设置时钟使能信号,即计时允许信号,以便作为秒表的计时起停控制开关。因此秒表可由1个分频器、4个十进制计数器 (1/100秒、1/10秒、1秒、1分)以及2个六进制计数器(10秒、10分)组成,如图4所示。6个计数器中的每一计数器的4位输出,通过外设的BCD译码器输出显示。图6.7中6个4位二进制计数输出的最小显示值分别为:DOUT3.01/100秒、DOUT7.41/10秒、DOUT11.81秒、DOUT15.1210秒、DOUT19.161分、DOUT23.2010分。,图4 秒表电路逻辑图,2. VHDL源程序1) 3 MHz100 Hz分频器的源程序CLKGEN.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY CLKGEN IS PORT (CLK:IN STD_LOGIC; -3 MHz信号输入 NEWCLK:OUT STD_LOGIC ); -100 Hz计时时钟信号输出END CLKGEN;ARCHITECTURE ART OF CLKGEN IS SIGNAL CNTER:INTEGER RANGE 0 TO 10#29999#;-十进制计数预制数 BEGIN PROCESS(CLK) -分频计数器,由3 MHz时钟产生100 Hz信号 BEGIN,IF CLKEVENT AND CLK=1 THEN IF CNTER=10#29999# THEN CNTER=0;-3 MHz信号变为100 Hz,计数常数为30 000 ELSE CNTER=CNTER+1; END IF; END IF;END PROCESS;PROCESS(CNTER) -计数溢出信号控制BEGIN IF CNTER=10#29999# THEN NEWCLK=1; ELSE NEWCLK=0; END IF; END PROCESS;END ART;,2) 六进制计数器的源程序CNT6.VHD(十进制计数器的源程序CNT10.VHD与此类似)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT6 ISPORT (CLK:IN STD_LOGIC; CLR:IN STD_LOGIC; ENA: IN STD_LOGIC; CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);,CARRY_OUT: OUT STD_LOGIC );END CNT6;ARCHITECTURE ART OF CNT6 ISSIGNAL CQI:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPROCESS(CLK,CLR,ENA)BEGIN IF CLR=1 THEN CQI=0000; ELSIF CLKEVENT AND CLK=1 THEN IF ENA=1 THEN IF CQI=“0101” THEN CQI=“0000”;,ELSE CQI=CQI+1;END IF; END IF; END IF; END PROCESS; PROCESS(CQI) BEGIN IF CQI=“0000” THEN CARRY_OUT=1; ELSE CARRY_OUT=0;END IF; END PROCESS; CQ=CQI;END ART;,3) 秒表的源程序TIMES.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY TIMES IS PORT(CLR:IN STD_LOGIC; CLK:IN STD_LOGIC; ENA:IN STD_LOGIC; DOUT:OUT STD_LOGIC_VECTOR(23 DOWNTO 0);END TIMES;ARCHITECTURE ART OF TIMES IS COMPONENT CLKGEN PORT(CLK:IN STD_LOGIC; NEWCLK:OUT STD_LOGIC);,END COMPONENT;COMPONENT CNT10 PORT(CLK,CLR,ENA:IN STD_LOGIC; CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); CARRY_OUT:OUT STD_LOGIC);END COMPONENT;COMPONENT CNT6 PORT(CLK,CLR,ENA:IN STD_LOGIC; CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); CARRY_OUT:OUT STD_LOGIC);END COMPONENT;,SIGNAL NEWCLK:STD_LOGIC; SIGNAL CARRY1:STD_LOGIC; SIGNAL CARRY2:STD_LOGIC; SIGNAL CARRY3:STD_LOGIC; SIGNAL CARRY4:STD_LOGIC; SIGNAL CARRY5:STD_LOGIC; BEGIN U0:CLKGEN PORT MAP(CLK=CLK,NEWCLK=NEWCLK); U1:CNT10 PORT MAP(CLK=NEWCLK,CLR=CLR,ENA=ENA, CQ=DOUT(3 DOWNTO 0),CARRY_OUT=CARRY1);,U2:CNT10 PORT MAP(CLK=CARRY1,CLR=CLR,ENA=ENA, CQ=DOUT(7 DOWNTO 4),CARRY_OUT=CARRY2); U3:CNT10 PORT MAP(CLK=CARRY2,CLR=CLR,ENA=ENA, CQ=DOUT(11 DOWNTO 8),CARRY_OUT=CARRY3); U4:CNT6 PORT MAP(CLK=CARRY3,CLR=CLR,ENA=ENA, CQ=DOUT(15 DOWNTO 12),CARRY_OUT=CARRY4); U5:CNT10 PORT MAP(CLK=CARRY4,CLR=CLR,ENA=ENA, CQ=DOUT(19 DOWNTO 16),CARRY_OUT=CARRY5); U6:CNT6 PORT MAP(CLK=CARRY5,CLR=CLR,ENA=ENA, CQ=DOUT(23 DOWNTO 20);END ART;,3. 硬件逻辑验证 选择实验电路结构图NO.0,由5.2节的实验电路结构图NO.0和图4确定引脚的锁定。时钟信号CLK可接CLOCK0,计数清零信号接键1,计数使能信号接键2,数码管16分别显示以1/100 s、1/10 s、1 s、10 s、1 min、10 min为计时基准的计数值。 进行硬件验证时方法如下:选择实验模式0,时钟信号CLK与CLOCK0信号组中的3 MHz信号相接,键1和键2分别为计数清零信号和计数使能信号,计数开始后时间显示在6个数码管上。,