事件控制中的模糊时钟

时间:2014-11-26 09:32:10

标签: verilog xilinx vivado

我在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指出错误在“始终@(posedge clk或posedge clk1)”行中。只发生一个错误。 我想知道为什么会出现这个错误以及如何在不改变我的代码功能的情况下解决它。如你所见,当clk或clk1从0变为1时,我想做点什么。

3 个答案:

答案 0 :(得分:1)

您正在使用verilog描述硬件。如上所述,一个触发器不能由两个独立的时钟驱动。你将不得不使用2个独立的always块,一个对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

希望这有帮助。

答案 1 :(得分:1)

根据您的clk和clk1是从按钮输入的理解,您需要为clkclk1提供更好的名称。对于此答案的其余部分,我将其称为btn1btn2。您还需要足够快地配置时钟以捕获这些按钮。

按钮输入通常需要去抖动或最小边缘检测到位,这样您只需按一下给定按钮就增加一次。

//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

答案 2 :(得分:0)

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块的时钟,它将产生模棱两可的时钟错误。我们再次需要使用代码块中的else来指定它。