2016-11-10 2 views
-1

ich mit EingängenKaffeeautomaten Simulation in Verilog mit Prüfstand Ausgabe

25ps, 50ps, 75 ps und 1

als

einen Verilog-Code für einen einfachen Kaffeeautomaten geschrieben

"00", "01", "10" und "11"

beziehungsweise. Kaffeekosten sind 1 rs. Wenn mehr als 1rs eingefügt wird, wird das Guthaben zurückgegeben. Dieses Gleichgewicht wird

01, 10, 11

als

25 ps, 50 ps, ​​1RS

bzw. sein. Ich simuliere das ohne Prüfstand. Die Simulation benötigt einen doppelten Taktimpuls für die Ausgabe (wenn ich 25 ps 8 mal oder 8 takte für die Ausgabe benötige, ist der erwartete takt 4). Warum ist das passiert? und ich habe auch nicht ausgegeben, wenn ich den Prüfstand benutze. Bitte helfen Sie mir, den Prüfstand und mein Programm zu korrigieren. Ist der Taktfrequenzteiler notwendig, während das Programm in der FPGA-Platine ausgeführt wird, um die Ausgabe zu sehen? Es funktioniert wie erwartet, wenn ich in fpga board.Im programmiert Xilinx vivado 2.015,2 Werkzeug und Zynq board.Please mir helfen, diese Probleme zu lösen

//programme 
module main(
input clk, 
input rst, 
input [1:0] money, 
output coffee, 
output [1:0] balance 
);  

reg coff; 
reg [1:0] bal; 
reg [2:0] pr_st; 
reg [2:0] nx_st; 
parameter [2:0] A=3'b000; 
parameter [2:0] B=3'b001; 
parameter [2:0] C=3'b010; 
parameter [2:0] D=3'b011; 
parameter [2:0] E=3'b100; 
parameter [2:0] F=3'b101; 
parameter [2:0] G=3'b110; 
parameter [2:0] H=3'b111; 

always @ (posedge clk or posedge rst) 
begin 
if(rst) 
pr_st <= A; 
else 
pr_st <= nx_st; 
end 

always @(posedge clk)   
begin 
case(pr_st) 
A : if(money == 2'b00) // input money is 25ps 
begin 
nx_st <= B; 
end 
else if(money == 2'b01) // input money is 50ps 
begin 
nx_st <= C;      
end 
else if(money == 2'b10) // input money is 75ps 
begin 
nx_st <= D;       
end 
else if(money == 2'b11) 
begin 
nx_st <= E;     
end 
B : if(money == 2'b00)  
begin 
nx_st <= C;       
end 
else if(money == 2'b01) 
begin 
nx_st <= D; 
end 
else if(money == 2'b10) 
begin 
nx_st <= E;      
end 
else if(money == 2'b11) 
begin 
nx_st <= F;       
end 
C : if(money == 2'b00)   
begin 
nx_st <= D;      
end 
else if(money == 2'b01) 
begin 
nx_st <= E;       
end 
else if(money == 2'b10) 
begin 
nx_st <= F;      
end 
else if(money == 2'b11) 
begin 
nx_st <= G;      
end  
D : if(money == 2'b00) 
begin   
nx_st <= E;       
end 
else if(money == 2'b01) 
begin 
nx_st <= F;       
end 
else if(money == 2'b10) 
begin 
nx_st <= G; 
end 
else if(money == 2'b11) 
begin 
nx_st <= H;      
end 
E : nx_st <= A; 
F : nx_st <= A; 
G : nx_st <= A; 
H : nx_st <= A; 
default : nx_st <= A;   
endcase 
end 
//output logic 
always @(posedge clk or pr_st) 
begin 
case(pr_st) 
A: begin 
coff <= 1'b0; 
bal <= 2'b00; 
end 
B: begin 
coff <= 1'b0; 
bal <= 2'b00; 
end 
C: begin 
coff <= 1'b0; 
bal <= 2'b00; 
end 
D: begin 
coff <= 1'b0; 
bal <= 2'b00; 
end 
E: begin 
coff <= 1'b1; 
bal<= 2'b00;   
end 
F: begin 
coff <= 1'b1; 
bal <= 2'b01;  
end 
G: begin 
coff <= 1'b1; 
bal <= 2'b10; 
end 
H: begin 
coff <= 1'b1; 
bal <= 2'b11;  
end 
default : begin 
off <=1'b0; 
bal <= 2'b00; 
end 
endcase      
end 

assign coffee = coff; 
assign balance = bal; 

endmodule 

//test bench 
module tb_main(
); 
reg clk; 
reg rst; 
reg [1:0] money; 
wire coffee; 
wire [1:0] balance; 

main dut(clk, rst, money, coffee, balance); 
always 
begin 
#200 clock = ~clk; 
end 

initial 
begin 
rst = 1'b1; 
#100 rst = 1'b0; 
money = 2'b00; // putting 25ps four times to get coffee 
#400 money = 2'b01; //putting 50ps two times to get coffee 
#200 money = 2'b10;// putting 75ps two times to get coffee 
#200 money = 2'b11;// putting 1 rs single time to g 
#100 money = 2'b01; // putting 1st 25ps and 50ps i n second clock cycle 
#100 money = 2'b10; 
#200 
$finish 
end 
endmodule 
+0

Geben Sie den genauen Code ein, den Sie verwenden. Ihrerseits hat mehrere Kompilierungsfehler. – toolic

Antwort

0

Sie benötigen Taktsignal auf einen bekannten Wert in dem Prüfstand zu initialisieren . Sie sollten die Uhr beschleunigen, weil sich Ihr money Eingang schneller als die Uhr ändert:

Verwandte Themen