-2

我为带有输入的简单咖啡自动售货机编写了一个verilog代码

25ps、50ps、75ps 和 1

作为

“00”、“01”、“10”和“11”

分别。咖啡成本是 1 卢比。如果插入超过1rs,余额将被退回。这种平衡将是

01、10、11

作为

25ps、50ps、1rs

分别。我在没有测试台的情况下对此进行了模拟。模拟输出双时钟脉冲。(当我输入 25 ps 8 次或需要 8 个时钟脉冲来获得输出。预期时钟脉冲为 4)。为什么会这样?而且我在使用测试台时也没有得到输出。请帮我纠正测试台和我的程序。在 fpga 板上执行程序以查看输出时是否需要时钟分频器?当我编程到 fpga 板时,它按预期工作。我使用 Xilinx vivado 2015.2 工具和 zynq 板。请帮我解决这些问题

//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
4

1 回答 1

1

您需要将时钟信号初始化为测试台中的已知值。您应该加快时钟速度,因为您的money输入变化比时钟快:

initial clk = 0;
always begin
    #10 clk = ~clk; 
end 
于 2016-11-10T14:22:06.827 回答