题目:设计一个自动饮料售卖机,饮料10分钱,硬币5分10分两种,并考虑找零,每次只能投入一个硬币!
1.画出fsm。
2.用verilog编程。
3.设计工程中可使用的工具及设计大致过程
1.画出fsm
第一步:定义它的输入输出。
输入:a,b;其中a=1,投入5分;b=1,投入10分;
输出:y,z;其中y=1,出饮料;z=1,找零。
第二步:定义状态
状态:两个状态 S0和S1;其中S0为没有投钱;S1为投了5分。
为此画出了状态图
2.用verilog编程
module hunter(clk,rst_n,a,b,y,z);
input clk,rst_n;
input a,b;
output reg y,z;
reg CS,NS;
parameter S0=1'b0,S1=1'b1;
//同步时序描述状态转移
always@(posedge clk or negedge rst_n)
if(!rst_n)
CS<=S0;
else
CS<=NS;
//使用组合逻辑判断转移状态条件
always@(CS or a or b)
begin
{y,z}=2'b00;
NS=1'bz;//状态机初始化,不定态的好处,综合器对不定态x的处理是don't care,仿真时可以考察设计FSM完备状态。
case(CS)
S0:begin
if(a&~b)//投入5分的时候
begin
{y,z}=2'b00;
NS=S1;
end
else if(~a&b)//投入10分的时候
begin
{y,z}=2'b10;
NS=S0;
end
end
S1:begin
if(a&~b)//再次投入5分
begin
{y,z}=2'b10;
NS=S0;
end
else if(~a&b)
begin
{y,z}=2'b11;
NS=S1;
end
end
default:
NS=S0;
endcase
end
endmodule
上面的饮料我们只有一种,我们假设存在两种饮料A和B,价钱分别为5分和10分,状态图又该如何呢?
我们需要添加一个输入c,当c为1是选择饮料B,c为0时选择饮料A;
定义两个状态,初始态S0和转移态S1,到达转移态S1的条件是选择的饮料种类的价格比第一次投入的硬币的面值大,所以画出如下状态转移图:
其实对于售卖机的模型,总结来说就是两种状态,初始态和转移态,状态转移图如下所示:
S0为初始态,S1为选择完商品之后的状态
扫描二维码关注公众号,回复:
6545872 查看本文章