题目如下所示:
请设计状态机电路,实现自动售卖机功能,A饮料5元钱,B饮料10元钱,售卖机可接收投币5元钱和10元钱,每次投币只可买一种饮料,考虑找零的情况。

电路的接口如下图所示。sel信号会先于din信号有效,且在购买一种饮料时值不变。

sel为选择信号,用来选择购买饮料的种类,sel=0,表示购买A饮料,sel=1,表示购买B饮料;
din表示投币输入,din=0表示未投币,din=1表示投币5元,din=2表示投币10元,不会出现din=3的情况;
drinks_out表示饮料输出,drinks_out=0表示没有饮料输出,drinks_out=1表示输出A饮料,drinks_out=2表示输出B饮料,不出现drinks_out =3的情况,输出有效仅保持一个时钟周期;
change_out表示找零输出,change_out=0表示没有找零,change_out=1表示找零5元,输出有效仅保持一个时钟周期。
接口电路图如下

程序编写:
module sale(
input clk,
input rst_n,
input sel, //sel = 0 A drinks
//sel = 1 B drinks
input [1:0] din, // din = 0 no money
// din = 1 5r
// din = 2 10r
output reg [1:0] drinks_out, //drinks_out = 0 no drinks output
// drinks_out = 1 out A drinks
// drinks_out = 2 out B drinks
output reg change_out // change_out = 0 no change
// change_out =1 chang 5r
);
parameter IDLE = 'd0;
parameter S0 = 'd1; //此状态为饮料B 但第一次只投了五元钱

reg [1:0]cur_state;
reg [1:0]next_state;

