用两个不同的always块覆盖寄存器

时间:2014-05-04 07:36:22

标签: verilog fpga system-verilog asic

我正在尝试为图像标注算法编写一个verilog代码...该算法有几个阶段,其中每个阶段都要写为一个单独的always块...但是,据我所知,一个变量(在一个中使用的类型reg)总是不能用在另一个总是块中(当然这是真的,因为每个D-Flip Flop只有一个输入,即只能由一个信号分配)。

如何在另一个始终阻止中覆盖该reg值?

1 个答案:

答案 0 :(得分:1)

您可以在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