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

XOR of variables in consecutive clock cycle

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

我写了如下内容

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

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

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

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

但是你肯定不了解 HDL 语言的基础知识,我建议你从了解任何一种 material 解释 always block 如何在 verilog 语言中工作(在互联网上你可以找到很多解释它的演示文稿)。

要牢记的重要一点是#延迟仅用于模拟,无法合成。因此,您可能希望切换到一个计数器来跟踪您所处的时钟周期,并复用到 select 您正在异或的输入。这样的事情应该有效:

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