`
chrisongs
  • 浏览: 26012 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

用verilog实现抢答器

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

对应的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

功能仿真如图:


  • 大小: 6 KB
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics