下面是一個邊緣檢測器。
module edge_detector (
input wire clk,
input wire in,
output wire negedge_out
);
reg in_reg= 1'b0;
wire in_next = in;
assign negedge_out = ({in_reg,in) == 2'b10);
always @(posedge clk) in_reg <= in_next;
endmodule
下面介紹如何使用邊緣檢測器。
reg [8:0] LEDGValue = 0, LEDGValue_next;
wire key1_edge;
wire key2_edge;
edge_detector
key1_edge_detector_inst (
.clk(clk),
.in(KEY[1]),
.negedge_out(key1_edge)
);
edge_detector
key2_edge_detector_inst (
.clk(clk),
.in(KEY[2]),
.negedge_out(key2_edge)
);
always @* begin : combinational_logic
LEDGValue_next = LEDGValue;
if (key1_edge)
LEDGValue_next = {LEDGValue[7:0], 1'b1};
else if (key2_edge)
LEDGValue_next = {1'b0, LEDGValue[8:1]};
end
always @(posedge clk) begin : sequential_logic
LEDGValue <= LEDGValue_next;
end
的關鍵是,key1_edge
和key2_edge
信號僅用於單個時鐘週期斷言。
該代碼是非常有幫助的;它解決了這個問題。謝謝。 – Andrew 2012-01-21 21:01:55
因爲沒有時鐘,所以你所要做的就是所謂的異步邏輯。事實證明,FPGA設計的假設是所有邏輯都是同步的並將使用時鐘。在FPGA上實現異步邏輯是可能的,但現在這是一場艱苦的戰鬥,最好還是留給專家。 – 2012-01-22 01:51:34