Verilog - SPI主从接口的实现延迟

时间:2016-08-26 14:27:44

标签: verilog spi master-slave

我的顶级模块代码(spi master slave):

module top(en,en_s,sclk,data_rg,tr_rg,rst,s_rst,ss_bar,rcv_rg,m_data_rg);
input [7:0] data_rg,tr_rg;
input en,en_s,sclk,rst,s_rst,ss_bar;
output [7:0] rcv_rg,m_data_rg;
ms m1(.en(en),.data_rg(data_rg),.sclk(sclk),.rst(rst),.miso(miso),.mosi(mosi),.ss_bar(ss_bar),.rcv_rg(rcv_rg));
slv m2(.en_s(en_s),.tr_rg(tr_rg),.ss_bar(ss_bar),.sclk(sclk),.s_rst(s_rst),.mosi(mosi),.miso(miso),.m_data_rg(m_data_rg));
initial
$display ("Transmitter data %d, %d",data_rg,tr_rg );
endmodule

在上面的代码中,首先执行主模块然后执行slave。现在,我正面临延迟接口。它应该是全双工的。

spi master slave的架构: Snap1

主从设备的时序图 Snap2

1 个答案:

答案 0 :(得分:0)

您可能需要提供ms和slv模块的源代码。根据您在上面提供的内容,我可以看到在shf_rg [7:0]的从属设备中似乎有类似线路分配,并且它在主设备中显示为已注册的shft_reg [7:0]。

类似

//slave code
reg [7:0] last_sft_reg;
wire shf_reg[7:0];  // Notice not a register
always (posedge clk)
 begin
      last_sft_reg <= shf_reg;
 end

 assign shf_reg = {last_sft_reg[6:0],mosi};  // shf_reg updates immediately 
                                             // when mosi changes

// master code
reg [7:0] shft_reg;
always (posedge clk or posedge reset)
 begin 
 if (reset)
   shft_reg <= 'h0;
 else
   shft_reg <= {shft_reg[6:0],miso};
 end

我想让你考虑以下几点。实际上,您可能总共在8个时钟内处理内容,主机中有1个时钟延迟。换句话说,如果您正在进行背对背交易,则从机和主机的速率可能相同,但如果您排列了事务,您将始终看到主机在一个时钟之后开始,从而在一个时钟之后结束。为了演示,如果你做了100次交易,那么主人还是只能在奴隶身后完成一个时钟吗?如果是这样,那可能不是问题。