今天给大侠带来“FPGA学习系列 altera"系列,持续更新。此学习心得是本人之前所写,所用设计软件为Quartus II 13.1,现Quartus II 新版本已更新到19+,以下仅供初学者学习参考。后续会更新其他系列,敬请关注。话不多说,上货。

对于每一个的小实验,我们都可以把它看作是一个小项目,逐步的去分析,设计,调试,最后完成功能。下面我们就开始我们的“小项目”。

项目名称:自动售货机

具体要求:一个饮料自动售货机,一听饮料的售价2.5美元,可以使用两种硬币:1美元(one_dollar),0.5美元(half_dollar),同时售货机有找零的功能。

架构图如下:

  • one_dollar:代表投入1美元硬币

  • half_dollar:代表投入0.5美元硬币

  • half_out:表示找零信号

  • dispense:表示机器售出一听饮料

系统设计:

1. 工程的名称:sell

2. 状态转移图如下:

  • IDLE:没有钱的状态

  • HALF:0.5美元的状态

  • ONE:1美元的状态

  • ONE_HALF:1.5美元的状态

  • TWO:2美元的状态

由于此状态转移图较为简单,故而没有写出转移条件,读者简单分析就可理解。例如:当前已经投入1美元,若再次投入1美元时,应该进入2美元的状态。

设计代码如下:

/*模块名称:sell模块功能:一个饮料自动售货机,每听饮料的售价2.5美元,可以使用两种硬币:1美元(one_dollar),0.5美元(half_dollar),同时售货机有找零的功能。作者:郝旭帅邮箱:746833924@qq.com*/module sell (clk, rst_n, half_dollar, one_dollar, dispense, half_out);  input clk;  input rst_n;  input half_dollar;  input one_dollar;  output reg dispense;  output reg half_out;  reg [2:0] state;//状态寄存器  localparam IDLE = 3'b000,//定义状态          HALF = 3'b001,          ONE = 3'b010,          ONE_HALF = 3'b011,          TWO = 3'b100;  always @ (posedge clk or negedge rst_n)    begin      if (!rst_n)        begin          state <= IDLE;          dispense <= 1'b0;          half_out <= 1'b0;        end      else        begin          case (state)            IDLE : begin                  if (one_dollar)                    begin                      state <= ONE;                      dispense <= 1'b0;                      half_out <= 1'b0;                    end                  else                    begin                      if (half_dollar)                        begin                          state <= HALF;                          dispense <= 1'b0;                          half_out <= 1'b0;                        end                      else                        begin                          state <= IDLE;                          dispense <= 1'b0;                          half_out <= 1'b0;                        end                    end                end            HALF : begin                  if (one_dollar)                    begin                      state <= ONE_HALF;                      dispense <= 1'b0;                      half_out <= 1'b0;                    end                  else                    begin                      if (half_dollar)                        begin                          state <= ONE;                          dispense <= 1'b0;                          half_out <= 1'b0;                        end                      else                        begin                          state <= HALF;                          dispense <= 1'b0;                          half_out <= 1'b0;                        end                    end                end              ONE : begin                    if (one_dollar)                      begin                        state <= TWO;                        dispense <= 1'b0;                        half_out <= 1'b0;                      end                    else                      begin                        if (half_dollar)                          begin                            state <= ONE_HALF;                            dispense <= 1'b0;                            half_out <= 1'b0;                          end                        else                          begin                            state <= ONE;                            dispense <= 1'b0;                            half_out <= 1'b0;                          end                      end                  end              ONE_HALF : begin                    if (one_dollar)                      begin                        state <= IDLE;                        dispense <= 1'b1;                        half_out <= 1'b0;                      end                    else                      begin                        if (half_dollar)                          begin                            state <= TWO;                            dispense <= 1'b0;                            half_out <= 1'b0;                          end                        else                          begin                            state <= ONE_HALF;                            dispense <= 1'b0;                            half_out <= 1'b0;                          end                      end                  end                TWO : begin                  if (one_dollar)                    begin                      state <= IDLE;                      dispense <= 1'b1;                      half_out <= 1'b1;                    end                  else                    begin                      if (half_dollar)                        begin                          state <= IDLE;                          dispense <= 1'b1;                          half_out <= 1'b0;                        end                      else                        begin                          state <= TWO;                          dispense <= 1'b0;                          half_out <= 1'b0;                        end                    end                end              default : state <= IDLE;          endcase        end    endendmodule

激励代码如下:

