下面是一个边缘检测器。
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