Verilog设计实例(一):自动售货机设计实例

这篇具有很好参考价值的文章主要介绍了Verilog设计实例(一):自动售货机设计实例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

本系列为FPGA设计实例,基于Verilog HDL,题目一般是我在网上看到的一些FPGA相关的实验题目,基本会是一个实际场景的系统实现,而不是简单单元的设计,这是为了能更全面的练习,这些实例一般是可以基于FPGA进行实现的,因为正好手里有一块zynq板子,所以想把这个东西用起来,之前做一个卷积核,但是把ip集成到zynq上和arm核协同验证时一直不成功,所以希望也可以学习一下zynq的软硬件协同使用。

以上是本系列的目的,OK,废话不多说,让我们直接开始第一个开发实例:自动售货机系统的设计。来源:哈工大MOOC。

用状态机设计一个自动售货机

它的投币口每次只能投入一枚五角或一元的硬币。投入一元五角钱硬币后机器自动给出一杯饮料,投入2元钱(2枚一元硬币)后,在给出硬币的同时找零一枚五角的硬币,投币时仅支持一枚一枚投。

信号定义

clk				# 时钟信号输入
rst				# 系统复位信号
half_yuan		# 投入五角硬币信号,信号为“1”代表投入五角
one_yuan		# 投入一元硬币信号,信号为“1”代表投入一元
half_out		# 找零信号,"1"代表找零五角
dispense		# 售出信号,“1“代表售出一杯饮料
collect			# 取走饮料信号,“1”代表购买者取走饮料

状态机

规定三种状态:IDLE——未投币,half——投币五角,one——投币一元。

状态转移图:
状态转移信号为——one_yuan half_yuan/dispense half_out,示例:01/10
verilog自动售货机,Verilog&FPGA开发,fpga开发

自动售货机的Verilog描述:

verilog自动售货机,Verilog&FPGA开发,fpga开发
售货机模块的Verilog代码如下:

`timescale 1ns / 1ps

module vending_machine(
                        clk,
                        one_yuan,
                        half_yuan,
                        collect,
                        half_out,
                        dispense,
                        rst
    );

//定义端口
parameter idle=2'b00,half=2'b01,one=2'b10;
input one_yuan,half_yuan,rst,clk;
output reg collect,half_out,dispense;
reg[1:0] ST; //当前状态

//控制逻辑实现
always @(posedge clk)   begin
if(rst)
    begin 
        dispense <= 0;
        collect <= 0;
        half_out <= 0;
        ST <= idle;
    end
else
    case(ST)
    
        idle:
        if(half_yuan)
        begin
        dispense <= 0;
        collect <= 0;
        half_out <= 0;
        ST <= half;
        end
        else if(one_yuan)
        begin
        dispense <= 0;
        collect <= 0;
        half_out <= 0;
        ST <= one;
        end
        else
        begin
        dispense <= 0;
        collect <= 0;
        half_out <= 0;
        ST <= idle;
        end
            
            
        half:
        if(half_yuan)
        begin
        dispense <= 0;
        collect <= 0;
        half_out <= 0;
        ST <= one;
        end
        else if(one_yuan)
        begin
        dispense <= 1;
        collect <= 1;
        half_out <= 0;
        ST <= idle;        
        end
        else
        begin
        dispense <= 0;
        collect <= 0;
        half_out <= 0;
        ST <= half;
        end
        
        
        one:
        if(half_yuan)
        begin
        dispense <= 1;
        collect <= 1;
        half_out <= 0;
        ST <= idle;
        end
        else if(one_yuan)
        begin
        dispense <= 1;
        collect <= 1;
        half_out <= 1;
        ST <= idle;
        end
        else
        begin
        dispense <= 0;
        collect <= 0;
        half_out <= 0;
        ST <= one;
        end
        
        
        default:
        begin
        dispense <= 0;
        collect <= 0;
        half_out <= 0;
        ST <= idle;
        end
        
    endcase
end
//
endmodule

同时编写testbench激励:

`timescale 1ns / 1ps

module VM_tb();
    reg clk;
    reg rst;
    reg half_yuan;
    reg one_yuan;
    wire collect;
    wire half_out;
    wire dispense;
    
    vending_machine vm1(
                        .one_yuan(one_yuan),
                        .half_yuan(half_yuan),
                        .collect(collect),
                        .half_out(half_out),
                        .dispense(dispense),
                        .clk(clk),
                        .rst(rst)
    );
    
    always #10 clk = ~clk;
    
    always@(posedge clk)
    begin
    one_yuan = {$random}%2;
    half_yuan = ~one_yuan;//连续投币,每次投入一枚硬币
    end
    
    
    
    initial begin
    clk = 0;
    rst = 0;
    one_yuan = 0;
    half_yuan = 0;
    #20
    rst = 1;
    #40
    rst = 0;
    #1000
    $stop;
    end
    
endmodule

testbench激励中假设我们是连续投币,每次只能投一枚一元或五角硬币,硬币足够时就给出饮料,需要找零时即找零。

测试波形

在Vivado中跑仿真,波形截图如下:
verilog自动售货机,Verilog&amp;FPGA开发,fpga开发

