题解 | #自动贩售机1#

自动贩售机1

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

  1. 将所投入的货币数目用最小单位(五毛钱)以寄存器Five_cnt记录,由于测试用例最多出现3元,所以Five_cnt的范围0~6,定义其大小[2:0]。
  2. 需注意 根据输出波形知道在输入货币的下一个时钟才会输出信号,而不是当前时钟。

完整代码:

`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***********//
    reg[2:0]Five_cnt;
    always@(negedge rst or posedge clk)begin
        if(~rst) begin
            out1 <= 0;
            out2 <= 0;
        end
        else if(Five_cnt >= 3) begin
            out2 <= Five_cnt - 3;
            out1 <= 1;
        end
        else begin
            out1 <= 0;
            out2 <= 0;
        end
    end
    
    always@(negedge rst or posedge clk)begin
        if(~rst)
            Five_cnt <= 0;
        else if(d1) 
            Five_cnt <= Five_cnt + 1;
        else if(d2) 
            Five_cnt <= Five_cnt + 2; 
        else if(d3) 
            Five_cnt <= Five_cnt + 4;
        else 
            Five_cnt <= Five_cnt>=3? 0: Five_cnt;
    end

//*************code***********//
endmodule
全部评论
用quartus综合这段代码的时候会报错Erro(10028),原因是在不同的always块里对同一个reg变量进行了赋值,而always块是并行工作的,所以会起冲突。
2 回复 分享
发布于 2022-04-28 18:15
这里用posedge 对d1,d2进行采样的时候,按道理不是会有setup这种情况吗,按道理最好用negedge吧(但是negedge 牛客报错了,这个问题楼主知道答案吗)
1 回复 分享
发布于 2022-09-13 00:22 广东
always@(posedge d1) Five_cnt <= Five_cnt + 1; always@(posedge d2) Five_cnt <= Five_cnt + 2; always@(posedge d3) Five_cnt <= Five_cnt + 4;
点赞 回复 分享
发布于 2022-04-22 12:15
这样写时序对不上吧,输出晚了一拍
点赞 回复 分享
发布于 2023-12-15 11:40 陕西

相关推荐

点赞 评论 收藏
分享
小红书 后端开发 总包n+8w+期权
点赞 评论 收藏
分享
喜欢走神的孤勇者练习时长两年半:爱华,信华,等华,黑华
点赞 评论 收藏
分享
评论
4
收藏
分享
牛客网
牛客企业服务