2016-06-20 20 views
-3

Verilogを初めて使用しているので、初心者の間違いをお許しください。私はVerilogで3バイトのスタックを実装しようとしています。 R_Wを使用して書き込み(プッシュ/ポップ)と2D配列を読み込み、スタックの内容を格納します。Verilogでスタックを実装しようとしています。コードの何が間違っていますか?

`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 

テストベンチ

`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

あなたの質問は何ですか? 「Stack Overflowヘルプ」(http://stackoverflow.com/help)をご覧ください。 –

+0

'always'ブロックがありません。おそらくクロック信号やイネーブル信号も必要です。 – Greg

答えて

0

2つのこと:

  1. あなたは3ワードのスタックではなく、3バイトのスタックを実装しようとしています。
  2. 私はよく分かりませんtosですが、スタックに残っているアイテムの数は2つあります。ここで正しいコードは、私が自分自身VHDLの男のよりよ以来、私は構文についてはよく分からないです

    `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 
    

です。しかし、トーンスロジックに何か問題があったので。私はそれに答えることにしました。

+0

はい。ごめんなさい。私は3単​​語スタックを意味した。そしてtosはスタックの最上位を表します。そして、問題は主に構文にあります。私はこれらのデータ型に慣れていないし、どのようにVerilogが動作するのか。困った投稿をして申し訳ありません。あなたの答えに感謝します。 – gambhirprateek

+0

したがって、コンパイラが提供するエラーメッセージは何ですか? ** tos **の問題はまだ元のコードで残っています。 – Renato

+0

行18:構文エラー "="の近く.------------------------- 行24: "="の近くの構文エラー.--- ----------------------- 16行目:R_Wは定数ではありません------------------ -------- 18行目:tosは不明なタイプです-------------------------- 19行目:POPは不明なタイプライン22:R_Wは定数ではありません - ライン24:tosは不明なタイプです---------------------------- Line 25:POPが不明なタイプ------------------------- 行3:モジュールが以前のエラーのために無視されました------- --------。 エラーのためにVerilogファイルが無視される--------------------- – gambhirprateek

0

ここに訂正されたコードがあります。今すぐコンパイルする必要があります:

`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 

大きな違いが1つあります。クロックに同期した設計が必要かどうかはわかりませんでした。通常、スタック操作ではこれが必要です。コードの修正レナートため

`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

おかげで、私は、コードを改善し、あまりにもPUSH機能を使用しました:あなたは時計なしで、コンビナトリアル行使したい場合でも、ここでそのためのコードです。下記のVerilogでテストベンチと一緒にコードです:

MODULE:

`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 

テストベンチ

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

スタックが空で、その内容を読みたい場合はどうなりますか?スタックオーバーフローとアンダーフローエラーで何が起こる可能性がありますか?それは 'error'行を持ってはいけませんか? – Piranna

関連する問題