带七段式数码显示管的自动售卖机设计(verilog自学笔记之有限状态机的设计)

采用三段式的方法写一个自动售卖机,功能如下:

共有三种纸币入口,分别支持10元,20元,50元。货物售价80元。需要支持找钱功能(注意,找钱有两种情况,90元和100元;110元和120元的情况不符合实际应用场景,所以不存在找钱的情况。)带有用七段式数码显示管显示当前总金额的功能。

七段数码管原理图如下:

七段数码显示管代码:简单模块通过case实现,无需多言。

FSM状态转换关系如下:摩尔型状态机

设计思想:

采用三段式,第一段同步时序逻辑,描述状态转换关系。第二段采用组合逻辑判断状态转移条件,第三段描述状态的输出。

代码如下:

简单的测试代码:

结果波形:

如波形所示,投入一枚50元,十位显示管显示5,个位百位均显示0,再次投入50,显示管显示100,同时出货,并找零20,下个状态归零。投入4个20元,显示管20,40,60,80,出货,不找零。再投50元和两个20元,显示管依次50,70,90并找零10元。之后投入20,10,50,显示管20,30,80,出货不找零。功能正常。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要确定七段数码管的显示模,这里采用共阳极的显示方,需要控制8个引脚(7个段和1个共阳极)。 然后,我们可以使用状态机的思想来设计控制七段数码管扫描的逻辑。状态机包括两个状态:扫描状态和显示状态。 在扫描状态下,我们依次将共阳极引脚输出高电平,控制对应数码管的7个段的引脚输出低电平,然后等待一段时间,再将共阳极引脚输出低电平,进入下一个数码管的扫描状态。 在显示状态下,我们需要根据输入的数字,控制对应数码管的7个段的引脚输出低电平,将共阳极引脚输出高电平,显示数字。 下面是基于Verilog语言和状态机思想的七段数码管扫描显示代码: ``` module SevenSegDisplay( input clk, // 时钟信号 input [3:0] num, // 输入数字 output reg [6:0] seg, // 数码管段的输出 output reg anode // 共阳极引脚的输出 ); reg [2:0] state; // 状态机的状态 always @(posedge clk) begin case(state) // 扫描状态 3'b000: begin // 第一个数码管 anode <= 1; seg <= 7'b1111110; state <= 3'b001; end 3'b001: begin // 第二个数码管 anode <= 1; seg <= 7'b1101101; state <= 3'b010; end 3'b010: begin // 第三个数码管 anode <= 1; seg <= 7'b1111001; state <= 3'b011; end 3'b011: begin // 第四个数码管 anode <= 1; seg <= 7'b0110011; state <= 3'b100; end 3'b100: begin // 第五个数码管 anode <= 1; seg <= 7'b1011011; state <= 3'b101; end 3'b101: begin // 第六个数码管 anode <= 1; seg <= 7'b1011111; state <= 3'b110; end 3'b110: begin // 第七个数码管 anode <= 1; seg <= 7'b1110000; state <= 3'b000; end // 显示状态 3'b111: begin case(num) 0: begin seg <= 7'b1111110; end 1: begin seg <= 7'b0110000; end 2: begin seg <= 7'b1101101; end 3: begin seg <= 7'b1111001; end 4: begin seg <= 7'b0110011; end 5: begin seg <= 7'b1011011; end 6: begin seg <= 7'b1011111; end 7: begin seg <= 7'b1110000; end 8: begin seg <= 7'b1111111; end 9: begin seg <= 7'b1111011; end default: begin seg <= 7'b0000000; end endcase anode <= 0; state <= 3'b111; end default: begin state <= 3'b000; end endcase end endmodule ``` 在这个代码中,我们使用了一个三位二进制表示的状态机,其中000表示扫描状态,111表示显示状态。在扫描状态下,我们依次扫描七个数码管,控制其对应的引脚输出,等待一段时间后进入下一个数码管的扫描状态。在显示状态下,我们根据输入的数字控制对应数码管的引脚输出,显示数字。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值