自动售货机设计Verilog代码VIVADO仿真

名称:自动售货机设计Verilog代码VIVADO仿真(文末获取)

软件:VIVADO

语言:Verilog

代码功能:

自动售货机

一共有2元、3元、4元、6元4种商品,可以投币1元和5元。支持找零和取消购买若投币金额大于价格则找零,若投币不足或且10s内没有投币则自动取消。

1. 工程文件

2. 程序文件

3. 程序编译

4. RTL图

5. Testbench

6. 仿真图

一共有2元、3元、4元、6元4种商品,可以投币1元和5元。支持找零和取消购买若投币金额大于价格则找零,若投币不足或且10s内没有投币则自动取消。

仿真图

按键检测模块

状态控制模块

数码管显示模块

部分代码展示:

module auto_sell(
input clk_in,//100M
input reset_n,//复位
input coin_1_key,//投币1元
input coin_5_key,//投币5元
input price_2_key,//2元商品
input price_3_key,//3元商品
input price_4_key,//4元商品
input price_6_key,//6元商品
input confirm_key,//确认
output succeed_ledn,//购买成功指示灯
output coin_return_ledn,//退币指示灯
output [3:0] DLA,//数码管位选
output [7:0] HEX//数码管段选
);
wire [3:0] input_money_BCD;//投币金额
wire [3:0] need_money_BCD;//价钱
wire [3:0] change_money_BCD;//找钱
wire [3:0] left_money_BCD;//还差金额
wire coin_1_p;//投币1元
wire coin_5_p;//投币5元
wire price_2_p;//2元商品
wire price_3_p;//3元商品
wire price_4_p;//4元商品
wire price_6_p;//6元商品
wire confirm_p;//确认 
//按键消抖模块
key_jitter i0_key_jitter(
. clkin(clk_in),     
. key_in(coin_1_key),//输入
. key_negedge(coin_1_p)//消抖后按键下降沿
);
//按键消抖模块
key_jitter i1_key_jitter(
. clkin(clk_in),     
. key_in(coin_5_key),//输入
. key_negedge(coin_5_p)//消抖后按键下降沿
);
//按键消抖模块
key_jitter i2_key_jitter(
. clkin(clk_in),     
. key_in(price_2_key),//输入
. key_negedge(price_2_p)//消抖后按键下降沿
);
//按键消抖模块
key_jitter i3_key_jitter(
. clkin(clk_in),     
. key_in(price_3_key),//输入
. key_negedge(price_3_p)//消抖后按键下降沿
);
源代码

 扫描文章末尾的公众号二维码

  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于自动售货机的程序比较复杂,无法一一列出所有的代码。但是,我可以给你提供一个自动售货机项目的代码框架,帮助你理解整个程序的结构和实现方法。 以下是代码框架: ```verilog module vending_machine( input clk, // 时钟信号 input rst_n, // 复位信号 input coin_1, // 投入一元硬币信号 input coin_5, // 投入五角硬币信号 input vend, // 购买信号 output reg disp_1, // 显示屏输出一元信号 output reg disp_5, // 显示屏输出五角信号 output reg change_1, // 找零口输出一元信号 output reg change_5, // 找零口输出五角信号 output reg [7:0] vend_num // 购买的商品数量 ); // 定义状态类型 typedef enum logic [2:0] { WAIT, COIN_1, COIN_5, VEND, DISP_CHANGE } state_t; // 定义状态机变量和状态变量 state_t state, next_state; // 定义计数器和商品数量变量 reg [7:0] count, vend_count; // 定义状态转移条件 localparam logic [3:0] WAIT_TO_COIN_1 = 4'b0001, COIN_1_TO_COIN_5 = 4'b0010, COIN_5_TO_VEND = 4'b0100, VEND_TO_DISP_CHANGE = 4'b1000; // 定义状态转移函数 function void state_transition; input logic [3:0] condition; begin case (condition) WAIT_TO_COIN_1: next_state = COIN_1; COIN_1_TO_COIN_5: next_state = COIN_5; COIN_5_TO_VEND: next_state = VEND; VEND_TO_DISP_CHANGE: next_state = DISP_CHANGE; default: next_state = state; endcase end endfunction // 定义状态机 always_ff @(posedge clk, negedge rst_n) begin if (~rst_n) begin state <= WAIT; count <= 0; vend_count <= 0; end else begin state <= next_state; count <= count + 1; if (vend) vend_count <= vend_count + 1; end end // 定义状态转移逻辑 always_comb begin case (state) WAIT: if (coin_1) state_transition(WAIT_TO_COIN_1); else if (coin_5) state_transition(COIN_5_TO_VEND); COIN_1: if (count >= 10) state_transition(COIN_1_TO_COIN_5); COIN_5: if (count >= 2) state_transition(VEND_TO_DISP_CHANGE); VEND: if (vend_count >= 1) state_transition(VEND_TO_DISP_CHANGE); DISP_CHANGE: if (count >= 2) state_transition(WAIT_TO_COIN_1); endcase end // 定义输出逻辑 always_comb begin case (state) WAIT: begin disp_1 = 0; disp_5 = 0; change_1 = 0; change_5 = 0; vend_num = 0; end COIN_1: begin disp_1 = 1; disp_5 = 0; change_1 = 0; change_5 = 0; vend_num = 0; end COIN_5: begin disp_1 = 0; disp_5 = 1; change_1 = 0; change_5 = 0; vend_num = 0; end VEND: begin disp_1 = 0; disp_5 = 0; change_1 = 1; change_5 = 1; vend_num = 1; end DISP_CHANGE: begin disp_1 = 0; disp_5 = 0; change_1 = 1; change_5 = 1; vend_num = 0; end endcase end endmodule ``` 以上是一个简单的自动售货机代码框架,其中包括状态机、硬件输入和输出等模块。具体实现细节需要根据实际情况进行调整。希望对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值