Verilog 事件控制中的模糊时钟

Verilog 事件控制中的模糊时钟,verilog,xilinx,vivado,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 模块a(输入时钟、输入时钟1、输出调节[4:0]acc) 最初的 开始 acc=5'd0; 结束 始终@(p

我在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  
模块a(输入时钟、输入时钟1、输出调节[4:0]acc)
最初的
开始
acc=5'd0;
结束
始终@(posedge clk或posedge clk1)
开始

acc您正在使用verilog描述硬件。如上所述,一个触发器不能由两个单独的时钟驱动。您必须使用两个单独的always块,一个对clk敏感,另一个对clk1敏感

e、 g


希望这能有所帮助。

鉴于您的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
//按钮1元稳定性
逻辑[2:0]meta_edge_det_btn1;
始终@(posedge clk)开始
meta_edge_det_btn1
模块a(
输入时钟,
输入clk1,
输出调节[4:0]acc=5
);
始终@(posedge clk或posedge clk1)
开始
如果(clk | clk1)

acc你们有可以由两个时钟触发的触发器吗?“如果不是的话,你想描述什么硬件?”摩根问。clk表示每秒钟一次,clk1可以调整时间。@Morgan也许我误解了你说的话。仅由两个时钟触发的filp触发器也可以。我从来没有见过一个触发器可以接受两个这样的时钟,这可以解释你得到的错误。verilog正在描述硬件,我怀疑你的合成库中是否有一个单元可以接受这一点。所以vivado必须尝试连接一个clk触发器,但它不知道使用哪个时钟(不明确的时钟)。这可能更像是一个例子。@Morgan我试过@(posedge clk,posedge clk1),但不起作用。同样的问题也出现了。似乎reg变量不能在两个不同的always块中使用?出现另一个错误“规则违反(MDRV-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
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