【问题标题】:Overwriting a register in two different always blocks在两个不同的 always 块中覆盖寄存器
【发布时间】:2014-05-04 07:36:22
【问题描述】:

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

我怎样才能在另一个始终块中覆盖该 reg 值?

【问题讨论】:

  • 你能表现出你的努力吗?并提及您可能面临的问题?
  • 还可以学习一些关于 FPGA 和 HDL 的小教程,以便您了解它是如何工作的。这个问题很基础,但解释得不好。
  • 答案取决于进一步的规范。您可以根据某些条件将两个输入多路复用,或者您可以在两个不同的寄存器之间进行选择(多路复用输出)。您可能还需要考虑其他信号:异步设置/清除、时钟启用。

标签: verilog fpga system-verilog asic


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 2016-01-18
    • 2012-12-20
    • 2021-06-02
    相关资源
    最近更新 更多