always@(posedge clk or negedge rst_n)
begin
if(rst_n == 'd0)
begin
cur_state <= IDLE;
next_state <= 'd0;
end
else
cur_state <= next_state;
end

always@(*)
begincase(cur_state)IDLE : next_state = sel?(din==1 ? S0 : IDLE):IDLE;  //sel=1 即选择B饮料,判断第一次投入的是五元钱还是10元钱,若投的是五元钱则进入状态S0,等待第二次投钱S0 : next_state = (din == 0) ? S0 : IDLE;default: next_state = IDLE;endcaseend
always@(posedge clk or negedge rst_n)
beginif(rst_n == 'd0)drinks_out <= 'd0;else if(sel == 'd0)beginif((cur_state==IDLE&&din==1)||(cur_state ==IDLE&&din==2))drinks_out <= 'd1;elsedrinks_out <= 'd0;endelse if(sel == 'd1)beginif((cur_state == IDLE&&din=='d2)||(cur_state ==S0&&din=='d1)||(cur_state ==S0&&din=='d2)) drinks_out <= 'd2;elsedrinks_out <= 'd0;end
endalways@(posedge clk or negedge rst_n) //这里涉及到第一次投入的是五元钱第二次投入五元钱还是十元钱的情况,第二次投入五元则不找零,投入十元则找零
beginif(rst_n =='d0)change_out <= 'd0;else if(sel =='d0)beginif(cur_state ==IDLE&&din=='d2)change_out <= 'd1;elsechange_out <= 'd0;endelse if(sel =='d1)beginif(cur_state == S0&&din=='d2)change_out <= 'd1;elsechange_out <= 'd0;end
end

endmodule

-------------------------------------------------------——————————————————————————————————
编写testbench测试:

module sale_tb;

reg clk;
reg rst_n;
reg sel;
reg [1:0] din;

wire [1:0]drinks_out;
wire change_out;

initial begin
clk = 0;
forever #5 clk = ~clk;
end

initial begin
rst_n = 0;
sel = 0;
din = 0;
#100
rst_n = 1;
#10
sel = 0;
#10
din = 1;
#10
sel =1;
#10
din =2;
#10
sel =1;
#10
din=1;
#10
din =2;
#10
sel =0;
#10
din =2;
#10
din= 0;
#100

$finish;

end
sale sale_m0(
.clk(clk),
.rst_n(rst_n),
.sel(sel), //sel = 0 A drinks
//sel = 1 B drinks
.din(din), // din = 0 no money
// din = 1 5r
// din = 2 10r
.drinks_out(drinks_out), //drinks_out = 0 no drinks output
// drinks_out = 1 out A drinks
// drinks_out = 2 out B drinks
.change_out(change_out) // change_out = 0 no change
// change_out =1 chang 5r
);

endmodule

仿真结果:

代码下载(包含testbench):
https://download.csdn.net/download/weixin_44413306/85844663

verilog 实现自动售卖机相关推荐

  1. 2021年oppo哲库数字IC岗位手撕代码真题(含:握手信号、自动售卖机、序列发生器、根据RTL写verilog)

    大家好,最近汇总了2021年oppo哲库招聘手撕代码题目,本文章一共含有以下几个题目: 一,使用握手信号实现跨时钟域数据传输(verilog) 二,自动售卖机(verilog) 三,序列发生器(ver ...

  2. 带七段式数码显示管的自动售卖机设计(verilog自学笔记之有限状态机的设计)

    采用三段式的方法写一个自动售卖机,功能如下: 共有三种纸币入口,分别支持10元,20元,50元.货物售价80元.需要支持找钱功能(注意,找钱有两种情况,90元和100元:110元和120元的情况不符合 ...

  3. 《牛客刷verilog》Part III Verilog企业真题

    前言 之前刷过HDLbits上面的题目,点击链接可以查看详细笔记:verilog练习:hdlbits网站系列完结! 最近又想刷一下牛客上面的题目,可以点击链接与小编一起刷题:牛客刷题 小编不才,文中如 ...

  4. Verilog与SystemVerilog编程陷阱:怎样避免101个常犯的编码错误

    这篇是计算机类的优质预售推荐>>>><Verilog与SystemVerilog编程陷阱:怎样避免101个常犯的编码错误> 编辑推荐 纠错式学习,从"陷阱 ...

  5. 芯片开发语言:Verilog 在左,Chisel 在右

    来源 | 老石谈芯 在最近召开的RISC-V中国峰会上,中科院计算所的包云岗研究员团队正式发布了名为"香山"的开源高性能处RISC-V处理器.前不久我有幸和包老师就这个事情做了一次 ...

  6. sublime Text3安装和verilog安装

    百度下载sublime text3,安装 百度:sublime text 3 Package Control安装步骤 (在sublime中安装package control) 到官网去下载Packag ...

  7. 关于Verilog HDL的一些技巧、易错、易忘点(不定期更新)

    本文记录一些关于Verilog HDL的一些技巧.易错.易忘点等(主要是语法上),一方面是方便自己忘记语法时进行查阅翻看,另一方面是分享给大家,如果有错的话,希望大家能够评论指出. 关键词: ·技巧篇 ...

  8. Verilog代码规范I

    Verilog代码规范I "规范"这问题 "规范"这个富含专业气息的词汇(个人感觉),其实规范这种东西,就是大家都约定熟成的东西,一旦你不遵守这个东西,专业人士 ...

  9. Verilog有符号数运算

    在数字电路中,出于应用的需要,我们可以使用无符号数,即包括0及整数的集合:也可以使用有符号数,即包括0和正负数的集合.在更加复杂的系统中,也许这两种类型的数,我们都会用到. 有符号数通常以2的补码形式 ...

最新文章

  1. Xamarin.Forms探索--使用 Xamarin.Forms 来创建跨平台的用户界面
  2. FPGA加载bit文件可以工作,加载mcs不能工作的原因
  3. Direct I/O
  4. Android检查网络状态步骤
  5. python穷举法搬砖_python 穷举法 算24点(史上最简短代码)-阿里云开发者社区
  6. 解惑(二)----- 如何通俗地理解Python中的if __name__ == ‘__main__‘
  7. 3d布料系统横向飘动_重磅首发!ZB 2021自带布料运算,独家中文字幕!妈妈再不担心我通宵改衣褶了...
  8. 安卓机高的地图要用浏览器打开_浏览器F12操作概述
  9. 计算机二级ppt为客户制作演示文稿,计算机二级ppt真题:制作介绍北京ppt
  10. true,false组合问题
  11. python列向输出字符串_Python读取字符串按列分配后按行输出
  12. ubuntu linux本地源,如何制作UbuntuLinux操作系统的本地源?
  13. VLSM(可变长子网掩码)图表
  14. php网站mysql数据库导入工具_phpstudy通过phpMyAdmin导入mysql数据库方法
  15. mysql sql优化_Mysql的SQL优化指北
  16. 6.pragma pack
  17. 统计每小时数据的处理
  18. (6)java的内存泄露问题
  19. 行程匹配的算法python_节约里程算法的python实现
  20. 计算机网络奇偶校验法,计算机网络基础知识之奇偶校验码

热门文章

  1. 计算机用户文件夹加密,怎么把文件夹加密(怎么给电脑文件夹加密)
  2. Jimoshi_三大框架完成DLS-物流管理系统的车辆管理系统增删改
  3. 计算机教师成绩分析总结与反思,2021期中考试成绩总结分析 教师期中总结反思【3篇】...
  4. 百度安全再次亮相安全顶级会议NDSS--研究幽灵代码利用片段检测的技术详解
  5. 电商秒杀 Springboot + Redis +RocketMq +Mysql
  6. 本周AI热点回顾:MIPS倒下投入RISC-V阵营;GPT-3数学不及格愁坏伯克利团队
  7. Wopti Utilities 7.74.7.702 注册方法注意事项
  8. 鼠标光标设置——就是玩儿~
  9. 隐藏添加删除程序中的程序在控制面板中的“添加/删除程序”项
  10. 如何成为月入5W的 IT 人?