zoukankan      html  css  js  c++  java
  • 自动售饮料机的verilog实现

    自动售饮料机的verilog实现。

    每瓶饮料2.5元,可投入0.5与1.0两种硬币,具有找零功能。

    说明:此处只是功能的简单实现,没有过多考虑实际售饮料机功能的完整性,可根据需要在此基础上进行修改,、。

    代码:

      1 module drink_seller(rst_n,
      2                             clk,
      3                             buy,
      4                             money,
      5                             drink,
      6                             change
      7                                  );
      8 input rst_n;
      9 input clk;
     10 input buy;
     11 input [1:0] money;
     12 
     13 output drink;
     14 output [1:0] change;
     15 
     16 parameter IDLE = 6'b000001;  //空闲状态
     17 parameter S0 = 6'b000010;     //投币0.5元
     18 parameter S1 = 6'b000100;     //投币0.5元
     19 parameter S2 = 6'b001000;    //投币1.0元
     20 parameter S3 = 6'b010000;    //投币1.5元
     21 parameter S4 = 6'b100000;    //投币2.0元
     22 
     23 reg [5:0] cur_state;
     24 reg [5:0] nxt_state;
     25 
     26 reg drink;
     27 reg [1:0] change;
     28 
     29 //状态寄存,时序逻辑
     30 always@(posedge clk)
     31     if(!rst_n)
     32         cur_state <= 6'b0;
     33     else
     34         cur_state <= nxt_state;
     35 
     36 //状态转换,组合逻辑        
     37 always@(*)
     38     if(!rst_n)
     39         //nxt_state = 6'b0;
     40         nxt_state = IDLE;
     41     else
     42         begin
     43             case(cur_state)
     44             IDLE : if(buy)
     45                         nxt_state = S0;
     46                      else
     47                        nxt_state = IDLE;
     48             S0 : case(money)   //开始投币
     49                          2'b00 :    nxt_state = S0;
     50                          2'b01 :    nxt_state = S1;
     51                          2'b10 :    nxt_state = S2;
     52                          2'b11 :    nxt_state = S3;         
     53                      endcase
     54             S1 : case(money)   //已投币0.5
     55                          2'b00 :    nxt_state = S1;
     56                          2'b01 :    nxt_state = S2;
     57                          2'b10 :    nxt_state = S3;
     58                          2'b11 :    nxt_state = S4;         
     59                      endcase    
     60             S2 : case(money)    //已投币1.0
     61                          2'b00 :    nxt_state = S2;
     62                          2'b01 :    nxt_state = S3;
     63                          2'b10 :    nxt_state = S4;
     64                          2'b11 :    nxt_state = IDLE;         
     65                      endcase
     66             S3 : case(money)    //已投币1.5
     67                          2'b00 :    nxt_state = S3;
     68                          2'b01 :    nxt_state = S4;
     69                          2'b10 :    nxt_state = IDLE;
     70                          2'b11 :    nxt_state = IDLE;         
     71                      endcase
     72             S4 : case(money)    //已投币2.0
     73                          2'b00 :    nxt_state = S4;
     74                          2'b01 :    nxt_state = IDLE;
     75                          2'b10 :    nxt_state = IDLE;
     76                          2'b11 :    nxt_state = IDLE;
     77                      endcase
     78             endcase
     79         end
     80         
     81 //输出控制,组合逻辑        
     82 always@(*)
     83     if(!rst_n)
     84         begin
     85             drink = 1'b0;
     86             change = 2'b00;
     87         end
     88     else begin
     89             case(cur_state)
     90             IDLE,S0,S1: 
     91                         begin 
     92                             drink = 1'b0;
     93                             change = 2'b00;
     94                         end
     95             S2 : case(money)
     96                         2'b11 :    
     97                              begin 
     98                                 drink = 1'b1;
     99                                 change = 2'b00;
    100                             end
    101                          default : 
    102                             begin 
    103                                 drink = 1'b0;
    104                                 change = 2'b00;
    105                             end
    106                      endcase
    107             S3 : case(money)
    108                          2'b10 :    
    109                             begin 
    110                                 drink = 1'b1;
    111                                 change = 2'b00;
    112                             end
    113                          2'b11 :    
    114                             begin 
    115                                 drink = 1'b1;
    116                                 change = 2'b01;
    117                             end
    118                         default : 
    119                             begin 
    120                                 drink = 1'b0;
    121                                 change = 2'b00;
    122                             end                     
    123                      endcase
    124             S4 : case(money)
    125                          2'b01 :    
    126                             begin 
    127                                 drink = 1'b1;
    128                                 change = 2'b00;
    129                             end
    130                          2'b10 :    
    131                             begin 
    132                                 drink = 1'b1;
    133                                 change = 2'b01;
    134                             end
    135                          2'b11 :    
    136                             begin 
    137                                 drink = 1'b1;
    138                                 change = 2'b11;
    139                             end
    140                         default : 
    141                             begin 
    142                                 drink = 1'b0;
    143                                 change = 2'b00;
    144                             end                     
    145                      endcase
    146             endcase
    147         end
    148 
    149 endmodule

    testbench:

     1 module drink_seller_tb;
     2 
     3     // Inputs
     4     reg rst_n;
     5     reg clk;
     6     reg buy;
     7     reg [1:0] money;
     8 
     9     // Outputs
    10     wire drink;
    11     wire [1:0] change;
    12 
    13     // Instantiate the Unit Under Test (UUT)
    14     drink_seller uut (
    15         .rst_n(rst_n), 
    16         .clk(clk), 
    17         .buy(buy),
    18         .money(money), 
    19         .drink(drink), 
    20         .change(change)
    21     );
    22     
    23     parameter CLK_PERIOD = 10;
    24 
    25     initial begin
    26         rst_n = 0;
    27         clk = 1;
    28         buy = 0;
    29         money = 0;
    30 
    31         #100;
    32         rst_n = 1;
    33         # CLK_PERIOD buy = 1;
    34         # CLK_PERIOD buy = 0;
    35         
    36         # 100 buy = 1;
    37         # CLK_PERIOD buy = 0;
    38         
    39         # 100 buy = 1;        
    40     
    41     end    
    42         
    43     always #(CLK_PERIOD/2) clk = ~clk;
    44     
    45     always@(posedge clk)
    46     if(!rst_n)
    47       money = 2'b00;
    48      else
    49       money = 2'b01;
    50 
    51 endmodule

    ISIM仿真结果:

  • 相关阅读:
    需要了解的项目
    vmware安装问题:Microsoft Runtime DLL安装程序未能完成安装
    rabbitmqctl 报错
    RabbitMQ快速入门python教程
    RabbitMQ消息队基本概念
    Windows RabbitMQ 添加用户、设置角色和权限 (包含无法添加的错误处理)
    转:Window10下RabbitMQ安装图文教程
    Windows下RabbitMQ安装及入门
    crontab 详细用法 定时任务
    转 RabbitMQ
  • 原文地址:https://www.cnblogs.com/youngforever/p/3119673.html
Copyright © 2011-2022 走看看