连续时钟周期中变量的异或

问题描述

我只是在学习用 verilog 编写代码。我想在连续的时钟周期中对三个变量进行异或。例如,第一个时钟周期的 Z1,第二个时钟周期的 Z2 和第三个时钟周期的 Z3。我该怎么做。

我写的东西如下

always @ (posedge clk) begin
  lamda = Y1;
 #10 lamda = lamda^ Y2;
 #10 lamda = lamda ^ Y3;
end

其中时钟被视为always #5 clk=~clk 但它似乎没有按预期工作。有人能帮我修一下吗。

解决方法

要记住的重要一点是 # 延迟仅用于模拟,无法合成。因此,您可能希望切换到计数器来跟踪您所在的时钟周期,并切换到多路复用器来选择您要进行异或运算的输入。这样的事情应该可以工作:

logic [1:0] counter; // counter resets to 0,counts up every clock cyle,and stops at 3
always_ff @(posedge clk,posedge reset) begin
    if (reset) counter <= 2'b00;
    else counter <= (counter == 2'b11 ? counter : counter + 1);
end

always_ff @(posedge clk) begin
    case (counter)
        2'b00: lambda <= lambda ^ Y1; // lambda gets (lambda xor Y1) on the rising edge of clk if counter is 0
        2'b01: lambda <= lambda ^ Y2; // lambda gets (lambda xor Y2) on the rising edge of clk if counter is 1
        2'b10: lambda <= lambda ^ Y3; // lambda gets (lambda xor Y3) on the rising edge of clk if counter is 2 
        default: lambda <= lambda ; // if anything else,lambda will just stay as lambda
    endcase
end
,

我不确定这是否可行,因为您没有与我们共享整个代码,但也许下面的摘录可以完成这项工作:

reg lamda_1,lamda_2,lamda_3;
always @ (posedge clk) begin
  lamda_1 = Y1;
  lamda_2 = lamda1 ^ Y2;
  lamda_3 = lamda2 ^ Y3;
end

但可以肯定的是,您不了解 HDL 语言的基础知识,我建议您从阅读任何类型的材料开始,这些材料解释了 verilog 语言中的 always block 是如何工作的(在互联网上,您可以找到大量解释它的演示文稿)。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...