我正在尝试在verilog中构建一个SPI模块,该模块可以传输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)得出以下结果:
编辑:我正在使用EDA Playground作为模拟器
答案 0 :(得分:0)
主机和从机都有一个错误。您正在发送master_reg
的最高有效位,但是将该寄存器右移。您必须将其向左移。
与从设备相同,正在发送的位不是数据移向的位。
顺便说一句,主机和从机都必须朝同一方向移动。否则,您将在主服务器和从服务器之间获得反向数据。