用verilog实现抢答器

[color=darkred][size=medium]此抢答器用异步时序电路实现。[/size][/color][size=medium]异步时序电路,顾名思义就是电路的工作节奏不一致,不存在单一的主控时钟,主要是用于产生地址译码器、FIFO和异步RAM的读写控制信号脉冲。除可以使用带时钟的触发器外,还可以使用不带时钟的触发器和延迟元件作为存储元件;电路状态的改变由外部输入的变化直接引起。由于异步电路没有统一的时钟,状态变化的时刻是不稳定的,通常输入信号只在电路处于稳定状态时才发生变化。也就是说一个时刻允许一个输入发生变化,以避免输入信号之间造成的竞争冒险。[/size]

对应的verilog代码为:
module QiangDaQi(emcee, actor_1, actor_2, actor_3, actor_4, num);
input emcee;
input actor_1;
input actor_2;
input actor_3;
input actor_4;
output [2:0] num;

reg [2:0] num = 0;
reg [3:0] flag = 0;
reg enable = 0;
reg cnt = 0;

always @(emcee or actor_1 or actor_2 or actor_3 or actor_4) begin
if(!emcee) begin
enable = 1'b1;
cnt = 1'b1;
end
else begin
enable = cnt && actor_1 && actor_2 && actor_3 && actor_4;
cnt = 0;
end
end

always @(negedge emcee or negedge actor_1) begin
if(!emcee) begin
flag[0] <= 0;
end
else begin
if(enable)
flag[0] <= 1;
else
flag[0] <= flag[0];
end
end

always @(negedge emcee or negedge actor_2) begin
if(!emcee) begin
flag[1] <= 0;
end
else begin
if(enable)
flag[1] <= 1;
else
flag[1] <= flag[1];
end
end

always @(negedge emcee or negedge actor_3) begin
if(!emcee) begin
flag[2] <= 0;
end
else begin
if(enable)
flag[2] <= 1;
else
flag[2] <= flag[2];
end
end

always @(negedge emcee or negedge actor_4) begin
if(!emcee) begin
flag[3] <= 0;
end
else begin
if(enable)
flag[3] <= 1;
else
flag[3] <= flag[3];
end
end

always @(flag) begin
case(flag)
4'b0000: num = 3'b000;
4'b0001: num = 3'b001;
4'b0010: num = 3'b010;
4'b0100: num = 3'b011;
4'b1000: num = 3'b100;
endcase
end

endmodule

功能仿真如图:

[img]http://dl.iteye.com/upload/attachment/374144/9be308c5-3940-38d3-8e57-6e22f42e1ad6.bmp[/img]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值