Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Verilog 在两个不同的always块中覆盖寄存器_Verilog_Fpga_System Verilog_Asic - Fatal编程技术网

Verilog 在两个不同的always块中覆盖寄存器

Verilog 在两个不同的always块中覆盖寄存器,verilog,fpga,system-verilog,asic,Verilog,Fpga,System Verilog,Asic,我正在尝试为一个图像标记算法编写一个verilog代码…该算法有几个阶段,每个阶段都将作为一个单独的always块写入…但是,据我所知,一个always中使用的变量(reg类型)不能用于另一个always块(这当然是正确的,因为每个D触发器只有一个输入,即只能由一个信号分配) 如何在另一个always块中覆盖该reg值?您可以在always块之间使用缓冲寄存器。但是,在always块2的写入之间会有额外的延迟周期(见下文)并且始终阻止1。下面的代码在counter2达到10时将counter1重

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


如何在另一个always块中覆盖该reg值?

您可以在always块之间使用缓冲寄存器。但是,在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
reg[31:0]计数器1=0;
reg[31:0]计数器2=0;
reg计数器2_有效=0;
始终@(posedge clk)开始//始终块1
如果(计数器2_valid==1'b1)开始

你能展示一下你的努力吗?并提到你可能会面临的问题吗?同时学习一些关于FPGA和HDL的小教程,这样你就能理解它是如何工作的。这个问题很基本,但解释得不好。答案取决于进一步的规范。你可以根据某种条件将两个输入多路复用,也可以选择在两个不同的寄存器之间(多路复用输出)。还有其他信号,您可能还需要考虑:异步设置/清除,时钟使能。