【问题标题】:Bits do not get shifted when performing shift operation in Verilog在 Verilog 中执行移位操作时位不会移位
【发布时间】:2019-05-04 18:27:27
【问题描述】:

我正在尝试在verilog中构建一个传输8位数据的SPI模块,但是在进行移位操作时我注意到移位根本不移位位,而MOSI和MISO仅在第一个之后取零值循环,这导致两边的数据衰减为零。我该怎么做才能解决这个问题?

主代码:

module Master(input clk, input MISO, 
              output reg MOSI, output reg SS);
  initial SS = 0;
  reg [2:0] counter;
  reg [7:0] Master_reg = 8'b11011011;
  always @ (posedge clk)
    begin
      if(!SS)
        begin
          if(^counter === 1'bx)
            counter = 0;
          else
            counter = counter + 1;
          MOSI = Master_reg[7];
          Master_reg = Master_reg >> 1;
          Master_reg[0] = MISO;
        end
      if(counter == 7)
          SS = 1; 
    end
endmodule

从机代码:

module Slave(input clk, input MOSI, input SS,
            output reg MISO);
  reg [2:0] counter;
  reg [7:0] Slave_reg = 8'b11111111;
  always @ (posedge clk)
    begin
      if(!SS)
        begin
          if(^counter === 1'bx)
            counter = 0;
          else
            counter = counter + 1;
          MISO = Slave_reg[0];
          Slave_reg = Slave_reg << 1;
          Slave_reg[7] = MOSI;
        end
    end
endmodule

传输给定数据(11011011 来自主机,11111111 来自从机)给出以下结果:

编辑:我使用EDA Playground 作为模拟器

【问题讨论】:

  • always @ (posedge clk) 中你应该使用非阻塞赋值。这些:&lt;=(你意识到这个:(^counter === 1'bx)不能合成...)
  • @Oldfart 我尝试过非阻塞分配,它们产生相同的输出。暂时我只是想让模拟工作,所以我忽略了代码的可合成性

标签: verilog spi


【解决方案1】:

主从都有错误。您正在发送master_reg 的最重要位,但将该寄存器向右移动。您必须改为向左移动。

与从机相同,正在发送的位不是数据移向的位。

顺便说一句,主机和从机都必须转向相同的方向。否则你会得到主从之间的数据反转。

【讨论】:

  • 你没有回答他的问题。是的,代码非常......(我该如何礼貌地说......)“次优”,但这不是这里的问题。
  • @Vlad,我厌倦了你的建议(m&s 侧的翻转移位)并且确实有效,(虽然位被反转)但我很困惑:register &lt;&lt; 1; 操作不向左移位吗?如果是这样,在这种情况下 register[7] 不应该总是为零吗?
  • @Ach113 两者,主从必须向同一方向移动其数据。如果先发送 MSB,则主从都必须输出 reg[7],将数据左移,并将输入数据保存在 reg[0] 中。你把它颠倒了,因为你的主人和奴隶会朝不同的方向移动。
  • @Vlad,感谢代码现在可以使用。但是我仍然无法理解为什么向左移动然后发送最右边的位并不总是发送零。
  • @Ach113 总是有正确的初始值,所以发送的第一位就可以了。问题是当您从与设备输出对应的行移开时。你的 MOSI 在 MSB,reg[7]。其余的数据就在那个位的右边。因此,为了获取该数据,您必须将其移向 reg[7],即向左。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-19
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
相关资源
最近更新 更多