FPGA——zhixin培训 Day_03——任意奇偶分频+自动售货机

A、任意奇偶分频

  • 设计背景:

上一篇已讲分频,但其为偶数分频,占空比只为1:1;有时候需要奇数分频,本文所介绍的就是任意奇偶分频。

二、设计需求:

利用verilog语言编写代码使其可任意分频。

如奇数分频:实现5分频;高电平占用3个时钟周期;低电平占用两个时钟周期。

  • 系统架构图:

FPGA——zhixin培训 Day_03——任意奇偶分频+自动售货机

FPGA——zhixin培训 Day_03——任意奇偶分频+自动售货机

  • 思路与方案:
  •  
  • FPGA——zhixin培训 Day_03——任意奇偶分频+自动售货机

    四、代码:

    0   module divide(clk,rst_n,clk_out);

    1

    2      input                           clk;                  //50MHz

    3      input                           rst_n;            //低电平有效

    4     

    5      output reg               clk_out;        //输出的时钟:5分频

    6     

    7      parameter wide = 10;

    8      parameter s0 = 1'b0;

    9      parameter s1 = 1'b1;

    10     parameter HW = 3;

    11     parameter LW = 2;

    12    

    13     reg[wide-1:0]            cnt;

    14     reg                             state;

    15

    16     always @(posedge clk or negedge rst_n)

    17     begin

    18         if(!rst_n)

    19            begin

    20                cnt <= 10'd0;

    21                clk_out <= 0;

    22                state <= s0;

    23            end

    24         else

    25            begin

    26                case(state)

    27                   s0:begin

    28                          if(cnt < HW-1)

    29                              begin

    30                                 cnt <= cnt + 1'b1;

    31                              end

    32                          else

    33                              begin

    34                                 cnt <= 10'b0;

    35                                 clk_out <= 1'b0;

    36                                 state <= s1;

    37                              end

    38                       end

    39                      

    40                   s1:begin

    41                          if(cnt <LW-1)

    42                              begin

    43                                 cnt <= cnt + 1'b1;

    44                              end

    45                          else

    46                              begin

    47                                 cnt <= 10'b0;

    48                                 clk_out <= 1'b1;

    49                                 state <= s0;

    50                              end

    51                       end

    52                      

    53                   default: state <= 0;

    54                endcase

    55            end

    56           

    57     end

    58    

    59  endmodule

    四、仿真验证:

  • 编写完仿真代码后进行仿真:

    FPGA——zhixin培训 Day_03——任意奇偶分频+自动售货机

    与设计相符

    B、自动售货机(练习)

    一、设计需求:

    1、1种商品(饮料);

    2、一种价格(3.5);

    3、只能一次性输入金币面额(5角,1元);

    4、输入金钱数大于3.5元,需要找零,并售出该商品。

    要求:能够在仿真里面能看到所需设计功能。使用状态机实现。

    二、架构图:

    FPGA——zhixin培训 Day_03——任意奇偶分频+自动售货机

     

    Clk

    50MHz

    Rst_n

    复位

    M05

    五角

    M10

    一元

    M

    找零

    Good

    商品

    Led

    报警警示

    FPGA——zhixin培训 Day_03——任意奇偶分频+自动售货机

  •  

  • 代码:
  •  

    0  module auto_good(clk,rst_n,M05,M10,M,good,led);

    1 

    2      input                       clk;            //50MHz

    3      input                       rst_n;

    4      input                       M05;       //五角

    5      input                       M10;      //一元

    6     

    7      output reg               M;           //找零

    8      output reg           good;      //商品

    9      output reg           led;         //报警,警示

    10    

    11     reg [9:0]              state;

    12    

    13     parameter s00 =      10'b000_000_0001;

    14     parameter s05 =      10'b000_000_0010;

    15     parameter s10 =      10'b000_000_0100;

    16     parameter s15 =      10'b000_000_1000;

    17     parameter s20 =      10'b000_001_0000;

    18     parameter s25 =      10'b000_010_0000;

    19     parameter s30 =      10'b000_100_0000;

    20     parameter s35 =      10'b001_000_0000;

    21     parameter s40 =      10'b010_000_0000;

    22

    23     always @(posedge clk or negedge rst_n)

    24     begin

    25         if(!rst_n)

    26            begin

    27                state <= s00;

    28                led <= 1;

    29                good <= 0;

    30                M <= 0;

    31            end

    32         else

    33            begin

    34                case(state)

    35                   s00:begin

    36                              if(M05)

    37                                     begin

    38                                        state <= s05;

    39                                     end

    40                              else if(M10)

    41                                     begin

    42                                        state <= s10;

    43                                     end

    44                            else

    45                                 begin

    46                                 state <= s00;

    47                                 led <= 1;

    48                                 good <= 0;

    49                                 M <= 0;

    50                                 end

    51                          end

    52                   s05:begin

    53                              if(M05)

    54                                     begin

    55                                        state <= s10;

    56                                     end

    57                              else if(M10)

    58                                     begin

    59                                        state <= s15;

    60                                     end

    61                          end

    62                   s10:begin

    63                              if(M05)

    64                                     begin

    65                                        state <= s15;

    66                                     end

    67                              else if(M10)

    68                                     begin

    69                                        state <= s20;

    70                                     end

    71                          end

    72                   s15:begin

    73                              if(M05)

    74                                     begin

    75                                        state <= s20;

    76                                     end

    77                              else if(M10)

    78                                     begin

    79                                        state <= s25;

    80                                     end

    81                          end

    82                   s20:begin

    83                              if(M05)

    84                                     begin

    85                                        state <= s25;

    86                                     end

    87                              else if(M10)

    88                                     begin

    89                                        state <= s30;

    90                                     end

    91                          end

    92                   s25:begin

    93                              if(M05)

    94                                     begin

    95                                        state <= s30;

    96                                     end

    97                              else if(M10)

    98                                     begin

    99                                        state <= s35;

    100                                    end

    101                         end

    102                  s30:begin

    103                             if(M05)

    104                                    begin

    105                                       state <= s35;

    106                                    end

    107                             else if(M10)

    108                                    begin

    109                                       state <= s40;

    110                                    end

    111                         end

    112                  s35:begin

    113                             if(M05 || M10)

    114                                begin

    115                                    led <= 1'b0;

    116                                end

    117                             else

    118                                begin

    119                                    good <= 1'b1;

    120                                    M <= 1'b0;

    121                                    state <= s00;

    122                                end

    123                         end

    124                  s40:begin

    125                             if(M05 || M10)

    126                                begin

    127                                    led <= 1'b0;

    128                                end

    129                             else

    130                                begin

    131                                    good <= 1'b1;

    132                                    M <= 1'b1;

    133                                    state <= s00;

    134                                end

    135                         end

    136                  default:  state <= s00;

    137               endcase

    138           end

    139    end

    140

    141  endmodule

  • 五、仿真验证:

    0   `timescale 1ns/1ns

    1

    2   module tb_auto_good();

    3

    4      reg                      clk;            //50MHz

    5      reg                      rst_n;

    6      reg                      M05;       //五角

    7      reg                      M10;      //一元

    8     

    9      wire                  M;           //找零

    10     wire                  good;      //商品

    11     wire                  led;         //报警,警示

    12

    13     auto_good auto_good_inst(

    14         .clk(clk),

    15         .rst_n(rst_n),

    16         .M05(M05),

    17         .M10(M10),

    18         .M(M),

    19         .good(good),

    20         .led(led)

    21     );

    22

    23     initial

    24         begin

    25            clk = 1;

    26            rst_n = 0;

    27            M10 = 0;

    28            M05 = 0;

    29            #100.1

    30            rst_n = 1;

    31            #100

    32            M10 = 1;

    33            #20

    34            M10 = 1;

    35            #20

    36            M10 = 1;

    37            #20

    38            M05 = 0;

    39            M10 = 1;

    40            #20

    41            M05 = 0;

    42            M10 = 0;

    43            #20

    44            M05 = 0;

    45            M10 = 0;

    46            #1000

    47            $stop;

    48         end

    49     always #10 clk = ~clk;

    50

    51   endmodule

     

    FPGA——zhixin培训 Day_03——任意奇偶分频+自动售货机

    例:投四元,输出商品一件,找零,满足条件

  • 重要说明
  • 注意仿真时候对M05和M10的赋值,应该在一个周期赋一次,并且最后一定要将赋的值清零;

    仿真多试验各种情况。