/*模块名称:sell_tb模块功能:为sell模块提供激励信号作者:郝旭帅邮箱:746833924@qq.com*/`timescale 1ns/1psmodule sell_tb;  reg clk;  reg rst_n;  reg half_dollar;  reg one_dollar;  wire dispense;  wire half_out;  initial begin    clk = 1'b1;    rst_n = 1'b0;    half_dollar = 1'b0;//复位期间,不投入任何硬币    one_dollar = 1'b0;    # 200.1    rst_n = 1'b1;    # 200    half_dollar = 1'b1;//0.5美元    # 20     half_dollar = 1'b0;    # 200    one_dollar = 1'b1; //1美元    # 20     one_dollar = 1'b0;    # 200    half_dollar = 1'b1; //0.5美元    # 20     half_dollar = 1'b0;    # 200    one_dollar = 1'b1; //1美元    # 20     one_dollar = 1'b0;    # 2000     $stop;  end  always # 10 clk = ~clk;//系统时钟为50MHz  sell sell_dut(      .clk(clk),      .rst_n(rst_n),      .half_dollar(half_dollar),      .one_dollar(one_dollar),      .dispense(dispense),      .half_out(half_out)    );endmodule

解析:

由于驱动时钟(本地晶振)为50MHz,我们外部投入硬币的信号的高电平的时间必须和驱动时钟的周期相同,若时间过短,系统采集不到外部硬币投入信号,若过长,系统会认为外部连续多次投入硬币。所以:

one_dollar = 1'b1; //1美元

# 20 //驱动时钟为50MHz,故而高电平持续时间为20ns

one_dollar = 1'b0;

# 200

仿真波形如下:

当输入0.5+1+0.5+1 = 3时,输出饮料并找零。

如果本地晶振和笔者的设计不同,请自行更改设计,以保证设计的正确性。如果还是有不明白的读者可以发邮件到我邮箱或者加群询问。

END

制作人:郝旭帅(QQ:746833924)

QQ交流群:173560979(进群备注地区+名字)

大侠们,江湖偌大,继续闯荡,愿一切安好,有缘再见!

FPGA学习altera 系列 第十七篇 自动售货机设计相关推荐

  1. 奋斗的小孩系列 FPGA学习altera系列: 第十七篇 自动售货机设计

    奋斗的小孩系列 FPGA学习altera系列: 第十七篇 自动售货机设计 作者:奋斗的小孩 郝旭帅(转载请注明出处) 大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分.大侠可以关注FPGA技术 ...

  2. 奋斗的小孩系列 FPGA学习altera系列: FPGA学习altera 系列 第二十一篇 数码管设计

    奋斗的小孩系列 FPGA学习altera系列: FPGA学习altera 系列 第二十一篇 数码管设计 作者:奋斗的小孩 郝旭帅(转载请注明出处) 大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是 ...

  3. 奋斗的小孩系列 FPGA学习altera系列: 第十篇 按键控制LED

    奋斗的小孩系列 FPGA学习altera系列: 第十篇 按键控制LED 作者:奋斗的小孩 郝旭帅(转载请注明出处) 大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分.大侠可以关注FPGA技术江 ...

  4. 奋斗的小孩系列 FPGA学习altera系列: 第七篇 添加激励及功能仿真操作

    奋斗的小孩系列 FPGA学习altera系列: 第七篇 添加激励及功能仿真操作 作者:奋斗的小孩 郝旭帅(转载请注明出处) 大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分.大侠可以关注FPG ...

  5. 源码系列:基于FPGA的自动售货机设计(附源工程)

    今天给大侠带来基于FPGA的自动售货机设计,附源码,获取源码,请在"FPGA技术江湖"公众号内回复" 自动售货机设计源码",可获取源码文件.话不多说,上货. 设 ...

  6. 基于verlog的简单自动售货机设计

    课程设计:基于verlog的简单自动售货机设计 1.设计目的: (1)了解DE2-70开发板的硬件构成: (2)熟悉开发板可用资源的硬件电路: (3)掌握EDA开发流程: (4)熟悉Quartus I ...

  7. 基于51单片机自动售货机设计全套资料

    基于51单片机自动售货机设计(原理图+PCB+文档+程序) 项目编号:0001 硬件构成: 本设计由STC系列单片机+12864显示+电源模块+按键模块+蜂鸣器报警模块等元件组功能介绍: 设有8个按键 ...

  8. 基于PLC的自动售货机设计

    1.1 自动售货机设计软元件 1.1.1 定时器 定时器是PLC中重要的编程元件,是累计时间增量的内部器件.定时器的工作过程与继电器控制系统的时间继电器基本相同,但它没有瞬动触点,失电时,常闭触点闭合 ...

  9. FPGA自动售货机设计

    1.总体设计 采用FPGA来设计的原理图如图1.1所示.它由控制输入电路.FPGA.显示电路电路组成.   图1.1 采用FPGA设计的自动售货机原理方框图 控制输入电路主要是为用户设计的,起到一个输 ...

最新文章

  1. (C++)用指针实现两数交换函数swap()的两种方法
  2. 如何下载DELL服务器VMware ESXi镜像
  3. PyQt5简介及demo
  4. spring + mybatis 注解 @Transactional失效
  5. 简单 3 步实现高效编程
  6. ReultSet有什么作用和使用
  7. 怎么用python黑别人电脑_超级黑科技代码!用Python打造电脑人脸屏幕解锁神器附带接头暗号!...
  8. Docker Desktop 安装使用教程
  9. 达朴汇联CEO张焱:从隐私计算出发,共建Web3.0
  10. ‘lengths‘ argument should be a 1D CPU int64 tensor, but got 1D cuda:0 Long tensor
  11. java idea导入ecli项目
  12. 如何使用Android Studio将网站转换为Android App
  13. 我的人生历程之第一篇:游戏篇(b)
  14. MAME模拟器debug帮助文档汉化二(常规指令)
  15. SteamVR手柄震动控制实现
  16. 最大团问题(使用递归和非递归两种方法)
  17. 信息收集(四)服务器信息收集
  18. java JDBC连接MySQL数据库调用存储过程进行查询
  19. MacBookPro M2芯片下如何搭建React-Native环境
  20. lftp的使用以及常见的指令

热门文章

  1. 使用MATLAB快速计算Khatri-Rao积
  2. ThinkJS 简介
  3. 如何在eolinker做参数绑定
  4. Java三期SSM-MyBatis
  5. SpringBoot - 网络请求客户端WebClient使用详解
  6. 俄罗斯----中国人对它的颠覆性---不正确的神话
  7. es启动报错:could not find java in JAVA_HOME at /elk/es/elasticsearch-7.11.1/jdk/bin/java
  8. Tecnomatix plant simulation 天车模块使用
  9. USB之SE0、SE1
  10. STM32CubeMX--STM32L0系列外置DAC芯片(LTC2600)电压输出