在 Verilog 中执行移位操作时不会移位位
Bits do not get shifted when performing shift operation in 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 作为模拟器
master和slave都出错了。您正在发送 master_reg
的最高有效位,但将该寄存器向右移动。您必须将其左移。
与从站相同,发送的位不是数据移动的位。
顺带一提,master 和 slave 必须向同一个方向移动。否则你会在主从之间颠倒数据。
我正在尝试在 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 作为模拟器
master和slave都出错了。您正在发送 master_reg
的最高有效位,但将该寄存器向右移动。您必须将其左移。
与从站相同,发送的位不是数据移动的位。
顺带一提,master 和 slave 必须向同一个方向移动。否则你会在主从之间颠倒数据。