题解 | #自动贩售机1#

自动贩售机1

http://www.nowcoder.com/practice/dcf59e6c51f6489093495acb1bc34dd8

简析

输入:d1,d2,d3
输出:out1,out2[1:0]
d1d2d3拉高半个周期时分别表示自动贩售机投入了0.5元、1元和2元。out1表示是否找零,out2表示找零的数额。此外,自动贩售机每次只允许投入一枚货币。

首先自动贩售机中可能存在的几种金额:0,0.5,1,1.5,2,2.5,3。然后直接将其作为状态机的几种状态,并根据投币面额确定状态转移。

代码

`timescale 1ns/1ns
module seller1(
	input wire clk  ,
	input wire rst  ,
	input wire d1 ,
	input wire d2 ,
	input wire d3 ,
	
	output reg out1,
	output reg [1:0]out2
);
//*************code***********//
    parameter S0=0, S0_5=1, S1=2, S1_5=3, S2=4, S2_5=5, S3=6;
    reg [2:0] state, nstate;
    
    always@(posedge clk or negedge rst) begin
        if(~rst)
            state <= S0;
        else
            state <= nstate;
    end
    
    always@(*) begin
        case(state)
            S0                : nstate = d1? S0_5:
                                         d2? S1  :
                                         d3? S2  :
                                         nstate;
            S0_5              : nstate = d1? S1  :
                                         d2? S1_5:
                                         d3? S2_5:
                                         nstate;
            S1                : nstate = d1? S1_5:
                                         d2? S2  :
                                         d3? S3  :
                                         nstate;
            S1_5, S2, S2_5, S3: nstate = S0;
            default           : nstate = S0;
        endcase
    end
    
    always@(*) begin
        if(~rst)
            out1 = 0;
        else
            out1 = state==S1_5||state==S2||state==S2_5||state==S3;
    end
    
    always@(*) begin
        if(~rst)
            out2 <= 0;
        else
            case(state)
                S0, S0_5, S1, S1_5: out2 <= 0;
                S2                : out2 <= 1;
                S2_5              : out2 <= 2;
                S3                : out2 <= 3;
                default           : out2 <= 0;
            endcase
    end
//*************code***********//
endmodule
Verilog篇题解 文章被收录于专栏

本人对牛客网verilog篇题目一些理解

全部评论
S0 : nstate = d1? S0_5: d2? S1 : d3? S2 : nstate;为什么最后是ns不是s0?
1 回复 分享
发布于 2022-05-08 11:14
为什么用的是组合逻辑表示输出?为什么out1输出用的是阻塞赋值,而out2的组合逻辑输出用的又是非阻塞赋值
点赞 回复 分享
发布于 2024-10-23 00:10 北京
请问为什么不用mealy呢?只有三个状态啊
点赞 回复 分享
发布于 2024-10-18 17:39 江苏
组合逻辑中复位?
点赞 回复 分享
发布于 2023-12-15 11:41 陕西

相关推荐

评论
19
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务