2016-06-20 27 views
-3

Ich bin neu bei Verilog, also bitte entschuldigen Sie alle Anfängerfehler. Ich versuche, einen 3-Byte-Stack in Verilog zu implementieren. Verwenden von R_W zum Lesen von write (push/pop) und einem 2D-Array zum Speichern des Inhalts des Stapels.Der Versuch, einen Stapel in Verilog zu implementieren. Was stimmt nicht mit dem Code?

`timescale 1ns/1ps 

module one(R_W,PUSH,POP); 

input PUSH; 
input R_W; 
output POP; 

wire [31:0] PUSH; 
reg [31:0] POP; 
wire R_W; 

reg [31:0] temp[0:3]; 
integer tos = 3; 

if(R_W == 1 && tos != 3) 
    begin 
    POP = temp[tos]; 
    end 

if(R_W == 0 && tos != 0) 
    begin 
    tos = tos +1; 
    POP = temp[tos]; 
    end 


endmodule 

Prüfstand

`include"one.v" 
module one_test(); 

wire pop; 
reg [31:0] push; 
wire r_w; 

initial begin 

push = 2'd12; 
r_w = 0; 

#10 

$finish; 

end 


one one(r_w,push,pop); 

endmodule 
+0

Was ist Ihre Frage? Bitte lies [die Hilfe zum Stack-Überlauf] (http://stackoverflow.com/help). –

+0

Sie vermissen einen 'immer'-Block. Sie benötigen wahrscheinlich auch ein Takt- und/oder Freigabesignal. – Greg

Antwort

0

Zwei Dinge:

  1. Sie die Implementierung eines 3-Wort-Stack, kein 3-Byte-Stack.
  2. Ich bin mir nicht sicher, was Tos ist, aber angenommen, es ist, wie viele Artikel im Stapel übrig sind, dann haben Sie zwei Dinge falsch. Hier ist der richtige Code

    `timescale 1ns/1ps 
    
    module one(R_W,PUSH,POP); 
    
    input PUSH; 
    input R_W; 
    output POP; 
    
    wire [31:0] PUSH; 
    reg [31:0] POP; 
    wire R_W; 
    
    reg [31:0] temp[0:3]; 
    integer tos = 3; 
    
    if(R_W == 1 && tos != 3) 
        begin 
        tos = tos + 1; 
        POP = temp[tos]; 
        end 
    
    if(R_W == 0 && tos != 0) 
        begin 
        tos = tos - 1; 
        POP = temp[tos]; 
        end 
    
    endmodule 
    

ich über Syntax bin nicht sicher, da ich eher ein VHDL Typ bin ich selbst. Aber da stimmt etwas mit der Tos-Logik nicht. Ich beschloss, es zu beantworten.

+0

Ja. Es tut uns leid. Ich meinte 3 Wortstapel. Und Tos steht für Top of Stack. Und das Problem ist hauptsächlich mit der Syntax. Ich bin neu in diesen Datentypen und wie Verilog funktioniert. Entschuldige den bedürftigen Beitrag und danke für deine Antwort. – gambhirprateek

+0

Also, wenn es Syntax ist, was ist die Fehlermeldung der Compiler gibt Ihnen? Sie haben immer noch ein Problem mit ** tos ** in Ihrem ursprünglichen Code. – Renato

+0

Zeile 18: Syntaxfehler in der Nähe von "=" .------------------------- Zeile 24: Syntaxfehler in der Nähe von "=" .--- ----------------------- Zeile 16: R_W ist keine Konstante ------------------ -------- Zeile 18: tos ist ein unbekannter Typ -------------------------- Zeile 19: POP ist ein unknown typeLine 22: R_W ist keine Konstante - Zeile 24: tos ist ein unbekannter Typ ---------------------------- Zeile 25: POP ist ein unbekannter Typ ------------------------- Zeile 3: Modul wegen früherer Fehler ignoriert ------- --------. Verilog-Datei wegen Fehlern ignoriert --------------------- – gambhirprateek

0

Ok! Hier ist der korrigierte Code. Es sollte jetzt kompilieren:

`timescale 1ns/1ps 

module one(clk,R_W,PUSH,POP); 

input clk; 
input [31:0] PUSH; 
input R_W; 
output [31:0] POP; 

//wire [31:0] PUSH; 
reg [31:0] POP; 
wire R_W; 

reg [31:0] temp[0:3]; 
integer tos = 3; 

always @ (posedge clk) 
if(R_W == 1 && tos != 3) 
    begin 
    POP = temp[tos]; 
    tos = tos + 1; 
    end 
else if(R_W == 0 && tos != 0) 
    begin 
    POP = temp[tos]; 
    tos = tos - 1; 
    end 

endmodule 

Es gibt einen großen Unterschied. Ich war mir nicht sicher, ob Sie Ihr Design synchron zu einer Uhr benötigen. Normalerweise in einem Stapelvorgang benötigen Sie dies. Aber wenn man es eine kombinatorische Übung ohne Uhr hier machen will, ist der Code dafür:

`timescale 1ns/1ps 

module one(R_W,PUSH,POP); 

input [31:0] PUSH; 
input R_W; 
output [31:0] POP; 

//wire [31:0] PUSH; 
reg [31:0] POP; 
wire R_W; 

reg [31:0] temp[0:3]; 
integer tos = 3; 

always @ (R_W, tos) 
if(R_W == 1 && tos != 3) 
    begin 
    POP = temp[tos]; 
    tos = tos + 1; 
    end 
else if(R_W == 0 && tos != 0) 
    begin 
    POP = temp[tos]; 
    tos = tos - 1; 
    end 

endmodule 
1

Vielen Dank für die Codekorrektur Renato, aber ich habe den Code verbessert und verwenden auch die Push-Funktionalität. Da unten ist der Code zusammen mit dem Prüfstand in Verilog:

MODUL:

`timescale 1ns/1ps 

module some(clk,R_W,PUSH,POP); 

input clk; 
input [31:0] PUSH; 
input R_W; 
output [31:0] POP; 

wire [31:0] PUSH; 
reg [31:0] POP; 
wire R_W; 

reg [31:0] temp[0:3]; 
integer tos = 3; 

always @ (posedge clk) 
if(R_W == 1 && tos != 3) 
    begin 
    POP = temp[tos]; 
    tos = tos + 1; 
    end 
else if(R_W == 0 && tos != 0) 
    begin 
    temp[tos] = PUSH; 
    tos = tos - 1; 
    end 

endmodule 

PRüFSTAND

module some_test(); 

reg clk; 
reg r_w; 
integer push; 
wire [31:0] pop; 

always begin 

#1 clk = !clk; 

end 

initial begin 

clk = 0; 

#1 r_w = 0; 

#1 push = 'd9; 

#10 
$finish; 

end 

some some(clk,r_w,push,pop); 

endmodule 
+0

Was kann passieren, wenn der Stapel leer ist und seinen Inhalt lesen möchten? Was kann bei Überlauf- und Unterlauffehlern im Stapel passieren? Soll es zum Beispiel keine 'Fehler'-Zeile haben? – Piranna