2017-04-10 2 views
0

Ich habe zwei Module nämlich main.v und signal.v.Fehler beim Versuch, Signal an externes Modul zu übertragen

In main.v, habe ich ein paar Zeilen Code, die 16-Bit-Reg-tx mit einem Wert entsprechend einer Rechteckwelle aktualisieren.

reg [1:0] counter; 
    reg [15:0] tx; 
    always @(posedge clk) begin 
     counter = counter + 1; 
     if (counter[1] == 1) begin 
     tx[15:0] <= 16'b1010101010101010; 
     else 
     tx[15:0] <= 16'b0000000000000000; 
    end 

Das funktioniert gut. Letztendlich möchte ich dieses Signal jedoch in eine andere Datei verschieben: signal.v, weil das Signal, das ich an tx übergebe, immer komplizierter wird. Ich habe Fehler bekommen, wenn ich das versucht habe. Anfangs habe ich versucht, den obigen Code in die Datei signal.v zu verschieben. Dann verwendete ein Draht zwischen den beiden Dateien wie gezeigt.

module signal(clk, get_tx); 
    input clk; 
    output reg get_tx; 
    reg [1:0] counter; 

    always @(posedge clk) begin 
     counter = counter + 1; 
     if (counter[1] == 1) begin 
     get_tx[15:0] <= 16'b1010101010101010; 
     else 
     get_tx[15:0] <= 16'b0000000000000000; 
    end 

Dann in main.v, versuchte ich

wire get_tx; 
reg [15:0] tx; 
signal my_signal(.clk(clk), .get_tx(get_tx)); 
always @(get_tx) begin 
    tx <= get_tx; 
end 

Basierend hinzufügen, was ich in der Ausgabe Oszilloskop sehen, ist diese Methode nicht funktioniert, und ich bin nicht sicher, warum das ist. Der erste Fall scheint gut zu funktionieren, also weiß ich nicht, warum es scheitert, wenn ich zum zweiten Fall übergehe (die Signale sehen einfach völlig anders aus). Ich würde mich über jede Hilfe/Beratung freuen!

Antwort

2

Zunächst ist es besser, Ihre Verbindungen zu verstehen und Ihren Code zu simulieren, wenn Sie den vollen Code mit Moduldeklarationen hinzufügen.
Die Probleme sind in den Signaltypen. Versuchen Sie, die Ausgabe auf wire zu ändern. Außerdem müssen Sie Bus deklarieren, nicht nur 1 Bit Signal. Und geben Sie Ihrem Zähler einen Anfangswert (andernfalls folgt er dem Vorgang 'X' +1, was 'X' im Ergebnis ergibt und Ihre Bedingung if (counter[1] == 1) wird nie erreicht werden).

module signal(clk, get_tx); 
    input clk; 
    output [15:0] get_tx; 
    reg [15:0] tx_out; 
    reg [1:0] counter = 2'd0; 

    always @(posedge clk) begin 
     counter = counter + 1; 
     if (counter[1] == 1) 
     tx_out[15:0] <= 16'b1010101010101010; 
     else 
     tx_out[15:0] <= 16'b0000000000000000; 
    end 
    assign get_tx = tx_out; 
endmodule 

Nächster Fehler in der oberen Modul, es müssen Sie auch mit dem Bus zu erklären, anstatt nur ein Bit wire [15:0] get_tx;.
Versuchen Sie, diese Fehler zu beheben und Ihre Module funktionieren.

+0

Ausgänge können Register in Verilog sein. – Laleh

+0

Ok, du hast recht, ich habe die Aussage entfernt. – Roman

+0

Das funktioniert - danke! –

Verwandte Themen