首页 > 解决方案 > 在 Verilog 中执行移位操作时位不会移位

问题描述

我正在尝试在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作为模拟器

标签: verilogspi

解决方案


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

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

顺便说一句,主机和从机都必须转向相同的方向。否则,您将在主从之间反转数据。


推荐阅读