题解 | #自动贩售机1#

自动贩售机1

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

这题有两种方案,1、无锁存器,需要使用下降沿触发。2、有锁存器,正常上升沿触发。

1、无锁存器:

//方案一:无锁存器方案
`timescale 1ns/1ns
module seller1(
	input wire clk  ,
	input wire rst  ,
	input wire d1 , //0.5
	input wire d2 , //1
	input wire d3 , //2
	
	output reg out1,
	output reg [1:0]out2
);

reg [2:0] state, next_state;
wire [2:0] d = {d3,d2,d1};  //0.5的倍数bit

always @(*) begin
	case(state)
		0: begin
			case (d)
                0:next_state = 0;
                1:next_state = 1;
                2:next_state = 2;
                4:next_state = 4;
                default: next_state = 0;
            endcase
        end     //未投币
		1: begin
			case (d)
                0:next_state = 1;
                1:next_state = 2;
                2:next_state = 3;
                4:next_state = 5;
                default: next_state = 0;
            endcase
        end     //投币未投够
		2: begin
			case (d)
                0:next_state = 2;
                1:next_state = 3;
                2:next_state = 4;
                4:next_state = 6;
                default: next_state = 0;
            endcase
        end     //找零
        default: next_state = 0;
    endcase
end

always @(negedge clk,negedge rst) begin
	if(!rst) begin
		state <= 0;
    end
    else begin
        state <= next_state;
    end
end  //由于组合逻辑未使用锁存器结构,所以需要使用negedge触发

always @(posedge clk,negedge rst) begin
    if (!rst) begin
        out1 <= 0;
        out2 <= 0;
    end
    else begin
        case(state)
            3: begin
                out1 = 1;
                out2 = 0;
            end
            4: begin
                out1 = 1;
                out2 = 1;
            end
            5: begin
                out1 = 1;
                out2 = 2;
            end
            6: begin
                out1 = 1;
                out2 = 3;
            end
            default: begin
                out1 = 0;
                out2 = 0;
            end
        endcase
    end
end

endmodule

2、有锁存器:

// 方案二:有锁存器方案
`timescale 1ns/1ns
module seller1(
	input wire clk  ,
	input wire rst  ,
	input wire d1 , //0.5
	input wire d2 , //1
	input wire d3 , //2
	
	output reg out1,
	output reg [1:0]out2
);

reg [2:0] state, next_state;
wire [2:0] d = {d3,d2,d1};  //0.5的倍数bit

// 组合逻辑中使用锁存结构检测脉冲
always @(*) begin
	case(state)
		0: begin
			case (d)
                1:next_state = 1;
                2:next_state = 2;
                4:next_state = 4;
                default: next_state = next_state;
            endcase
        end     //未投币
		1: begin
			case (d)
                1:next_state = 2;
                2:next_state = 3;
                4:next_state = 5;
                default: next_state = next_state;
            endcase
        end     //投币未投够
		2: begin
			case (d)
                1:next_state = 3;
                2:next_state = 4;
                4:next_state = 6;
                default: next_state = next_state;
            endcase
        end     //找零
        default: next_state = 0;
    endcase
end

always @(posedge clk,negedge rst) begin
	if(!rst) begin
		state <= 0;
    end
    else begin
        state <= next_state;
    end
end  //由于组合逻辑使用锁存器结构,所以可以使用posedge触发

always @(*) begin
    if (!rst) begin
        out1 = 0;
        out2 = 0;
    end
    else begin
        case(state)
            3: begin
                out1 = 1;
                out2 = 0;
            end
            4: begin
                out1 = 1;
                out2 = 1;
            end
            5: begin
                out1 = 1;
                out2 = 2;
            end
            6: begin
                out1 = 1;
                out2 = 3;
            end
            default: begin
                out1 = 0;
                out2 = 0;
            end
        endcase
    end
end

endmodule

不带锁存的仿真,下降沿进行状态转移:

可以看到state在下降沿时刻将next_state采样。

带锁存的仿真:

可以看到next_state在d脉冲触发后将次态锁存,用于状态转移。

此题学习到锁存器的用法之一。

全部评论

相关推荐

6 收藏 评论
分享
正在热议
# 牛客帮帮团来啦!有问必答 #
1152186次浏览 17149人参与
# 通信和硬件还有转码的必要吗 #
11209次浏览 101人参与
# OPPO开奖 #
19232次浏览 267人参与
# 和牛牛一起刷题打卡 #
19030次浏览 1635人参与
# 实习与准备秋招该如何平衡 #
203445次浏览 3627人参与
# 大厂无回复,继续等待还是奔赴小厂 #
4983次浏览 31人参与
# 不去互联网可以去金融科技 #
20511次浏览 258人参与
# 通信硬件薪资爆料 #
265971次浏览 2484人参与
# 国企是理工四大天坑的最好选择吗 #
2230次浏览 34人参与
# 互联网公司评价 #
97719次浏览 1280人参与
# 简历无回复,你会继续海投还是优化再投? #
25039次浏览 354人参与
# 0offer是寒冬太冷还是我太菜 #
454917次浏览 5124人参与
# 国企和大厂硬件兄弟怎么选? #
53924次浏览 1012人参与
# 参加过提前批的机械人,你们还参加秋招么 #
14647次浏览 349人参与
# 硬件人的简历怎么写 #
82290次浏览 852人参与
# 面试被问第一学历差时该怎么回答 #
19404次浏览 213人参与
# 你见过最离谱的招聘要求是什么? #
28264次浏览 248人参与
# 学历对求职的影响 #
161259次浏览 1804人参与
# 你收到了团子的OC了吗 #
538781次浏览 6387人参与
# 你已经投递多少份简历了 #
344284次浏览 4963人参与
# 实习生应该准时下班吗 #
96990次浏览 722人参与
# 听劝,我这个简历该怎么改? #
63527次浏览 622人参与
牛客网
牛客企业服务