“多驱动程序”错误是由于尝试修改来自不同进程/始终块的信号而引起的。你不应该这样做。
我习惯于使用完全同步的系统,所以我应该问你“a_specific_signal”是什么样的,以及与你的主时钟的关系是什么。
因此,我的方法是:1. 将“a_specific_signal”同步到我当前的时钟,2. 检测其正沿,3. 将其用作计数器标志的驱动器
reg a_spec_signal_reg0 = 1'b0, a_spec_signal_reg1 = 1'b0, a_spec_signal_reg2 = 1'b0;
always @(posedge clk) begin --synchronizer with 3 FFs
a_spec_signal_reg0 <= a_specific_signal;
a_spec_signal_reg1 <= a_spec_signal_reg0;
a_spec_signal_reg2 <= a_spec_signal_reg1;
end
wire a_spec_signal_posedge;
assign a_spec_signal_posedge = a_spec_signal_reg1 & ~(a_spec_signal_reg2);
reg counter_switch = 1'b0;
always @(posedge clk) begin
something <= 1'b0;
if (a_spec_signal_posedge)
counter_switch <= 1'b1;
if (counter_switch) begin
counter <= counter + 1;
if (counter == 255) begin
counter <= 0;
counter_switch <= 0;
something <= 1'b1;
end
end
end
一些注意事项:我假设您想要计算 256 个事件,这意味着使用从 0 到 255(8 位)的计数器。另外,something 信号在其默认状态下设置为 0,因此当条件“counter == 255”到达时,它仅输出一个时钟周期的滴答声,这是通常使用的。