/**********************************
(1)实现一四人抢答器,有人抢答成功后,其他人再抢答无效;
(2)通过蜂鸣器响1秒来提示抢答成功,并在数码管上显示抢答者的序号;
(3)主持人通过按键清除抢答信息,并开始 30 秒的答题倒计时,当倒计时
结束时,通过蜂鸣器响 1 秒来提示回答问题时间到,此时可以开始新一轮的抢答
************************************/
module qiangda(rst,clk,ina,inb,inc,ind,judge,clk_1hz,wei,duan,beep,wei1,duan1,clk_1khz)
input clk,clk_1hz
input ina,inb,inc,ind,judge
output[3:0] wei
output[7:0] duan
input rst,clk_1khz
output [3:0] wei1
output [7:0] duan1
output beep
reg[3:0] wei
reg[7:0] duan
reg flag
reg [5:0] shi,ge,data
reg [4:0] count
reg [3:0] wei1
reg [7:0] duan1
reg beep
reg yu
reg [1:0] count3
always @(posedge clk)
begin
if(!rst) //系统复位,个人认为复位不够完整
begin
yu = 0
end
if(!judge) //主持人控制按键
begin
flag=0 //允许抢答
wei=4'b1111 //数码管全不亮
//【个人认为分成duan1和duan,wei1和wei的数码管数据总线不经济】
duan=8'hff
yu=1 //重新开始倒计时
end
else
begin
if(ge==6'b000000&&shi==6'b000000) //处于等待状态,实际上是等主持人按键(!judge),
else
begin
if(!ina) //若a抢答
begin
if(!flag) //若无人抢答成功
begin
wei=4'b1101
duan=8'hf9 //数码管显示1,代表a抢答成功
flag=1 //抢答标志位有效
end
end
else if(!inb) //b抢答处理电路
begin
if(!flag)
begin
wei=4'b1101
duan=8'ha4 //数码管显示2,代表b抢答成功
flag=1
end
end
else if(!inc)
begin
if(!flag)
begin
wei=4'b1101
duan=8'hb0 //数码管显示3
flag=1
end
end
else if(!ind)
begin
if(!flag)
begin
wei=4'b1101
duan=8'h99 //数码管显示4
flag=1
end
end
end
end
end
always@(posedge clk_1hz or negedge rst)
begin
if(!rst)
begin
count = 0
end
else if(count >= 5'd30) //计时达到30秒,停止计时
count = count
else if(yu==1) //触发条件yu=1时,重新开始计数【那不是变成从30开始数?感觉该段有些问题】
count = count+5'b1
end
//以下always过程块为shi和ge的译码电路,完成倒计时功能
always @(count)
begin
if(count>=5'b10101) //count>20时
begin
shi = 5'b00000 //shi=0
ge = 5'b11110-count //ge = 30-count
end
else if(count>=5'b01011) //10<count<=20时
begin
shi=5'b00001 //shi=1
ge=5'b10100-count //ge = 20-count
end
else if(count>=5'b00001) //0<count<=10时
begin
shi=5'b00010 //shi=2
ge=5'b01010-count //ge = 10-count
end
else //其它情况,i.e. count = 0
begin
shi=5'b00011 //shi=3
ge=5'b0 //ge = 0
end
end
//以下always过程块为蜂鸣器发声驱动电路
always@(posedge clk_1hz)
if(flag|(shi==0&&ge==0)) //flag==1,有人抢答成功
//shi==0&&ge==0,倒计时结束
begin //上述两种情况下蜂鸣器响一秒
if(count3==2'b1)
begin
beep<=0
count3<=count3
end
else
begin
beep<=1
count3<=count3+2'b1
end
end
else
begin
beep<=0
count3<=0
end
//以下always过程块是数码管动态刷新电路,动态显示倒计时信息(shi和ge)
always @(clk_1khz)
begin
if(!rst)
wei1 = 4'b0000
else if(clk_1khz)
begin
wei1=4'b0111
data=ge
end
else
begin
wei1=4'b1011
data=shi
end
end
always @(data) //数字显示译码,共阳极数码管(duan1)
begin
case(data)
6'b000000: duan1=8'b1100_0000
6'b000001: duan1=8'b1111_1001
6'b000010: duan1=8'b1010_0100
6'b000011: duan1=8'b1011_0000
6'b000100: duan1=8'b1001_1001
6'b000101: duan1=8'b1001_0010
6'b000110: duan1=8'b1000_0010
6'b000111: duan1=8'b1111_1000
6'b001000: duan1=8'b1000_0000
6'b001001: duan1=8'b1001_0000
default:duan1=8'b1111_1111
endcase
end
endmodule
一设计任务
数字式竞赛抢答器
二设计条件
本设计基于学校实验室Multisim8.0仿真软件和计算机.
三设计要求
1、设计制作一个可容纳4组的数字式抢答器,每组设置一个抢答按钮供抢答者使用。
2、根据数字式抢答器的功能和使用步骤,设计抢答者的输入抢答锁定电路、抢答者序号编码、译码和显示电路。
3、设计定时电路,声、光报警或音乐片驱动电路。
4、设计控制逻辑电路,启动、复位电路。
我的设计内容
1.设计思想
根据设计的要求分块设计抢答、锁存、计时、显示、和报警功能。
(1)抢答和锁存电路要求能够对信号进行存储和所定,可用触发器组成。
(2)对于显示部分就直接用编码器、七段数码管驱动译码器和七段数码管组成。
(3)计时电路是按秒进行倒计时,所以计时电路可以减法计数器、秒脉冲生成电路、和显示电路。由于电路对秒脉冲信号的占空比要求的不高所以可以用555定时器构成多谐振荡电路来实现.
(4)报警电路,按题目要求可采用声、光报警,光报警用发光二极管电路实现声报警用蜂鸣器来实现。
各个模块设计好后要把各个模块组合起来进行调试,主要是解决题目中要求的多个锁定问题:
(1)抢答后抢答电路的锁定功能。
(2)抢答后计时器的锁定功能。
(3)计时结束后无人抢答时抢答电路的锁定功能。
(4)计时结束后无人抢答时计时器的锁定功能
抢答器是通过设计电路,以实现如字面上意思的能准确判断出抢答者的电器。在知识竞赛、文体娱乐活动(抢答赛活动)中,能准确、公正、直观地判断出抢答者的座位号。更好的促进各个团体的竞争意识,让选手门体验到战场般的压力感。
传统抢答器只是大概判断出抢答成功或犯规选手台号,无法显示出每个选手的抢答时间。而今抢答器可以通过数据来说明裁决结果的准确性、公平性。使比赛大大增加了娱乐性的同时,也更加公平、公正。新增无线抢答器更是抢答器史上的一大改革。
搭配全新升级版软件,采用嵌入式PPT设计,可支持三种格式题库导入(文本文档、WORD、Excel),15O道题导入只需20秒,导入的题目直接以PPT方式展现,可直接在展现页面进行题目再修改。此款软件还提供多种背景模板,供客户选择使用,点击任何一款即可自动导入到题目中。非常简单便捷。
LIBRARY IEEE
USE IEEE.STD_LOGIC_1164.ALL
USE IEEE.STD_LOGIC_UNSIGNED.ALL
ENTITY qdq IS
PORT ( a1,a2,a3,a4,rest,clk : IN STD_LOGIC
s1 : OUT STD_LOGIC
LED7S: OUT STD_LOGIC_VECTOR(6 DOWNTO 0) )
end
ARCHITECTURE one OF qdq IS
SIGNAL d: STD_LOGIC_VECTOR(3 DOWNTO 0)
SIGNAL f : STD_LOGIC
SIGNAL s2: STD_LOGIC_VECTOR(2 DOWNTO 0)
BEGIN
p1:PROCESS(a1,a2,a3,a4,rest,clk )
BEGIN
if(rest='1')then
f<='0' d<="0000"
elsif rising_edge(clk)then
if ((a1='1')or(d(3)='1'))and not((d(0)='1' )or( d(1)='1') or (d(2)='1')) then d(3)<='1'
end if
if ((a2='1')or(d(2)='1'))and not((d(0)='1') or (d(1)='1' )or (d(3)='1')) then d(2)<='1'
end if
if ((a3='1')or(d(1)='1'))and not((d(0)='1') or (d(2)='1')or (d(3)='1')) then d(1)<='1'
end if
if ((a4='1')or(d(0)='1'))and not((d(1)='1') or (d(2)='1') or( d(2)='1'))then d(0)<='1'
end if
f<=a1 or a2 or a3 or a4
end if
end process
s1<=f and clk
p2:PROCESS( d)
BEGIN
If d="1000" then LED7S <= "0000110"
elsIf d="0100" then LED7S <= "1011011"
elsIf d="0010" then LED7S <= "1001111"
elsIf d="0001" then LED7S <= "1100110"
Else LED7S <= "0111111"
end process
end one
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)