计数显示电路设计一设计要求设计输出为3位BCD码的计数显示电路。由三个模块构成:十进制计数器(BCD_CNT)、分时总线切换电路(SCAN)和七段显示译码器电路(DEC_LED)。BCD码计数电路从0计到9然后返回到0从新计数。3位BCD码计数器可以实现从0到999的十进制计数。要将计数过程用七段显示LED数码管显示出来,这里采用动态分时总线切换电路对数码管进行扫描,对数码管依次分时选中进行输出计数的个、十、百位的数据。框图如图1:4127显示扫描时钟计数时钟/分时总线切换十进制加法计数器七段显示译码/百十个七段译码显示器/七段显示电路SCANBCD_CNT图1二设计思路图2是源程序的RTL级电路图。整个设计分十进制计数器模块(BCD_CNT)、分时总线切换电路模块(SCAN)和七段显示译码器电路模块(DEC_LED)构成。总的输入为十进制计数器时钟clk,异步复位清零信号reset,分时总线切换电路时钟CL。在reset信号为0期间,在每个clk的上升沿计数器将加1。在每个cl的上升沿将会改变对三个数码管的扫描选通。总的输出为数码管选通信号sel(三位),输出到七段数码管的数据信号ledout(七位)。图2为了检验系统的正确与否,这里还添加了四个输出:十进制计数器输出c1(四位)、c2(四位)、c3(四位),分时总线切换电路一个输出q(四位),它是对计数器输出c1、c2、c3进行分时输出。分时选通个、十、百位的数码管并将相应要显示的数据输出到七段显示译码器电路(DEC_LED),由此实现数码管的动态扫描显示。三VHDL源代码(1)顶层模块:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entitytopisport(clk,reset:instd_logic;CL:instd_logic;c1,c2,c3:outstd_logic_vector(3downto0);ledout:outstd_logic_vector(6downto0);q:outstd_logic_vector(3downto0);sel:outstd_logic_vector(2downto0));endtop;architecturecontentoftopissignalc1_1,c2_1,c3_1:std_logic_vector(3downto0);signalq_1:std_logic_vector(3downto0);componentBCD_CNTisport(clk,reset:instd_logic;c1,c2,c3:outstd_logic_vector(3downto0));endcomponent;componentSCANisport(c1,c2,c3:instd_logic_vector(3downto0);CL:instd_logic;q:outstd_logic_vector(3downto0);sel:outstd_logic_vector(2downto0));endcomponent;componentDEC_LEDisport(q:instd_logic_vector(3downto0);ledout:outstd_logic_vector(6downto0));endcomponent;beginu1:BCD_CNTportmap(clk,reset,c1_1,c2_1,c3_1);u2:SCANportmap(c1_1,c2_1,c3_1,CL,q_1,sel);u3:DEC_LEDportmap(q_1,ledout);c1=c1_1;c2=c2_1;c3=c3_1;q=q_1;endcontent;(2)十进制计数器电路(BCD_CNT)模块:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entityBCD_CNTisport(clk,reset:instd_logic;c1,c2,c3:outstd_logic_vector(3downto0));endBCD_CNT;architecturecntofBCD_CNTissignalcn1,cn2,cn3:std_logic_vector(3downto0);begincnt1:process(clk,reset)beginif(reset='1')thencn1=0000;elsif(clk'eventandclk='1')thenif(cn19)thencn1=cn1+1;elsecn1=0000;endif;endif;endprocesscnt1;c1=cn1;cnt2:process(cn1(3),reset)beginif(reset='1')thencn2=0000;elsif(cn1(3)'eventandcn1(3)='0')thenif(cn29)thencn2=cn2+1;elsecn2=0000;endif;endif;endprocesscnt2;c2=cn2;cnt3:process(cn2(3),reset)beginif(reset='1')thencn3=0000;elsif(cn2(3)'eventandcn2(3)='0')thenif(cn39)thencn3=cn3+1;elsecn3=0000;endif;endif;endprocesscnt3;c3=cn3;endcnt;(3)分时总线切换电路(SCAN)模块:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entitySCANisport(c1,c2,c3:instd_logic_vector(3downto0);cl:instd_logic;q:outstd_logic_vector(3downto0);sel:outstd_logic_vector(2downto0);endSCAN;architectureoneofSCANissignalcnt:std_logic_vector(1downto0);signalq_temp:std_logic_vector(3downto0);signalsel_temp:std_logic_vector(2downto0);beginp1:process(cl)beginif(cl'eventandcl='1')thenif(cnt2)thencnt=cnt+1;elsecnt=00;endif;endif;endprocessp1;p2:process(cnt)begincasecntiswhen00=q_temp=c1;sel_temp=001;when01=q_temp=c2;sel_temp=010;when10=q_temp=c3;sel_temp=100;whenothers=null;endcase;endprocessp2;q=q_temp;sel=sel_temp;endone;(4)七段显示译码器电路(DEC_LED)模块:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entityDEC_LEDisport(q:instd_logic_vector(3downto0);ledout:outstd_logic_vector(6downto0));endDEC_LED;architectureoneofDEC_LEDisbeginprocess(q)--七段译码电路begincaseqiswhen0000=ledout=0111111;when0001=ledout=0000110;when0010=ledout=1011011;when0011=ledout=1001111;when0100=ledout=1100110;when0101=ledout=1101101;when0110=ledout=1111101;when0111=ledout=0000111;when1000=ledout=1111111;when1001=ledout=1101111;whenothers=null;endcase;endprocess;endone;四仿真结果图2是电路的总体输入输出仿真波形。图3五、结果分析由图3可以看出,当扫描频率CL很大的时候,sel从1、2、4变化,即在一个时刻,sel只有一位为高,计数器的输出只有一位C1或C2或C3选中,并且正确的输出。当复位信号reset先为高的时候清零,当变为低的时候随着clk上升沿到来计数器开始计数,从000~999,c1为个位,十位为c2,c3是百位。计数器为0时,ledout输出为十六进制3F(2进制0111111),为1时输出为为06H,等等,输出正确。