我正在尝试为图像标记算法编写一个verilog代码......该算法有几个阶段,每个阶段都将被编写为一个单独的总是块......但是,据我所知,一个变量(类型为reg ) 在一个 always 中使用不能在另一个 always 块中使用(这当然是正确的,因为每个 D-Flip Flop 只有一个输入,即只能由一个信号分配)。
我怎么可能在另一个总是块中覆盖该 reg 值?
我正在尝试为图像标记算法编写一个verilog代码......该算法有几个阶段,每个阶段都将被编写为一个单独的总是块......但是,据我所知,一个变量(类型为reg ) 在一个 always 中使用不能在另一个 always 块中使用(这当然是正确的,因为每个 D-Flip Flop 只有一个输入,即只能由一个信号分配)。
我怎么可能在另一个总是块中覆盖该 reg 值?
您可以在 always 块之间使用缓冲寄存器。但是,在总是块 2(见下文)和总是块 1 的写入之间会有一个额外的延迟周期。一旦 counter2 达到 10,下面的代码会将 counter1 重置为 0。counter1 将比 counter2 晚一个周期。希望您可以将此策略扩展到您自己的实现。
reg [31:0] counter1 = 0;
reg [31:0] counter2 = 0;
reg counter2_valid = 0;
always @ (posedge clk) begin // Always block 1
if (counter2_valid == 1'b1) begin
counter1 <= counter2;
end else begin
counter1 <= counter1 + 1;
end
end
always @ (posedge clk) begin // Always block 2
if (counter2 == 10) begin
counter2_valid <= 1'b1;
counter2 <= 0;
end else begin
counter2_valid <= 1'b0;
counter2 <= counter2 + 1;
end
end