Биты не сдвигаются при выполнении операции сдвига в Verilog - PullRequest
0 голосов
/ 04 мая 2019

Я пытаюсь построить модуль SPI в Verilog, который передает 8 бит данных, но при выполнении операции сдвига я заметил, что сдвиг вообще не сдвигает биты, в то время как 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)от ведомого) дает следующий результат: output

Редактировать: я использую EDA Playground в качестве симулятора

1 Ответ

0 голосов
/ 04 мая 2019

Ошибка как у мастера, так и у раба.Вы отправляете самый значимый бит master_reg, но сдвигаете этот регистр вправо.Вместо этого вы должны сдвинуть его влево.

То же самое с ведомым, отправляемый бит не тот, к которому сдвинуты данные.

Кстати, и ведущий, и ведомый должны перейти вв том же направлении.В противном случае вы получите данные, обратные между главным и подчиненным.

...