1、题目及内容要求题目:多功能计数器:内容要求:设计一个20进制多功能计数器,实现从0~19连续变化和0~38偶数变化的递增与递减功能,两位数码管显示计数值。
2、设计思路使用KHF—3型CPLD/FPGA实验开发系统,因为系统无法提供秒脉冲,故选用10MHz 的方波时钟源,对其进行分频,使之产生占空比为50%的1Hz的方波时钟源作为计数器的时钟输入。
将整个计数器分个三模块进行设计:1Hz方波时钟源模块(clkdiv)、可逆计数模块(CNT)和两位七段译码器模块(seg7),先将各模块的程序设计出来,编译并仿真通过后,用例化语句实现三个模块的连接,再进行编译与仿真,就能实现该多功能计数器的设计要求。
系统的逻辑功能可用下面的框图表示出来:系统方框图3、设计方案3.1、1Hz方波时钟源模块(clkdiv)选用10MHz的方波时钟源,对脉冲进行计时,当计满5M个时钟脉冲时,对输出端口进行取反,即可获得1Hz的时钟脉冲源。
脉冲的计算:100×100×100×5=5000000(5M)程序中clk为10MHz时钟信号输入端口,clk_div为分频时钟信号输出端口,clk与clk_div 都为一位二进制数。
因为软件与计算机功能限制,无法对其进行仿真与波形输出,只能通过在编译后,下载到器件上进行验证。
1Hz方波时钟源源程序及注释如下:LIBRARY IEEE;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY clkdiv ISPORT(clk:IN STD_LOGIC;clk_div:BUFFER STD_LOGIC );END ENTITY clkdiv;ARCHITECTURE one OF clkdiv ISSIGNAL clk_div2,clk_div4,clk_div6,clk_div7:STD_LOGIC_VECTOR(6 DOWNTO 0); BEGINPROCESS(clk)BEGINIF clk'EVENT AND clk='1'THENIF clk_div2="1100011" THEN clk_div2<=(OTHERS=>'0');ELSE clk_div2<=clk_div2+1;END IF; --计算100个脉冲;IF clk_div2="1100011" THEN clk_div4<=clk_div4+1;ELSIF clk_div4="1100011" THEN clk_div4<="0000000";END IF; --计算10000个脉冲;IF clk_div4="1100011" THEN clk_div6<=clk_div6+1;ELSIF clk_div6="1100011" THEN clk_div6<="0000000";END IF; --计算1000000个脉冲; IF clk_div6="1100011" THEN clk_div7<=clk_div7+1;ELSIF clk_div7="0000101" THEN clk_div7<="0000000"; --计算5000000个脉冲; clk_div<=NOT clk_div; --对输出进行取反; END IF;END IF;END PROCESS;END;3.2、可逆计数模块(CNT)将整个模块再分成四个单元模块:0~19递增单元模块、0~38递增单元模块、19~0递减单元模块和38~0递减单元模块,再设计一个控制端,利用不同的状态对四个单元模块进行选择,以实现四种计数的切换选择,实现多功能计数的要求。
在源程序中,将分频后的1Hz时钟源作为脉冲输入,sel为两位二进制输入使能端,有两个四位二进制数端出端口,其中data_out0为个位数输出,data_out1为十位数输出,利用IF 语句的嵌套对四种功能模块进行判断选择。
利用使能端sel的控制输出四种状态实现0~19连续变化递增模块、0~38偶数变化递增模块、19~0连续变化递减模块、38~0偶数变化递减模块的切换选择如下表所示:可逆计数模块(CNT)源程序及注释如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT ISPORT(clk_div_s:IN STD_LOGIC;sel:IN STD_LOGIC_VECTOR(1 DOWNTO 0);data_out0,data_out1 :BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0));END ENTITY CNT;ARCHITECTURE one OF CNT ISBEGINPROCESS(clk_div_s)BEGINIF clk_div_s'EVENT AND clk_div_s='1' THENIF sel="00" THEN --"00"时,选择0~19连续变化递增;IF data_out0<9 THEN data_out0<=data_out0+1;ELSE data_out0<="0000";IF data_out0="1001" AND data_out1<1 THEN data_out1<=data_out1+1;ELSE data_out1<="0000";END IF;END IF;ELSIF sel="01" THEN --"01"时,选择19~0连续变化递减; IF data_out0=0 THEN data_out0<="1001";IF data_out1=0 THEN data_out1<="0001";ELSE data_out1<=data_out1-1;END IF;ELSE data_out0<=data_out0-1;END IF;ELSIF sel="10" THEN --"10"时,选择偶数变化0~38递增;IF data_out0<8 THEN data_out0<=data_out0+2;ELSE data_out0<="0000";IF data_out0="1000" AND data_out1<3 THEN data_out1<=data_out1+1;ELSE data_out1<="0000";END IF;END IF;ELSE --"11"时,选择38~0偶数变化递减; IF data_out0=0 THEN data_out0<="1000";IF data_out1=0 THEN data_out1<="0011";ELSE data_out1<=data_out1-1;END IF;ELSE data_out0<=data_out0-2;END IF;END IF;END IF;END PROCESS;END;对源程序进行编译、仿真与波形输出:选择clk_div_s、sel、data_out0、data_out1四个端口,其中clk_div_s为时钟信号输入端口(为方便仿真与波形输出,取clk_div_s为周期10ns时钟信号信号输入),sel输入的四种状态(00、01、10、11)切换不同的计数功能,data_out0、data_out1作为数据输出,为方便验证,将data_out0、data_out1的数据数型设置为Unsigned Decimal,设置好之后即可进行仿真与波形输出,根据sel的不同状态可以得到如下四个仿真输出波形图:"00":0~19连续变化递增波形图"01":19~0连续变化递减波形图"10":0~38偶数变化递增波形图"11":38~0偶数变化递减波形图3.3、两位七段译码器模块(seg7)利用七段显示译码器将输入的8421BCD码译成数码管对应a~g七段显示信号,采用共阴极连接,则1对应的二极管亮,而0不亮。
程序中data_out_0为个位输入,data_out_1为十位输入,out0为个位输出,out1为十位输出,out0(0)~out0(6)对应数码管的a~g二极管,out1(0)~out1(6)对应数码管的a~g二极管。
两位七段译码器模块源程序及注释如下所示LIBRARY IEEE;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY seg7 ISPORT (data_out_0,data_out_1 :IN STD_LOGIC_VECTOR(3 DOWNTO 0);out0,out1 :OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END ENTITY seg7;ARCHITECTURE one OF seg7 ISBEGINWITH data_out_0 SELECTout0<="0111111" WHEN "0000", --显示0"0000110" WHEN "0001", --显示1"1011011" WHEN "0010", --显示2"1001111" WHEN "0011", --显示3"1100110" WHEN "0100", --显示4"1101101" WHEN "0101", --显示5"1111101" WHEN "0110", --显示6"0000111" WHEN "0111", --显示7"1111111" WHEN "1000", --显示8"1101111" WHEN "1001", --显示9"0000000" WHEN OTHERS; --不显示WITH data_out_1 SELECTout1<="0111111" WHEN "0000","0000110" WHEN "0001","1011011" WHEN "0010","1001111" WHEN "0011","1100110" WHEN "0100","1101101" WHEN "0101","1111101" WHEN "0110","0000111" WHEN "0111","1111111" WHEN "1000","1101111" WHEN "1001","0000000" WHEN OTHERS;END;对源程序进行编译、仿真与波形输出(以输出19和89两个数字为例):显示18的波形图显示89的波形图3.4、功能模块的连接(circuit)使用例化语句COMPONENT将1Hz方波时钟源模块(clkdiv)、可逆计数模块(CNT)和两位七段译码器模块(seg7)连接起来,实现多功能计数器的功能要求。