用verilog實現搶答器

iteye_8379發表於2010-12-23
[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]

相關文章