理论知识:
(1)状态机简写为FSM(Finite State Machine),也称为同步有限状态机。同步是指状态的变化都是在时钟的边沿发送变化,有限值得是状态的个数是可数的。
(2)分类:Moore型状态机(摩尔型)、Mealy型状态机(米利型)
(3)在FPGA低速系统中,如果状态机的状态个数小于四个,可以用二进制码;如果个数大于4个小于24个,推荐使用独热码,如果个数大于24个,推荐使用格雷码。在FPGA高速系统中,一律推荐独热码。
(4)
设计一个基于状态机的可乐机,要求投币三元出一瓶可乐:
(1)Visio视图:
(2)Verilog代码:
module fsm_cola(clk,reset_n,pi_money,po_cola);input clk;input reset_n;input pi_money;output reg po_cola;reg[2:0] state;parameter IDLE = 3'b001;parameter ONE = 3'b010;parameter TWO = 3'b100;//状态跳转设计:always@(posedge clk or negedge reset_n)if(!reset_n)state <= IDLE;else begincase(state)IDLE: beginif(pi_money)state <= ONE;else state <= state;endONE: beginif(pi_money)state <= TWO;else state <= state;endTWO: beginif(pi_money)state <= IDLE;else state <= state;enddefault:beginstate <= IDLE;endendcaseend//输出信号设计always@(posedge clk or negedge reset_n)if(!reset_n)po_cola <= 1'd0;else if((state == TWO) && (pi_money))po_cola <= 1'd1;else po_cola <= 1'd0;endmodule
(3)仿真文件代码:
`timescale 1ns / 1psmodule fsm_cola_tb;reg clk;reg reset_n;reg pi_money;wire po_cola;fsm_cola fsm_cola_inst(.clk(clk),.reset_n(reset_n),.pi_money(pi_money),.po_cola(po_cola));initial clk = 1'd1;always #10 clk = ~clk;initial beginreset_n <= 1'd0;pi_money <= 1'd0;#15;reset_n <= 1'd1;#1500;$stop;endalways #200 pi_money <= ~ pi_money;endmodule
(4)仿真波形: