我在xilinx vivado中写了这样的verilog代码:
module a(input clk, input clk1, output reg [4:0] acc)
initial
begin
acc = 5'd0;
end
always @ (posedge clk or posedge clk1)
begin
acc <= acc+1;
end
endmodule 错误(事件控制中的模糊时钟)是在运行综合时出现的,vivado指出错误出现在"always @ (posedge或posedge clk1)“行中。只发生了一个错误。我想知道为什么会出现这个错误,以及如何在不改变代码功能的情况下解决它。如你所见,当clk或clk1从0变成1时,我想做点什么。
发布于 2014-11-26 22:23:45
您正在使用verilog描述硬件。如上所述,一个触发器不能由两个单独的时钟驱动。你将不得不使用2个独立的始终块,一个对clk敏感,另一个对clk1敏感。
e.g
always @ (posedge clk)
begin
// your verilog statements here, driven by clk
end
always @ (posedge clk1)
begin
// your verilog statements here, driven by clk1
end希望这能有所帮助。
发布于 2014-11-27 17:20:46
了解到你的clk和clk1是从按钮输入的,你需要给你的clk和clk1起更好的名字。对于这个答案的其余部分,我将把它们称为btn1和btn2。您还需要配置一个足够快的时钟来捕获这些按钮按下。
按钮输入通常需要去抖动或最小限度的边缘检测,因此对于给定的按钮按下,您只需递增一次。
//Button 1 meta stability
logic [2:0] meta_edge_det_btn1;
always @(posedge clk) begin
meta_edge_det_btn1 <= {meta_edge_det_btn1[1:0], btn1} ;
end
//button 1 Positive edge detection
logic btn1_rise;
always @* begin
btn1_rise = meta_edge_det_btn1[1] & ~meta_edge_det_btn1[2];
end
logic [2:0] meta_edge_det_btn2;
always @(posedge clk) begin
meta_edge_det_btn2 <= {meta_edge_det_btn2[1:0], btn2} ;
end
logic btn2_rise;
always @* begin
btn2_rise = meta_edge_det_btn2[1] & ~meta_edge_det_btn2[2];
end
//Increment if either of the buttons has been pressed
always @ (posedge clk) begin
if (btn1_rise | btn2_rise ) begin
acc <= acc+1;
end
end发布于 2018-10-26 01:28:42
module a (
input clk,
input clk1,
output reg [4:0] acc = 5
);
always @ (posedge clk or posedge clk1)
begin
if(clk | clk1)
acc <= acc+1;
else
acc <= acc;
end
endmodule 这应该是可行的。如果我们将我们的信号作为always块的时钟,它会给出一个模糊的时钟错误。我们再次需要在代码块中使用if else来指定它。
https://stackoverflow.com/questions/27145548
复制相似问题