2016-08-26 2 views
0

Mein Code für Top-Modul (spi Master-Slave):Verilog - Verzögerung bei der Umsetzung der SPI Master-Slave-Schnittstelle

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 

In dem obigen Code, Mastermodul wird zuerst ausgeführt und dann Slave ausgeführt wird. Im Moment habe ich eine Verzögerung bei der Anbindung. Es sollte Vollduplex sein.

Architektur von spi Master-Slave: Snap1

Zeitdiagramm der Master-Slave- Snap2

+0

Module können nicht nach einer Verzögerung instanziiert werden. Instantiierungsmodul bedeutet das Hinzufügen von Hardware zu Ihrem Board. Diese Hardware verhält sich im realen Szenario parallel. Also, wo ist es genau wo Sie Verzögerung hinzufügen möchten? Ist es in der Instantiierung (was nicht möglich ist) oder in den Modulen selbst (was durch die Verwendung einiger Zähler möglich ist)? – sharvil111

+0

ich möchte keine verzögerung hinzufügen, ..... ich will das, was ist der grund hinter master empfängt daten von slave (45) in 9 clk puls wo Slave empfängt daten von master (93) in nur 8 puls? woher –

Antwort

0

Sie müssen wahrscheinlich die Quelle für Ihre ms und SLV-Module zur Verfügung zu stellen. Von dem, was Sie oben angegeben haben, kann ich sehen, dass es im Slave für shf_rg [7: 0] so etwas wie eine Drahtbelegung zu sehen gibt, und es erscheint in der Master-Einheit registriert shft_reg [7: 0].

so etwas wie

//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 

Ich möchte Ihnen folgendes berücksichtigen. Sie können den Inhalt tatsächlich in 8 Takten insgesamt mit 1 Taktlatenz im Master verarbeiten. Mit anderen Worten, wenn Sie Back-to-Back-Transaktionen ausführen, ist die Rate des Slaves und des Masters gleich, aber wenn Sie die Transaktionen aufreihen, sehen Sie immer, dass der Master eine Uhr später startet und somit eine Stunde später beendet wird. Wenn Sie 100 Transaktionen durchführen, beendet der Master nur noch eine Uhr hinter dem Slave? Wenn ja, ist das wahrscheinlich kein Problem.

Verwandte Themen