【发布时间】: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)中你应该使用非阻塞赋值。这些:<=(你意识到这个:(^counter === 1'bx)不能合成...) -
@Oldfart 我尝试过非阻塞分配,它们产生相同的输出。暂时我只是想让模拟工作,所以我忽略了代码的可合成性