FPGA自动售货机设计代码得不出理想仿真

https://blog.csdn.net/m0_37795702/article/details/78310631
这个是原代码

/////////////////////////////////////////////////

//自动售货机

//btn_sel_goods 为所选商品,由于实验条件的限制,本实验中只给出4种价格的商品

//btn_ok 购买确认键

//led[3:0] 客户单次投币币值

//beep 客户所投金额或购买商品后剩余金额大于所选商品价格时,该灯亮,表示可以继续购买

//led_warn 客户所投金额或购买商品后剩余金额小于所选商品价格时,该灯亮,表示不可以继续购买

//charge 找零按键,按下后找零

/////////////////////////////////////////////////
`timescale 1ns/1ps

module vb_a(rst,clk,charge,dis_money,dis_price,btn_ok,btn_money,btn_sel_goods,led_warn,led,beep);
input clk,rst;
input charge,btn_ok;      //找零,确定
input [3:0]btn_money;     //选择放入的钱1元5元10元20元
input [1:0]btn_sel_goods; //选择1元2元5元10元的商品
output [3:0]led;          //分别显示投入的是1元5元10元20元的货币
output led_warn;          //钱不足提示灯
output [13:0]dis_money;   //数码管显示投入总金额
output [13:0]dis_price;   //数码管显示价格
output beep;              //交易完成提醒
reg [3:0]led;
reg led_warn;
reg [13:0]dis_money;
reg [13:0]dis_price;
reg beep;


parameter S1=2'b00,S2=2'b01,S5=2'b10,S10=2'b11;
parameter M1=4'b0001,M5=4'b0010,M10=4'b0100,M20=4'b1000;
wire [3:0]btn_money_buf0;
wire [3:0]btn_money_buf1;
wire btn_ok_b0;
wire btn_ok_b1;
wire [1:0]btn_sel_goods_b;
wire charge_buf;

reg [6:0]price,price_all;

key_down uut4(.rst(rst),.clk(clk),.det(btn_money[0]),.key_don(btn_money_buf0[0]));
key_down uut5(.rst(rst),.clk(clk),.det(btn_money[1]),.key_don(btn_money_buf0[1]));
key_down uut6(.rst(rst),.clk(clk),.det(btn_money[2]),.key_don(btn_money_buf0[2]));
key_down uut7(.rst(rst),.clk(clk),.det(btn_money[3]),.key_don(btn_money_buf0[3]));

edge_det uut0(.rst(rst),.clk(clk),.det(btn_money_buf0[0]),.pos_edge(btn_money_buf1[0]));
edge_det uut1(.rst(rst),.clk(clk),.det(btn_money_buf0[1]),.pos_edge(btn_money_buf1[1]));
edge_det uut2(.rst(rst),.clk(clk),.det(btn_money_buf0[2]),.pos_edge(btn_money_buf1[2]));
edge_det uut3(.rst(rst),.clk(clk),.det(btn_money_buf0[3]),.pos_edge(btn_money_buf1[3]));

key_down uut8(.rst(rst),.clk(clk),.det(btn_ok),.key_don(btn_ok_b0));
edge_det uut9(.rst(rst),.clk(clk),.det(btn_ok_b0),.pos_edge(btn_ok_b1));

key_down uut10(.rst(rst),.clk(clk),.det(btn_sel_goods[0]),.key_don(btn_sel_goods_b[0]));
key_down uut11(.rst(rst),.clk(clk),.det(btn_sel_goods[1]),.key_don(btn_sel_goods_b[1]));

key_down uut12(.rst(rst),.clk(clk),.det(charge),.key_don(charge_buf));

always@(negedge rst or posedge clk)
begin
    if(!rst)
        begin
        led<=4'b0;
        led_warn<=1'b0;
        beep<=1'b0;
        price_all=7'd0;
        price<=7'd0;
        dis_money<=14'b111_1111_111_1111;
        dis_price<=14'b111_1111_111_1111;
        end

        else

        begin
        case(btn_money_buf1)
        M1:price_all=price_all+7'd1;
        M5:price_all=price_all+7'd5;
        M10:price_all=price_all+7'd10;
        M20:price_all=price_all+7'd20;
        default:led<=4'b0;
        endcase

        case(btn_money)
        M1:led<=M1;
        M5:led<=M5;
        M10:led<=M10;
        M20:led<=M20;
        default:led<=4'b0;
        endcase

        case(btn_sel_goods_b)
        S1:begin price<=7'd1;end
        S2:begin price<=7'd2;end
        S5:begin price<=7'd5;end
        S10:begin price<=7'd10;end
        default:begin price<= 7'd0;end
        endcase


    if(!charge_buf)
        price_all=7'd0;//退回零钱
    else
        begin
    if(btn_ok_b1)
        begin
    if(price_all<price)
        led_warn=1'b1;
    else
        price_all=price_all-price;
    end
    else
        begin
        led_warn<=1'b0;
        beep<=1'b0;
    end
        end

    if(price_all<price)
        led_warn<=1'b1;
    else
        begin
        led_warn<=1'b0;
        beep<=1'b1; //所投金额大于商品价格时,亮灯表示可以购买
    end

        dis_money[6:0] <= led7(price_all%10);//找零金额个位显示
        dis_money[13:7] <= led7(price_all/10);//找零金额十位显示
        dis_price[6:0] <= led7(price%10);//商品价格个位显示
        dis_price[13:7] <= led7(price/10);//商品价格十位显示
        end
        end

/*数码管段码表*/
function [6:0]led7;
input [6:0]dis_input;
    begin
    case(dis_input)
    0:led7=7'b1000000;
    1:led7=7'b1111001;
    2:led7=7'b0100100;
    3:led7=7'b0110000;
    4:led7=7'b0011001;
    5:led7=7'b0010010;
    6:led7=7'b0000011;
    7:led7=7'b1111000;
    8:led7=7'b0000000;
    9:led7=7'b0011000;
    default:led7=7'b111_1111;
    endcase
    end
    endfunction
endmodule   







这个是我修改后代码。
由于原代码得不出理想仿真波形,我对这个代码进行了修改,但还是得不出理想波形。

///////////////////////////////////////////////////////////////////////

//tb文件

///////////////////////////////////////////////////////////////////////
`timescale 1ns/1ps

module vb_tb;
reg clk,rst,btn_ok;
reg[3:0]btn_money;
reg[1:0]btn_sel_goods;
reg charge;
wire [3:0]led;
wire led_warn;
wire [13:0]dis_money;
wire [13:0]dis_price;
wire beep;

vb_a uut(.rst(rst),.clk(clk),.dis_money(dis_money),.dis_price(dis_price),.btn_ok(btn_ok),
.btn_money(btn_money),.btn_sel_goods(btn_sel_goods),.led_warn(led_warn),.led(led),.beep(beep),.charge(charge));


initial begin
clk=1'b0;
rst=1'b0;
btn_ok=1'b0;
charge=1'b1;
#20 rst=1;
#10 btn_sel_goods=2'b11;
#20 btn_money=4'b0001;
#30 btn_money=4'b0100;
#50 btn_money=4'b0010;
#100 btn_ok=1'b1;
end
always #2clk=~clk;
endmodule

这个是修改后的tb文件。
仿真波形
另外那个边沿检测和按键消抖我没有动,就没放上来了,各位可以看一下原贴。
结果不是很理想,修改了很久还是达不到原贴的波形,各位大佬能帮帮我吗。如果成功有赏金。

https://blog.csdn.net/m0_37795702/article/details/78310631