2016-04-30 18 views
-1

Ich mache eine LOTTT von Pipelining mit variierenden Breite Signale und wollte ein SYNTHESIZEABILES Modul, in dem ich 2 Parameter übergeben konnte: 1) Anzahl der Rohre (L) und 2) Breite des Signals (W).Synthetisierbare Verilog modulare Schieberegister

So muss ich nur das Modul instanziieren und 2 Werte übergeben, die so einfach und robust ist, als Lasten und Lasten der Signalausbreitung über Dummy-Register zu tippen ... anfällig für Fehler und alles.

Ich habe HALF den Verilog-Code geschrieben, bitte bitten Sie mich zu korrigieren, wenn ich falsch liege.

I AM FACING COMPILE ERROR ... SEE COMMENTS 

***************************************************************** 
PARTIAL VERILOG CODE FOR SERIAL IN SERIAL OUT SHIFT REGISTER WITH 
1) Varying number of shifts/stages : L 
2) Varying number of signal/register width : W 
***************************************************************** 

module SISO (clk, rst, Serial_in, Serial_out); // sIn -> [0|1|2|3|...|L-1] -> sOut 
parameter L = 60; // Number of stages 
parameter W = 60; // Width of Serial_in/Serial_out 

input clk,rst; 
input reg Serial_in; 
output reg Serial_out; 


// reg [L-1:0][W-1:0] R; 
reg [L-1:0] R;   // Declare a register which is L bit long 

always @(posedge clk or posedge rst) 
begin 
    if (rst)     // Reset = active high 
//********************** 
    begin 
     R[0] <= 'b0;   // Exceptional case : feeding input to pipe 
     Serial_out <= 'b0;  // Exceptional case : vomiting output from pipe 

    genvar j; 
    for(j = 1; j<= L; j=j+1) // Ensuring ALL registers are reset when rst = 1 
    begin : rst_regs   // Block name = reset_the_registers 
     R[L] <= 'b0;   // Verilog automatically assumes destination width @ just using 'b0 
    end 
    end 
    else 
//********************** 
    begin 
     generate 
     genvar i; 
     for(i = 1; i< L; i=i+1) 
      begin : declare_reg 
       R[0] <= Serial_in; // <---- COMPILE ERROR POINTED HERE 
       R[L] <= R[L-1];  
       Serial_out <= R[L-1]; 
      end 
     endgenerate; 
    end 
//********************** 
endmodule 
//********************** 
+0

Warum brauchen Sie eine 'Generate'? Haben Sie gerade versucht die einfache' for' Schleifen? – toolic

+0

Ich lerne Verilog. Posted meine erste und sofortige Versuch. Ich bin auch auf der Suche at for loops – Displayname

Antwort

1

Warum so kompliziert? Der folgende Code wäre viel einfacher und leichter zu verstehen:

module SISO #(
    parameter L = 60, // Number of stages (1 = this is a simple FF) 
    parameter W = 60 // Width of Serial_in/Serial_out 
) (
    input clk, rst, 
    input [W-1:0] Serial_in, 
    output [W-1:0] Serial_out 
); 
    reg [L*W-1:0] shreg; 

    always @(posedge clk) begin 
     if (rst) 
      shreg <= 0; 
     else 
      shreg <= {shreg, Serial_in}; 
    end 

    assign Serial_out = shreg[L*W-1:(L-1)*W]; 
endmodule 

jedoch auf den Code dort suchen die folgenden Probleme:

  1. Sie erklären Serial_in als input reg. Dies ist nicht möglich, ein input kann kein reg sein.

  2. Sie verwenden generate..endgenerate innerhalb eines Always-Blocks. Ein generierter Block ist ein Modulelement und kann nicht in einem always Block verwendet werden. Entfernen Sie einfach die generate und endgenerate Anweisungen und deklarieren Sie i als integer.

  3. Offensichtlich Serial_in und Serial_out müssen als Vektoren der Größe [W-1:0] deklariert werden.

  4. Sie verwenden R als Speicher. Erklären Sie es als solches: reg [W-1:0] R [0:L-1].

  5. Sie verwenden i nicht in Ihrer for-Schleife. Offensichtlich wollten Sie alle Elemente von R zusammenketten, aber Sie greifen nur auf das 0., (L-1) -te und L-te Element zu. (Offensichtlich ist der L-ten Element ist nonexisting, dieses Array von 0 bis L-1 gehen würde.

ich jetzt schreibe diese Liste zu stoppen, weil, es tut mir leid, ich glaube, es ist wirklich nicht viel zu Gewinn durch die Verbesserung der Code, den Sie geschrieben haben ..

+0

Das ist in Ordnung, ich bin scharf auf das Endergebnis Ich denke, ich werde für Schleifen und eine völlig andere Implementierung versuchen Ich forschte für Schleifen auch parallel – Displayname

+1

Hey Clifford, synthetisiert und simuliert Ihren Code, Es funktioniert super ks viel für die Hilfe. Ich hoffe, ich kann Codes mit solcher Klarheit durch Parameter visualisieren. – Displayname