基于FPGA的自动售货机设计Verilog代码Quartus仿真

名称:基于FPGA的自动售货机设计Verilog代码Quartus仿真(文末获取)

软件:Quartus

语言:Verilog

代码功能:

自动售货机设计

要求

1.利用外部按键当作外部的输入,利用数码管、蜂鸣器和LED作为输出表示。

2.外部输入有1元的按键、0.5元的按键和选择商品的按键。

3.无论什么按键按下,蜂鸣器都要出声音

4.共有两种商品,一种商品2.5元,另一种商品3.5元。

5.在投钱之前,必须要选择商品,如果没有选择,则默认第一种(2.5元)。投钱的过程中,不允许更换商品。每次卖出商品或者钱数被清零的话,商品也要恢复默认。

6.第一个数码管显示选择的商品(1:优表2.5元商品。2:代表3.5元的商品)

7.最后两个数码管显示当前所投入的钱数(中间的点需要点亮)

8.2.5元的商品卖出采用1个LED亮1s来表示。3.5元的商品卖出采用2个LED亮1s来表示

9.找零的话,采用1个LED呼吸灯(呼吸4S)。

10.投钱过程中,需要倒计时,倒计时的时间为1min。如果1min之内没有连续投入钱币,则钱数自动清零。倒计时,显示在第二个和第三个数码管上

1. 工程文件

2. 程序文件

3. 程序编译

4. RTL图

5. Testbench

6. 仿真图

整体仿真图

下图为选择2.5元商品,投币1+0.5+0.5+1=3元,有找零的仿真过程

下图为选择3.5元商品,投币1+1+1+0.5=3.5元,没有找零的仿真过程

可以看到led点亮1秒后,回到默认选择2.5元商品(goods_select=1)

部分代码展示:

//售货机
module auto_sell(
input clk,//100Hz
input rst_p,//复位
input coin_1_key,//1元输入按键
input coin_05_key,//0.5元输入按键
input select_key,//商品选择按键
output beep,//蜂鸣器
output [7:0] HEX1,//数码管1,1代表2.5元,2代表3.5元
output [7:0] HEX2,//数码管2,显示60s倒计时
output [7:0] HEX3,//数码管3,显示60s倒计时
output [7:0] HEX4,//数码管4,显示投入钱数
output [7:0] HEX5,//数码管5,显示投入钱数
output [1:0]LED,//卖出,2.5元1个LED亮,3.5元2个led亮
output PWM_LED//找零呼吸灯
);
wire [3:0] goods_select;//所选商品
wire [7:0] seconds_60;//60s倒计时
wire [7:0] total_money;//投币金额
wire coin_1;
wire coin_05;
wire select;
//按键响蜂鸣器
assign beep=(coin_1_key | coin_05_key | select_key) & clk;
//按键控制,将按键转换为1个时钟的高电平信号
key_debounce i1_key_debounce(
. clk(clk),//100Hz
. key_in(coin_1_key),//按键输入
. key_out(coin_1)//1个时钟的高电平信号输出
);
//按键控制,将按键转换为1个时钟的高电平信号
key_debounce i2_key_debounce(
. clk(clk),//100Hz
. key_in(coin_05_key),//按键输入
. key_out(coin_05)//1个时钟的高电平信号输出
);
//按键控制,将按键转换为1个时钟的高电平信号
key_debounce i3_key_debounce(
. clk(clk),//100Hz
. key_in(select_key),//按键输入
. key_out(select)//1个时钟的高电平信号输出
);
//售货机控制模块
sell_ctrl i_sell_ctrl(
. clk(clk),//100Hz
. rst_p(rst_p),//复位
. coin_1(coin_1),//1元输入,一个时钟高电平
. coin_05(coin_05),//0.5元输入,一个时钟高电平
. select(select),//商品选择,一个时钟高电平
. goods_select(goods_select),//所选商品
. seconds_60(seconds_60),//60s倒计时
. total_money(total_money),//投币金额
. LED(LED),//卖出,2.5元1个LED亮,3.5元2个led亮
. PWM_LED(PWM_LED)//找零呼吸灯
);
//数码管显示模块
display i_display(
. clk(clk),//100Hz
. goods_select(goods_select),//所选商品
. seconds_60(seconds_60),//60s倒计时
. total_money(total_money),//投币金额
. HEX1(HEX1),//数码管1,1代表2.5元,2代表3.5元
. HEX2(HEX2),//数码管2,显示60s倒计时十位
. HEX3(HEX3),//数码管3,显示60s倒计时个位
. HEX4(HEX4),//数码管4,显示投入钱数
. HEX5(HEX5)//数码管5,显示投入钱数
);
endmodule
源代码

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

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于FPGA的数字计频器的Verilog代码,同时包含了Quartus II的仿真测试代码: ```verilog module freq_counter ( input clk, // 输入时钟 input reset, // 复位信号 input start, // 开始计数信号 output reg [31:0] freq_count // 输出计数器计数值 ); reg [31:0] count; // 内部计数器 always @(posedge clk) begin if (reset) begin count <= 0; freq_count <= 0; end else if (start) begin count <= count + 1; freq_count <= count; end end endmodule module freq_counter_test(); reg clk; reg reset; reg start; wire [31:0] freq_count; freq_counter counter( .clk(clk), .reset(reset), .start(start), .freq_count(freq_count) ); initial begin clk = 0; reset = 1; start = 0; #10 reset = 0; #100 start = 1; #1000 start = 0; #100000 $finish; end always #5 clk = ~clk; endmodule ``` 在这个例子中,我们定义了一个频率计数器模块`freq_counter`,它包含了一个时钟输入`clk`、一个复位信号`reset`、一个开始计数信号`start`和一个计数器计数值输出`freq_count`。在每个时钟上升沿时,如果复位信号为1,则计数器复位为0;如果开始计数信号为1,则计数器加1,并将计数器计数值赋值给输出端口。 我们还定义了一个测试模块`freq_counter_test`,它包含了一个时钟输入`clk`、一个复位信号`reset`、一个开始计数信号`start`和一个计数器计数值输出`freq_count`。在测试模块中,我们通过给时钟、复位和开始计数信号赋值的方式来测试计数器模块的功能。具体来说,我们在仿真开始时将复位信号置为1,经过一段时间后将其置为0,然后在一定时间后将开始计数信号置为1,经过一定时间后再将其置为0。最后,在一定时间后仿真结束。 在Quartus II中,我们可以通过仿真波形来验证计数器模块是否能够正确地计数。具体来说,我们可以打开波形编辑器,将测试模块的输入和输出端口添加到波形中,然后运行仿真。在仿真结果中,我们可以看到计数器模块的计数值是否与预期相符。如果相符,则说明计数器模块的功能是正确的。 希望这个Verilog代码Quartus II仿真测试代码对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值