- 设计一个数字式竞赛抢答器,可以判断第一轮抢答者,并具备计分功能。
- 抢答器可以容纳4组参赛者同时抢答,每组设置1个按钮供抢答者使用。设置抢答器使能信号,当此信号有效时,若参赛者按下抢答开关,则抢答器能判断出第一抢答者并指示该组抢答成功,其他组参赛者的抢答者的抢答开关不起作用。若提前抢答,则对相应的参赛者发出报警。
- 系统具有清零功能。当清零复位信号有效时,抢答器对前一轮抢答的第一抢答者判断结果进行清零,恢复为初始状态。
- 数字式竞赛抢答器还具有计分功能。如果抢答成功的参赛者满足得分条件,则增加相应的分数,答错不扣分。
(二)系统设计方案根据系统设计要求可知,系统由4个主要的电路模块组成,分别是第一判断电路、计分电路、20s倒计时电路和显示电路。   其中,第一判断电路主要完成最快抢答者的判断功能;计分电路存储每组竞赛者的分数;显示电路则显示抢答器的状态和各组的分数。因此,数字式竞赛抢答器的输入信号包括复位信号CLR、抢答器使能信号EN_KEY_IN、4组参赛者的抢答按钮A_1/B_2/C_3/D_4以及加分信号ADD_1,加5分使能信号ADD_5_EN;输出信号包括4组参赛者抢答状态的显示LEDx(x表示参赛者编号)及其对应的得分SCOREX、抢答器抢答成功的组别显示,最先抢答组显示FIRST[3..0],提前抢答组显示FALSE[3..0],轮流输出各组号以及分数OUT_1,OUT_2,OUT_3等。系统框图如图所示:
1. 抢答器的工作流程如下:如果参赛者在抢答器使能信号EN有效前按下抢答按钮,报警信号FALSE[3..0]的对应位输出高电平,以示警告;当EN信号有效时,抢答器开始工作,将报警信号FALSE清零,A、B、C、D,4个抢答者谁先按下抢答按钮,则抢答成功,对应的显示灯LEDx亮起,并通过显示电路模块显示其参赛编FIRST[3..0];抢答成功的选手进入答题阶段,如正确回答问题,则加分信号ADD有效,计分模块给相应的参赛组加分,每个参赛组得分的个位、十位、百位分别通过信号OUT_BCD1[3..0]、OUT_BCD2[3..0]、OUT_BCD3[3..0]、显示。 如果复位信号CLR有效,使得抢答器在下一轮抢答前,其抢答成功的组别判断恢复为始状态,以便重新开始新一轮抢答。复位信号不改变竞赛者的现有得分。 2.流程图:(三)主要模块设计1.0 第一判断电路第一判断电路模块具有第一抢答信号的鉴别和锁存功能,其电路框图如图所示。 其中,CLR为复位信号,当该信号高电平有效时,电路无论处于何种状态都恢复为初始状态即所有的输出信号都为0;EN为抢答使能信号,该信号高电平有效;A、B、C、D为抢答按钮,高电平有效。  当使能信号EN为低电平时,如果有参赛者按下抢答按钮,则提前抢答报警信号FALSE[3.0]的对应位输出高电平,以示警告;当使能信号EN为高电平时,首先将提前抢答报警信号FALSE [3.0]复位清零,然后根据选手按下抢答按钮A、B、C、D的先后顺厅选择最先抢答的信号,其对应的抢答状态显示信号LEDA~LEDD输出高电平,抢答成功组别编号由信号Q[3..0]输出,并锁存抢答器此时的 状态,直到清零信号有效为止。在每一轮新的抢答之前,都要使用复位清零信号CLR,清除上一轮抢答对判断电路留下的使用痕迹,使电路恢复初始状态。
1.1 第一判断电路波形仿真图
2.0 计分电路  计分电路在参赛者抢答成功后,根据其比赛情况进行比较分数的调整,其电路框图如右图所示。该模块输入信号为加分信号ADD_1和组别选择信号CHOS[3.0]。 其中加分信号ADD_1高电平有效,有效时对组别选择信号CHOS[3..0]选择的参数组进行加分;组别选择输入信号CHOS[3..0]即第一判断电路模块的输出信号Q [3.0]。输出信号分别对应4组竞赛者的得分,以百分制表示。每组分数在比赛开始时预设为100分,每答对1题(即加分选择信号对相应参赛组有效)加1分,答错不扣分。得分的各位、十位、百位表示为宽为4的逻辑矢量,使之方便与显示电路级联,从而输出比赛得分。 当加5分使能信号ADD_5_EN为高电平时ADD每按一次加5分
2.1 计分电路波形仿真图
3.0 倒计时电路倒计时电路用来记录正常抢答开始后的时间,定时为20秒,在20秒内抢答有效,否则该题作废。其电路图如右图:
 其中,CLK_1Hz是时钟信号,频率为1Hz,用来计时,间隔为1秒;EN_IN是使能信号,高电平有效开始倒计时,ENDTIME输出信号,用来提示时间到,连接LED灯,当时间为0时输出高电平,led灯点亮。SEC_SHI[3..0]、SEC_GE[3..0]分别是倒计时的十位和各位,连接带译码器的数码管,用来显示倒计时的时间。
