微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决连续时钟周期中变量的异或

我只是在学习用 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 是如何工作的(在互联网上,您可以找到大量解释它的演示文稿)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。