verilog 实现自动售饮料机
1. 设计思路
投币时可能可能出现 0 元,0.5 元,1 元,1.5 元,2 元,2.5 元,3 元,共 7 种情况
所以可以假设 5 种状态:
Idle——0 元、half——0.5 元、one——1 元、two——1.5 元、three——2 元
各个状态机之间的关系可以采用有限状态机(moore 状态机)来表示
端口:
Clk 时钟输入
Reset 系统复位信号
Half_yuan 代表投入 5 角硬币
One_yuan 代表投入 1 元硬币
Half_out 表示找零信号
Drink_out 表示机器售出了一瓶饮料
Collect 提示投币者取走饮料
2. 描述
顶层模块
module moore1_tb;
reg clk,reset,half_yuan,one_yuan;
wire half_out,drink_out,collect;
moore1 uut(
.clk(clk),
.reset(reset),
.half_yuan(half_yuan),
.one_yuan(one_yuan),
.half_out(half_out),
.drink_out(drink_out),
.collect(collect)
);
always
#150 clk=~clk;
initial
begin
clk=0;
reset=0;
half_yuan=0;
one_yuan=0;
#100 reset=0;
#100 reset=1;
#300 half_yuan=1;
#300 half_yuan=0;
#300 one_yuan=1;
#300 one_yuan=0;
#300 half_yuan=1;
#300 half_yuan=0;
#300 one_yuan=1;
#300 one_yuan=0;
#100 $finish;
end
endmodule
底层模块
Module
moore1(clk,reset,half_yuan,one_yuan,half_ou
t,drink_out,collect);
input clk,reset,half_yuan,one_yuan;
output half_out,drink_out,collect;
reg[2:0] Current_state,Next_state;
reg half_out,drink_out,collect;
parameter idle = 3'b000;
parameter half = 3'b001;
parameter one = 3'b010;
parameter two = 3'b011;
parameter three= 3'b100;
always@(posedge clk or negedge reset)
begin
if(~reset) Current_state <=idle;
else Current_state<=Next_state;
end
always@(Current_state or half_yuan or
one_yuan)
begin
case(Current_state)
评论12