3.1 倒计时电路波形仿真图
4.0 显示电路  显示电路用来轮流显示各组的得分情况。由于实验箱数码管有限,所以采用了数码管分时复用的方法来显示各组的得分情况。其电路框图如右图:
显示电路中A2[3..0]、A1[3..0]、A0[3..0];B2[3..0]、B1[3..0]、B0[3..0];C2[3..0]、C1[3..0]、C0[3..0]。是各组分数的百位、十位、以及各位。OUT_BCD1[3..0]、OUT_BCD2[3..0]、OUT_BCD3[3..0]用来输出至带有译码器的数码管,用于分时显示各组号以及对应的分数。CLK_1Hz是输入的时钟信号,频率为1Hz,用来间隔1秒轮流显示。 其分时显示流程如下: 4.1 显示电路波形仿真
4.2显示电路分时显示各组分数流程图:
(四)系统整体原理图 上述VHDL源程序构成了一个具有抢答、计分、倒计时警报功能的数字系统,通过仿真生成的RTL电路如图所示:
图中,输出FALSE[3..0]、GE[3..0] 、SHI[3..0]、BAI[3..0] 、FIRST[3..0]、SMG_GE[3..0] 、SMG_SHI[3..0]还需要通过LED共阴极译码器译码显示为十进制数,译码显示电路部分在此略过。值得注意的是第一抢答判断电路模块的输出信号Q[3..0],它既是整个数字式抢答器输出的一部分,显示抢答成功的选手编号,又作为计分模块的输入信号,以它为依据对相应的选手进行加分操作。
(五)系统波形仿真第一抢答判断模块的仿真波形如下图所示。从图中可以看出,当清零复位信号CLR高电平有效时,电路状态立刻被恢复为全0的初始状态。在抢答使能信号无效时抢答,输出警告信号,提前抢答者对应的组号会用数码管输出,以示警告。 当抢答使能信号高电平有效时,最先抢答的选手对应的显示灯LEDx亮起,Q[3..0]输出抢答成功的选手编号。仿真结果与系统设计要求的功能相吻合。 输入信号CHOS[3.0]以十进制的形式表示,1,2,3,4,8分别代表选择AB、C、D4组选手在加分信号ADD_1的上升沿对选中的参赛者进行加分,从高至低依次为百位、十位、个位。 1
(七)模式选择根据实际情况,应选择:模式5. 选择理由:模式5带有译码器芯片,可以减少译码电路。带有对应的led灯以及数码管,便于显示对应的组号。同时模式5有8个键控高低电平发生器,可以满足抢答器电路的需求。 (八)引脚绑定
(九)试验箱测试图 【1】开始抢答。   【2】3号组抢答成功。  【3】进行加分,加5分。 【4】清零,准备下一次抢答。
(十)总结:于个人,通过这次设计,我进一步加深了对电子设计的了解。并进一步熟练了对QuartusII软件的操作,基本掌握了VHDL这门硬件编程语言。EDA也不像学习理论般那么空洞,有了更加贴切的了解及运用。做设计时,先查阅相关知识,把原理吃透,确定一个大的设计方向,在按照这个方向分模块的把要实现的功能用流程图的形式展示。最后参照每个模块把输入和输出引脚设定,运用我们所学的VHDL语言进行编程。总之,通过这次的设计,进一步了解了EDA技术,收获很大,对软件编程、排错调试、相关仪器设备的使用技能等方面得到较全面的锻炼和提高
- 程序:
- --顶层模块的VHDL
- LIBRARY IEEE;
- USE IEEE.STD_LOGIC_1164.ALL;
- ENTITY TOP_ENTITY IS
- PORT
- (
- CLK_IN_1Hz:IN STD_LOGIC;
- CLR:IN STD_LOGIC; --清零信号
- EN_KEY_IN:IN STD_LOGIC; --抢答开始信号 高电平有效
- A_1,B_2,C_3,D_4:IN STD_LOGIC;
- ADD_1:IN STD_LOGIC; --加分信号
- LEDA,LEDB,LEDC,LEDD,LED_ENDTIME:OUT STD_LOGIC;
- SEC_SHI:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
- SEC_GE:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
- FIRST:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
- FALSE:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
- OUT_1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --显示个位 十位 百位
- OUT_2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
- OUT_3:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
- );
- END ENTITY TOP_ENTITY;
- ARCHITECTURE RTL OF TOP_ENTITY IS
- COMPONENT OPT IS
- PORT (
- CLR:IN STD_LOGIC; --复位信号
- EN :IN STD_LOGIC; --抢答使能信号
- A,B,C,D:IN STD_LOGIC; --抢答按钮
- LEDA:OUT STD_LOGIC;
- LEDB:OUT STD_LOGIC;
- LEDC:OUT STD_LOGIC;
- LEDD:OUT STD_LOGIC;
- FALSE:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --提前抢答警报
- Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0) --抢答成功组显示
- );
- END COMPONENT OPT;
- COMPONENT COUNTER IS
- PORT
- (
- ADD_1:IN STD_LOGIC; --加分信号
- CHOS:IN STD_LOGIC_VECTOR(3 DOWNTO 0); --参赛组选择信号
- A2,A1,A0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --各组计分信号
- B2,B1,B0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
- C2,C1,C0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
- D2,D1,D0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
- );
- END COMPONENT COUNTER;
- COMPONENT OUTPUT IS --提前抢答警告
- PORT
- (
- DIN:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
- DOUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
- );
- END COMPONENT OUTPUT;
- COMPONENT endtime_20 IS
- PORT
- (
- CLK_1Hz :IN STD_LOGIC; --时钟信号
- EN_in :IN STD_LOGIC; --使能 计时开始
- SEC_SHI:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --秒各位 BCD 4位2进制输出
- SEC_GE:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --秒百位 BCD 4位2进制输出
- ENDTIME:OUT STD_LOGIC --时间到警报 接蜂鸣器
- );
- END COMPONENT endtime_20;
- COMPONENT DISPLAY IS
- PORT
- (
- CLK_1Hz:IN STD_LOGIC;
- A2,A1,A0:IN STD_LOGIC_VECTOR(3 DOWNTO 0); --各组计分信号
- B2,B1,B0:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
- C2,C1,C0:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
- D2,D1,D0:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
- OUT_BCD1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --输出个十百位
- OUT_BCD2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
- OUT_BCD3:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
- );
- END COMPONENT DISPLAY;
- SIGNAL Q:STD_LOGIC_VECTOR(3 DOWNTO 0);
- SIGNAL AA2,AA1,AA0:STD_LOGIC_VECTOR(3 DOWNTO 0);
- SIGNAL BB2,BB1,BB0:STD_LOGIC_VECTOR(3 DOWNTO 0);
- SIGNAL CC2,CC1,CC0:STD_LOGIC_VECTOR(3 DOWNTO 0);
- SIGNAL DD2,DD1,DD0:STD_LOGIC_VECTOR(3 DOWNTO 0);
- BEGIN
- U1:OPT PORT MAP(CLR,EN_KEY_IN,A_1,B_2,C_3,D_4,LEDA,LEDB,LEDC,LEDD,FALSE,Q);
- U2:COUNTER PORT MAP(ADD_1,Q,AA2,AA1,AA0,BB2,BB1,BB0,CC2,CC1,CC0,DD2,DD1,DD0);
- U3:OUTPUT PORT MAP(Q,FIRST);
- U4:DISPLAY PORT MAP(CLK_IN_1Hz,AA2,AA1,AA0,BB2,BB1,BB0,CC2,CC1,CC0,DD2,DD1,DD0,OUT_1,OUT_2,OUT_3);
- U5:endtime_20 PORT MAP(CLK_IN_1Hz,EN_KEY_IN,SEC_SHI,SEC_GE,LED_ENDTIME);
- END ARCHITECTURE RTL;
- --第一抢答判断 电路 的VHDL程序
- LIBRARY IEEE;
- USE IEEE.STD_LOGIC_1164.ALL;
- ENTITY OPT IS
- PORT (
- CLR:IN STD_LOGIC; --复位信号
- EN :IN STD_LOGIC; --抢答使能信号
- A,B,C,D:IN STD_LOGIC; --抢答按钮
- LEDA:OUT STD_LOGIC:='0'; --抢答成功 对应组的led灯点亮
- LEDB:OUT STD_LOGIC:='0';
- LEDC:OUT STD_LOGIC:='0';
- LEDD:OUT STD_LOGIC:='0';
- FALSE:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --提前抢答警报
- Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0) --抢答成功组显示
- );
- END ENTITY OPT;
- ARCHITECTURE RTL OF OPT IS
- SIGNAL TMP:STD_LOGIC_VECTOR(3 DOWNTO 0);
- SIGNAL TAG:STD_LOGIC;
- BEGIN
- TMP<=A&B&C&D;
- PROCESS(CLR,EN,A,B,C,D,TMP,TAG)
- BEGIN --设置锁存标志位
- IF CLR='1' THEN
- Q<="0000";
- LEDA<='0';
- LEDB<='0';
- LEDC<='0';
- LEDD<='0';
- FALSE<="0000";
- TAG<='0';
- ELSIF EN='0' THEN
- IF TAG='0' THEN
- IF A='1' THEN
- FALSE(0)<='1';
- END IF;
- IF B='1' THEN
- FALSE(1)<='1';
- END IF;
- IF C='1' THEN
- FALSE(2)<='1';
- END IF;
- IF D='1' THEN
- FALSE(3)<='1';
- END IF;
- END IF;
- ELSE
- FALSE<="0000";
- IF TAG='0' THEN
- IF TMP="1000" THEN
- LEDA<='1';
- LEDB<='0';
- LEDC<='0';
- LEDD<='0';
- Q<="0001";
- TAG<='1';
- ELSIF TMP="0100"THEN
- LEDA<='0';
- LEDB<='1';
- LEDC<='0';
- LEDD<='0';
- Q<="0010";
- TAG<='1';
- ELSIF TMP="0010"THEN
- LEDA<='0';
- LEDB<='0';
- LEDC<='1';
- LEDD<='0';
- Q<="0011";
- TAG<='1';
- ELSIF TMP="0001"THEN
- LEDA<='0';
- LEDB<='0';
- LEDC<='0';
- LEDD<='1';
- Q<="0100";
- TAG<='1';
- ELSE
- LEDA<='Z';
- LEDB<='Z';
- LEDC<='Z';
- LEDD<='Z';
- Q<="ZZZZ";
- END IF;
- END IF;
- END IF;
- END PROCESS;
- END RTL;
-
- --计分电路的VHDL程序 ADD_1 ADD_5
- LIBRARY IEEE;
- USE IEEE.STD_LOGIC_1164.ALL;
- USE IEEE.STD_LOGIC_UNSIGNED.ALL;
- USE IEEE.STD_LOGIC_ARITH.ALL;
- ENTITY ADD_1_5 IS
- PORT
- (
- ADD_5_EN,ADD:IN STD_LOGIC; --加分信号
- CHOS:IN STD_LOGIC_VECTOR(3 DOWNTO 0); --参赛组选择信号
- A2,A1,A0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0):="0000"; --各组计分信号
- B2,B1,B0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";
- C2,C1,C0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";
- D2,D1,D0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0):="0000"
- );
- END ENTITY ADD_1_5;
- ARCHITECTURE RTL OF ADD_1_5 IS
- BEGIN
- PROCESS(ADD,ADD_5_EN,CHOS)
- VARIABLE POINTS_A2,POINTS_A1,POINTS_A0:STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";
- VARIABLE POINTS_B2,POINTS_B1,POINTS_B0:STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";
- VARIABLE POINTS_C2,POINTS_C1,POINTS_C0:STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";
- VARIABLE POINTS_D2,POINTS_D1,POINTS_D0:STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";
- BEGIN
- IF ADD_5_EN='1' THEN
- IF ADD='1' AND ADD'EVENT THEN
- CASE CHOS IS
- WHEN "0001" => FOR I IN 0 TO 4 LOOP
- IF POINTS_A0="1001" THEN
- POINTS_A0:="0000";
- IF POINTS_A1="1001" THEN
- POINTS_A1:="0000";
- IF POINTS_A2="1001" THEN --十位分9
- POINTS_A2:="0000"; --十位清零
- ELSE
- POINTS_A2:=POINTS_A2+'1';
- END IF;
- ELSE
- POINTS_A1:=POINTS_A1+'1';
- END IF;
- ELSE
- POINTS_A0:=POINTS_A0+'1';
- END IF;
- END LOOP;
- WHEN "0010" => FOR I IN 0 TO 4 LOOP
- IF POINTS_B0="1001" THEN
- POINTS_B0:="0000";
- IF POINTS_B1="1001" THEN
- POINTS_B1:="0000";
- IF POINTS_B2="1001" THEN --十位分9
- POINTS_B2:="0000"; --十位清零
- ELSE
- POINTS_B2:=POINTS_B2+'1';
- END IF;
- ELSE
- POINTS_B1:=POINTS_B1+'1';
- END IF;
- ELSE
- POINTS_B0:=POINTS_B0+'1';
- END IF;
- END LOOP;
- WHEN "0011" => FOR I IN 0 TO 4 LOOP
- IF POINTS_C0="1001" THEN
- POINTS_C0:="0000";
- IF POINTS_C1="1001" THEN
- POINTS_C1:="0000";
- IF POINTS_C2="1001" THEN --十位分9
- POINTS_C2:="0000"; --十位清零
- ELSE
- POINTS_C2:=POINTS_C2+'1';
- END IF;
- ELSE
- POINTS_C1:=POINTS_C1+'1';
- END IF;
- ELSE
- POINTS_C0:=POINTS_C0+'1';
- END IF;
- END LOOP;
- WHEN "0100" => FOR I IN 0 TO 4 LOOP
- IF POINTS_D0="1001" THEN
- POINTS_D0:="0000";
- IF POINTS_D1="1001" THEN
- POINTS_D1:="0000";
- IF POINTS_D2="1001" THEN --十位分9
- POINTS_D2:="0000"; --十位清零
- ELSE
- POINTS_D2:=POINTS_D2+'1';
- END IF;
- ELSE
- POINTS_D1:=POINTS_D1+'1';
- END IF;
- ELSE
- POINTS_D0:=POINTS_D0+'1';
- END IF;
- END LOOP;
- WHEN OTHERS => NULL;
- END CASE;
- END IF;
- ELSE
- IF ADD='1' AND ADD'EVENT THEN
- CASE CHOS IS
- WHEN "0001" => IF POINTS_A0="1001" THEN
- POINTS_A0:="0000";
- IF POINTS_A1="1001" THEN
- POINTS_A1:="0000";
- IF POINTS_A2="1001" THEN --十位分9
- POINTS_A2:="0000"; --十位清零
- ELSE
- POINTS_A2:=POINTS_A2+'1';
- END IF;
- ELSE
- POINTS_A1:=POINTS_A1+'1';
- END IF;
- ELSE
- POINTS_A0:=POINTS_A0+'1';
- END IF;
- WHEN "0010" => IF POINTS_B0="1001" THEN
- POINTS_B0:="0000";
- IF POINTS_B1="1001" THEN
- POINTS_B1:="0000";
- IF POINTS_B2="1001" THEN --十位分9
- POINTS_B2:="0000"; --十位清零
- ELSE
- POINTS_B2:=POINTS_B2+'1';
- END IF;
- ELSE
- POINTS_B1:=POINTS_B1+'1';
- END IF;
- ELSE
- POINTS_B0:=POINTS_B0+'1';
- END IF;
- WHEN "0011" => IF POINTS_C0="1001" THEN
- POINTS_C0:="0000";
- IF POINTS_C1="1001" THEN
- POINTS_C1:="0000";
- IF POINTS_C2="1001" THEN --十位分9
- POINTS_C2:="0000"; --十位清零
- ELSE
- POINTS_C2:=POINTS_C2+'1';
- END IF;
- ELSE
- POINTS_C1:=POINTS_C1+'1';
- END IF;
- ELSE
- POINTS_C0:=POINTS_C0+'1';
- END IF;
- WHEN "0100" => IF POINTS_D0="1001" THEN
- POINTS_D0:="0000";
- IF POINTS_D1="1001" THEN
- POINTS_D1:="0000";
- IF POINTS_D2="1001" THEN --十位分9
- POINTS_D2:="0000"; --十位清零
- ELSE
- POINTS_D2:=POINTS_D2+'1';
- END IF;
- ELSE
- POINTS_D1:=POINTS_D1+'1';
- END IF;
- ELSE
- POINTS_D0:=POINTS_D0+'1';
- END IF;
- WHEN OTHERS => NULL;
- END CASE;
- END IF;
- END IF;
- A2<=POINTS_A2;A1<=POINTS_A1;A0<=POINTS_A0;
- B2<=POINTS_B2;B1<=POINTS_B1;B0<=POINTS_B0;
- C2<=POINTS_C2;C1<=POINTS_C1;C0<=POINTS_C0;
- D2<=POINTS_D2;D1<=POINTS_D1;D0<=POINTS_D0;
- END PROCESS;
- END RTL;
- --显示提前抢答组电路的VHDL程序
- LIBRARY IEEE;
- USE IEEE.STD_LOGIC_1164.ALL;
- ENTITY OUTPUT IS
- PORT
- (
- DIN:IN STD_LOGIC_VECTOR(3 DOWNTO 0); --输入提前抢答的组号
- DOUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0) --输出提前抢答的组号
- );
- END ENTITY OUTPUT;
- ARCHITECTURE RTL OF OUTPUT IS
- BEGIN
- PROCESS(DIN)
- BEGIN
- CASE DIN IS
- WHEN"0001"=>DOUT<="0001";
- WHEN"0010"=>DOUT<="0010";
- WHEN"0011"=>DOUT<="0011";
- WHEN"0100"=>DOUT<="0100";
- WHEN OTHERS=>DOUT<="0000";
- END CASE;
- END PROCESS;
- END RTL;
- --动态各组分数显示 轮流显示
- LIBRARY IEEE;
- USE IEEE.STD_LOGIC_1164.ALL;
- USE IEEE.STD_LOGIC_UNSIGNED.ALL;
- ENTITY DISPLAY IS
- PORT
- (
- CLK_1Hz:IN STD_LOGIC;
- A2,A1,A0:IN STD_LOGIC_VECTOR(3 DOWNTO 0); --各组计分信号
- B2,B1,B0:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
- C2,C1,C0:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
- D2,D1,D0:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
-
- OUT_BCD1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --输出个十百位
- OUT_BCD2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
- OUT_BCD3:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
- );
- END ENTITY DISPLAY;
- ARCHITECTURE BEHAVE OF DISPLAY IS
- SIGNAL FILG:STD_LOGIC_VECTOR(2 DOWNTO 0):="000";
- BEGIN
- PROCESS(CLK_1Hz,FILG)
- BEGIN
- IF CLK_1Hz'EVENT AND CLK_1Hz='1' THEN
- FILG<=FILG+'1';
- END IF;
-
- CASE FILG IS --动态循环显示
- WHEN "000" => OUT_BCD1<="0001"; --第一轮显示组号
- WHEN "001" => OUT_BCD1<=A0; --第二轮显示分数
- OUT_BCD2<=A1;
- OUT_BCD3<=A2;
-
- WHEN "010" => OUT_BCD1<="0010";
- WHEN "011" => OUT_BCD1<=B0;
- OUT_BCD2<=B1;
- OUT_BCD3<=B2;
-
- WHEN "100" => OUT_BCD1<="0011";
- WHEN "101" => OUT_BCD1<=C0;
- OUT_BCD2<=C1;
- OUT_BCD3<=C2;
-
- WHEN "110" => OUT_BCD1<="0100";
- WHEN "111" => OUT_BCD1<=D0;
- OUT_BCD2<=D1;
- OUT_BCD3<=D2;
- END CASE;
- END PROCESS;
- END ARCHITECTURE BEHAVE;
-
- --20秒倒计时 显示
- LIBRARY IEEE;
- USE IEEE.STD_LOGIC_1164.ALL;
- USE IEEE.STD_LOGIC_UNSIGNED.ALL;
- USE IEEE.STD_LOGIC_ARITH.ALL;
- ENTITY endtime_20 IS
- PORT
- (
- CLK_1Hz :IN STD_LOGIC; --时钟信号
- EN_IN :IN STD_LOGIC; --使能 计时开始
- SEC_SHI:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --秒各位 BCD 4位2进制输出
- SEC_GE:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --秒百位 BCD 4位2进制输出
- ENDTIME:OUT STD_LOGIC --时间到警报 接蜂鸣器
- );
- END ENTITY endtime_20 ;
- ARCHITECTURE BEHAVE OF endtime_20 IS
- SIGNAL CONTER_20:STD_LOGIC_VECTOR(4 DOWNTO 0):="00000";
- BEGIN
- PROCESS(CLK_1Hz,EN_IN)
- BEGIN
- IF EN_IN='1' THEN
- IF CLK_1Hz='1' AND CLK_1Hz'EVENT THEN
- CASE CONTER_20 IS
- WHEN "00000" =>SEC_SHI<="0010"; --20
- SEC_GE<="0000";
- CONTER_20<=CONTER_20+'1';
-
- ENDTIME<='0';
- WHEN "00001" =>SEC_GE<="1001";--19
- SEC_SHI<="0001";
- CONTER_20<=CONTER_20+'1';
-
- WHEN "00010" =>SEC_GE<="1000";--18
- SEC_SHI<="0001";
- CONTER_20<=CONTER_20+'1';
-
- WHEN "00011" =>SEC_GE<="0111";--17
- SEC_SHI<="0001";
- CONTER_20<=CONTER_20+'1';
-
- WHEN "00100" =>SEC_GE<="0110";--16
- SEC_SHI<="0001";
- CONTER_20<=CONTER_20+'1';
-
- WHEN "00101" =>SEC_GE<="0101";--15
- SEC_SHI<="0001";
- CONTER_20<=CONTER_20+'1';
-
- WHEN "00110" =>SEC_GE<="0100";--14
- SEC_SHI<="0001";
- CONTER_20<=CONTER_20+'1';
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
全部资料51hei下载地址:
END_DESITN_SECOND.rar
(3.36 MB, 下载次数: 54)
|