从图中可以看到,黄色线前的时钟周期,先投了一元,然后黄色线处又接着投了一元,下一时钟周期给出饮料并且找零五角;给饮料的时钟周期也投了一元,下一周期再投了一元,然后再下一周期给出饮料并且找零,符合我们对售货机的行为描述。

改进之处

对于售货机来说,如果检测到投币后隔了较久才投下一个币,当前代码检测后one_yuan/half_yuan信号不归零,信号在下一个时钟沿可能会重复捕获,所以需要设置一次投币信号检测,检测完成后复原,避免投币信号未发生变化时被多次捕获。
当然也有别的方法来避免重复捕获,比如及时复原投币信号。
还可以为售货机添加其他功能,比如选择货物,补货提醒等更加实用的功能,模拟更多的需求场景。

总结

本实例是一个经典的开发实例,作为练手,可以用来熟悉状态机的设计与实现,对基本hdl语法练习以及基本的激励编写和调试能力练习也有很大的帮助。文章来源地址https://www.toymoban.com/news/detail-754224.html

到了这里,关于Verilog设计实例(一):自动售货机设计实例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于单片机的自动售货机系统设计

    欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 技术交流认准下方 CSDN 官方提供的联系方式   本文设计基于单片机的自动售货机系统,分为硬件电路设计与软件设计。硬件电路设计,本系统由ST(意法半导体)公司设计和生产的STM32F103C8T6单片

    2024年02月03日
    浏览(51)
  • 自动售货机控制系统的FPGA设计与实现

            采用VHDL语言设计一个自动售货机控制系统,要求能在MaxPlus Ⅱ软件平台进行仿真模拟,技术指标如下: 1)有2元、3元、8元商品;有1元、5元、10元钱币; 2)当投入的总币值大于顾客购买的商品单价时,机器提供商品并将余币退出,回到初始状态;若投入的总币值小

    2024年02月06日
    浏览(43)
  • stm32毕设 自动售货机设计与实现(源码+硬件+论文)

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月08日
    浏览(43)
  • python自动售货机

    分享python实现自动售货一个小作业 输入2进行购买商品,输入商品id和数量,可以选择不同商品,最后进行结账操作。 可以有两种查询方式,全部查询和按时间条件查询 具体操作如下: 全部查询: 时间条件查询: 就按4直接退出23333 其实就是参考路边的自动售货机贩卖饮料啥的,

    2024年02月11日
    浏览(31)
  • 基于FPGA的自动售货机

    目录 一、项目功能 二、设计思路 按键实现: 数码管 蜂鸣器 LED灯 三、流程图 四、代码实现 1、按键消抖  key_debounce.v  2、LED状态选择  led_drive.v 3、蜂鸣器模块   beep_drive.v 4、数码管位选信号选择  sel_drive.v 5、数码管段选信号选择     seg_drive.v 6、售货机按键选择处理

    2024年02月06日
    浏览(37)
  • 【FPGA入门八】自动售货机

    功能完整描述: KEY4:开关机按键,复位时,默认是关机状态,数码管和LED灯均不亮,同时蜂鸣器响,其余按键按下无效。 KEY3:在开机状态时,投币1元 KEY2:在开机状态时,投币为0.5元 KEY1:当投币但少于货物的价格时,取消订单,数码管显示为0.0,同时LED灯实现跑马灯2s然

    2024年02月08日
    浏览(37)
  • 【Python实训】饮品自动售货机

    这段代码定义了三个函数:show_goods()、total()和main()。show_goods()函数用于展示饮品信息,total()函数用于计算总额,main()函数用于控制整个饮品自动售货机的操作流程。 运行程序后,会首先调用show_goods()函数展示饮品信息,然后用户可以根据展示的信息选择饮品和数量,输入

    2024年02月05日
    浏览(44)
  • FPGA实现简易的自动售货机模型

    环境: 1、Quartus18.1 2、vscode 3、板子型号:EP4CE6F17C8N 要求: 自动售货机功能: 1.两个按键用于投币,1个1元,1个5角 2.一个按键用于商品选择,农夫山泉2块,干脆面1块5 3.找零 设计: 我们选择使用四个按键,分别用于投币一元、五角、商品选择、结算四个功能。用六位数码管

    2024年02月09日
    浏览(39)
  • 自动售货机销售数据分析与应用

    本书不仅适用于零基础的读者自学,还适用于教师教学,为了帮助读者更加高效地掌握本书的内容,本书提供了以下10项附加价值: (1)建模平台:提供一站式大数据挖掘建模平台,免配置,包含大量案例工程,边练边学,告别纸上谈兵 (2)视频讲解:提供不少于600分钟

    2024年02月08日
    浏览(44)
  • 【FPGA】基于状态机实现自动售货机模拟

    此自动售货机模拟基于EP4CE6F17C8开发板实现,用按键,led灯,数码管表示各个输入输出 功能: 此自动售货机可以选择A(三元)与B(五元)商品且选择商品数量,一次可以投1块与5块钱。当投币数量满足商品价格时则能出货,且退款额外支付,在任意阶段皆可以取消支付并退

    2024年02月16日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包