【问题标题】:Verilog - Delay in implementation of SPI master slave interfaceVerilog - 延迟实现 SPI 主从接口
【发布时间】:2016-08-26 14:27:43
【问题描述】:

我的顶级模块代码(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

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

spi主从架构:

主从时序图

【问题讨论】:

  • 延迟后无法实例化模块。实例化模块意味着向您的电路板添加硬件。该硬件在现实世界场景中以并行方式运行。那么,您想要添加延迟的确切位置在哪里?是在实例化中(这是不可能的)还是在模块本身中(可以通过使用一些计数器来完成)?
  • 我不想添加延迟......我想要那个,主控在 9 个 clk 脉冲中接收从属(45)的数据的原因是什么,从属接收主控的数据(93 ) 只有 8 个脉冲?在哪里

标签: verilog spi master-slave


【解决方案1】:

您可能需要为您的 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 个时钟延迟。换句话说,如果你在做背靠背事务,slave 和 master 的速率可能是相同的,但是如果你排列事务,你总是会看到 master 晚一个时钟开始,因此晚一个时钟完成。演示一下,如果你做 100 次事务,master 是否仍然只比 slave 晚一个时钟完成?如果是这样,这可能不是问题。

【讨论】:

    猜你喜欢
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 2022-01-23
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多