0

私は 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 clk または posedge clk1)" の行にあることを指摘します。エラーが 1 つだけ発生しました。このエラーが発生する理由と、コードの機能を変更せずに解決する方法を知りたいです。ご覧のとおり、clk または clk1 が 0 から 1 になったときに何かを実行したいと考えています。

4

3 に答える 3

1

Verilog を使用してハードウェアを記述しています。上で指摘したように、1 つのフリップフロップを 2 つの別々のクロックで駆動することはできません。clk に敏感な 1 つと clk1 に敏感な 2 つの常にブロックを使用する必要があります。

例えば

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-26T14:23:44.950 に答える
1

clk と clk1 がボタンからの入力であることを理解した上で、より適切な名前を付ける必要がありclkますclk1。この回答の残りの部分では、それらをbtn1および と呼びbtn2ます。また、これらのボタンの押下をキャプチャするのに十分な速さのクロックを構成する必要があります。

ボタン入力は通常、デバウンスするか、最小限のエッジ検出を配置する必要があるため、特定のボタンが押されたときに 1 回だけインクリメントします。

//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
于 2014-11-27T09:20:46.190 に答える