2016-06-20 3 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

두 가지 :

  1. 당신은 3 단어 스택이 아닌 3 바이트 스택을 구현하고 있습니다.
  2. 무엇이 확실하지 않습니다 tos하지만 스택에 남아있는 아이템의 수는 두 가지가 틀렸다고 가정합니다. 나는 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 
    

입니다. 그러나 tos 논리에 잘못된 것이 있기 때문에. 나는 대답하기로 결심했다.

+0

예. 죄송합니다. 나는 3 단어 스택을 의미했다. 그리고 tos는 스택 맨을 의미합니다. 그리고 문제는 주로 구문과 관련이 있습니다. 필자는 이러한 데이터 유형과 Verilog 작동 방식에 익숙하지 않습니다. 가난한 게시물에 대해 유감스럽게 생각하고 답변 해 주셔서 감사합니다. – gambhirprateek

+0

그렇다면 구문은 무엇입니까 컴파일러에서 제공하는 오류 메시지가 무엇입니까? ** tos **에 문제가 있습니다. – Renato

+0

18 번 줄 : "="근처에 구문 오류가 있습니다 .0-줄 24 : "="근처에 구문 오류가 있습니다 .--- ----------------------- 줄 16 : R_W 상수 아닙니다 ------------------ -------- 줄 18 : tos는 알 수없는 형식입니다. -------------------------- 줄 19 : POP는 unknown typeLine 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 

큰 차이점이 있습니다. 시계에 동기식으로 설계해야하는지 잘 모르겠습니다. 일반적으로 스택 작업에서는이 작업이 필요합니다. 당신이 시계가없는 조합 운동을 만들고 싶어하지만, 여기에 코드입니다 : 코드 수정 레나토에 대한

`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에서 테스트 벤치와 함께 코드는 다음과 같습니다

모듈 :

`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