数字系统设计实验七(完结):verilog实现简易饮料贩售机

这篇具有很好参考价值的文章主要介绍了数字系统设计实验七(完结):verilog实现简易饮料贩售机。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.问题重述:
自动售饮料机是一个典型的利用状态机进行电路设计的例子。要求采用有限状态机设计,使用case语句来描述各个状态之间的转移关系。假定每瓶饮料售价为2.5元,可使用 2 种硬市,即5角(half_dollar)、1元(one_dollar),机器有找零功能。下图是该自动售饮料机的示意图。
在程序中,可以定义5个状态,代表不同时刻机器的不同状态。在系统复位后机器开始运行,在每一次出售饮料的过程中记录其状态,表示投币者已投入钱币数目的变化,在下一次售出前,首先reset将系统清零。
数字系统设计实验七(完结):verilog实现简易饮料贩售机

2.问题分析:
1)题目要求运用状态机来描述自动贩卖机,那么这时的输出(即找零和取饮料)是与用户的输入(投币)有关的,所以在这里应该运用mealy机。
2)对于工作模式的认识与建模:认为在这个机器中,有如下的工作模式:投入两元时,再投入五角,则出饮料,而不找零,进行清零;投入两元时,再投入一元,则出饮料,找零五角,进行清零。考虑到没有按键等交互功能,并且时钟频率较高的情况下,同时投下1元和五角的几率很低,这种情况可以忽略,即不会同时使元和角输入同时为1的可能。那么相应的,找零也不会出现找出1块钱的情况,只有要已经输入2元,在输入1元的情况下,会找出5角的零钱。这样可以大大简化状态机的设计。
3)在这里定义五个状态,由于输入可以为5角和1元,由yuan_in和jiao_in分别来表示,所以输入的状态定位0元,0.5元,1元,1.5元,2元五种,在yuan_in,jiao_in的控制下,在五种状态间进行状态转移。

4)输出包括取饮料和找零,当然也包括币值的显示和取饮料、找零的led显示。取饮料用一位二进制表示good_out,找零用jiao_out来表示。币值显示跟随状态机,用两个一位十进制数seg_shiyuan和seg_yiyuan来显示,之后用前面所做过的译码器来实现。另外是led_drink和led_exchange分别表示对应的led灯的亮灭,这和输入状态的good_out和jiao_out使绑定的。亮表示正在进行该动作。
5)根据上面描述,画出如下状态机转移图:
数字系统设计实验七(完结):verilog实现简易饮料贩售机

状态转移图对mealy机状态转移的描述不是十分清晰。下面再用状态转移表进行描述:
数字系统设计实验七(完结):verilog实现简易饮料贩售机

3.代码展现:
虽然通过上面的分析,为了代码的完备性,这里的代码还是考虑了同时投下一元和五角的情况,即每个状态机中对应的输入情况都有四种(00,01,10,11)。
.v文件:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: jeffery

module machine(
/*input*/   clk,rst,yuan_in,jiao_in,
/*output*/  good_out,yuan_out,jiao_out,
            led_drink,led_exchange,//输出信号中显示出饮料、找零的指示灯
            segment,chip           //显示的led灯,使用第6题中的动态扫描输出
);
input  wire clk,rst, yuan_in, jiao_in;
output reg good_out,yuan_out,jiao_out;
output wire led_drink,led_exchange;
output wire [6:0] segment;
output wire [1:0] chip;


parameter state00=3'd0,state05=3'd1,
          state10=3'd2,state15=3'd3,   
          state20=3'd4;//连续定义parameter这里要是逗号隔开的!!
       
//这个assign块的含义是,这两个输出是互相绑定的
assign led_drink=good_out;
assign led_exchange=(jiao_out||yuan_out);
          
//这个always语句是对状态的转移进行定义
reg [2:0]state;
reg [7:0]number;//这个数字是用于产生
always @(posedge clk or negedge rst)
    begin
        if(!rst)
            begin
            state=state00;
            good_out=0;
            yuan_out=0;
            jiao_out=0;
            number=0;
            end
        else
            begin
            case(state) 
state00:
                    begin
                    if(yuan_in==0 && jiao_in==0)
                        begin
                        state=state00;
                        good_out=0;
                        yuan_out=0;
                        jiao_out=0;
                        number[7:4]=0;
                        number[3:0]=0;
                        end
                    else if(yuan_in==0 && jiao_in==1)
                        begin
                        state=state05;
                        good_out=0;
                        yuan_out=0;
                        jiao_out=0;
                        number[7:4]=0;
                        number[3:0]=5;
                        end
                    else if(yuan_in==1 && jiao_in==0)
                        begin
                        state=state10;
                        good_out=0;
                        yuan_out=0;
                        jiao_out=0;
                        number[7:4]=1;
                        number[3:0]=0;
                        end
                    else if(yuan_in==1 && jiao_in==1)
                        begin
                        state=state15;
                        good_out=0;
                        yuan_out=0;
                        jiao_out=0;
                        number[7:4]=1;
                        number[3:0]=5;
                        end
                    end
                state05:
                    begin
                    if(yuan_in==0 && jiao_in==0)
                        begin 
   state=state05;
                        good_out=0;
                        yuan_out=0;
                        jiao_out=0;
                        number[7:4]=0;
                        number[3:0]=5;
                        end
                    else if(yuan_in==0 && jiao_in==1)
                        begin
                        state=state10;
                        good_out=0;
                        yuan_out=0;
                        jiao_out=0;
                        number[7:4]=1;
                        number[3:0]=0;
                        end
                    else if(yuan_in==1 && jiao_in==0)
                        begin
                        state=state15;
                        good_out=0;
                        yuan_out=0;
                        jiao_out=0;
                        number[7:4]=1;
                        number[3:0]=5;
                        end
                    else if(yuan_in==1 && jiao_in==1)
                        begin
                        state=state20;
                        good_out=0;
                        yuan_out=0;
                        jiao_out=0;
                        number[7:4]=2;
                        number[3:0]=0;
                        end
                    end
                state10:
                    begin
                    if(yuan_in==0 && jiao_in==0)
                        begin
                        state=state10;
                        good_out=0;
                        yuan_out=0;
                        jiao_out=0; 
 number[7:4]=1;
                        number[3:0]=0;
                        end
                    else if(yuan_in==0 && jiao_in==1)
                        begin
                        state=state15;
                        good_out=0;
                        yuan_out=0;
                        jiao_out=0;
                        number[7:4]=1;
                        number[3:0]=5;
                        end
                    else if(yuan_in==1 && jiao_in==0)
                        begin
                        state=state20;
                        good_out=0;
                        yuan_out=0;
                        jiao_out=0;
                        number[7:4]=2;
                        number[3:0]=0;
                        end
                    else if(yuan_in==1 && jiao_in==1)
                        begin
                        state=state00;
                        good_out=1;
                        yuan_out=0;
                        jiao_out=0;
                        number[7:4]=0;
                        number[3:0]=0;
                        end
                    end
                state15:
                    begin
                    if(yuan_in==0 && jiao_in==0)
                        begin
                        state=state15;
                        good_out=0;
                        yuan_out=0;
                        jiao_out=0;
                        number[7:4]=1;
                        number[3:0]=5;
                        end
                    else if(yuan_in==0 && jiao_in==1) 
 begin
                        state=state20;
                        good_out=0;
                        yuan_out=0;
                        jiao_out=0;
                        number[7:4]=2;
                        number[3:0]=0;
                        end
                    else if(yuan_in==1 && jiao_in==0)
                        begin
                        state=state00;
                        good_out=1;
                        yuan_out=0;
                        jiao_out=0;
                        number[7:4]=0;
                        number[3:0]=0;
                        end
                    else if(yuan_in==1 && jiao_in==1)
                        begin
                        state=state00;
                        good_out=1;
                        yuan_out=0;
                        jiao_out=1;
                        number[7:4]=0;
                        number[3:0]=0;
                        end
                    end
                state20:
                    begin
                    if(yuan_in==0 && jiao_in==0)
                        begin
                        state=state20;
                        good_out=0;
                        yuan_out=0;
                        jiao_out=0;
                        number[7:4]=2;
                        number[3:0]=0;
                        end
                    else if(yuan_in==0 && jiao_in==1)
                        begin
                        state=state00;
                        good_out=1;
                        yuan_out=0; 
   jiao_out=0;
                        number[7:4]=0;
                        number[3:0]=0;
                        end
                    else if(yuan_in==1 && jiao_in==0)
                        begin
                        state=state00;
                        good_out=1;
                        yuan_out=0;
                        jiao_out=1;
                        number[7:4]=0;
                        number[3:0]=0;
                        end
                    else if(yuan_in==1 && jiao_in==1)
                        begin
                        state=state00;
                        good_out=1;
                        yuan_out=1;
                        jiao_out=0;
                        number[7:4]=0;
                        number[3:0]=0;
                        end
                    end
                default:
                        begin
                        state=state00;
                        good_out=0;
                        yuan_out=0;
                        jiao_out=0;
                        number[7:4]=0;
                        number[3:0]=0;
                        end
            endcase
            end
    end
//这里将会是例化regment译码器
wire [7:0] number_show;
assign number_show=number;//由于reg类型变量无法直接作为例化的输入端口,
                           //所以这里要通过连续赋值语句将其赋给wire型变量
led myled(.number(number_show),.segment(segment),.chip(chip),.clk(clk),.rst(rst));   

endmodule 

led module:


`timescale 1ns / 1ps
//
// Company: 
// Engineer: jeffery

module led(number,segment,chip,clk,rst);

input [7:0] number;
input clk,rst;
output reg [6:0] segment;
output reg [1:0] chip;


//这个always语句是完成了选通信号的逐个开启,0,1两个状态
reg cnt;
always @(posedge clk or negedge rst)//rst信号的下降沿将触发这个模块,是他们在任何条件都进行复位操作
    begin
    if(!rst)
        cnt=0;
    else
        cnt=cnt+1;
    end

    
    
//这个部分是对每次选择的数字,以及对应显示的片进行了选择
reg [3:0] number_reading;//number_reading是用来表示通过片选信号按顺序显示数字,这时正在读取的数字
always @(posedge clk or negedge rst)
    begin
    if(!rst)
        begin
        number_reading=1'd0;
        chip=2'b00;
        end
    else
        begin
            case(cnt)
            1'b0: 
                begin
  number_reading=number[3:0];
                chip=2'b01;
                end
            1'b1: 
                begin
                number_reading=number[7:4];
                chip=2'b10;
                end
            default: 
                begin
                number_reading=4'd0;
                chip=2'b00;
                end
            endcase
        end
    end
    
//这个always语句是对segment进行了数字编码
always @(posedge clk or negedge rst)
    begin
    if(!rst)
        segment=7'b0;
    else
        begin
            case(number_reading)
            4'd0: segment=7'b1111110;
            4'd1: segment=7'b0110000;
            4'd2: segment=7'b1101101;
            4'd3: segment=7'b1111001;
            4'd4: segment=7'b0110011;
            4'd5: segment=7'b1011011;
            4'd6: segment=7'b1011111;
            4'd7: segment=7'b1110000;
            4'd8: segment=7'b1111111;
            4'd9: segment=7'b1111011;
            default: segment=7'b0;
            endcase
        end
    
    end
    
endmodule

tb文件:

`timescale 1ns / 1ps
module tb();

reg clk, rst, yuan_in, jiao_in;
wire good_out,yuan_out,jiao_out;
wire led_drink,led_exchange;
wire [6:0] segment;
wire [1:0] chip;


machine my_machine(
/*input*/   clk,rst,yuan_in,jiao_in,
/*output*/  good_out,yuan_out,jiao_out,
            led_drink,led_exchange,//输出信号中显示出饮料、找零的指示灯
            segment,chip           //显示的led灯,使用第6题中的动态扫描输出
);

initial
    begin
    clk=1;
    rst=1;
    yuan_in=0;
    jiao_in=0;
    
    #8 rst=0;
    #8 rst=1;//检测复位信号是否能够让输出不再为x
    
    #4 yuan_in=1;jiao_in=0;
    #4 yuan_in=0;jiao_in=0;
    #4 yuan_in=1;jiao_in=0;
    #4 yuan_in=0;jiao_in=0;
    #4 yuan_in=1;jiao_in=0;//测试连续投三个1元
    #4 yuan_in=0;jiao_in=0;//必须要留够一定时间,这样才能使扫描显示的led正常显示,方便测试

    
    #4 yuan_in=0;jiao_in=1;
    #4 yuan_in=0;jiao_in=0;
    #4 yuan_in=0;jiao_in=1;
    #4 yuan_in=0;jiao_in=0;
    #4 yuan_in=0;jiao_in=1;
    #4 yuan_in=0;jiao_in=0;
 #4 yuan_in=0;jiao_in=1;
    #4 yuan_in=0;jiao_in=0;
    #4 yuan_in=0;jiao_in=1;//测试连续投五个五角
    #4 yuan_in=0;jiao_in=0;
    
    #4 yuan_in=0;jiao_in=1;
    #4 yuan_in=0;jiao_in=0;
    #4 yuan_in=1;jiao_in=0;
    #4 yuan_in=0;jiao_in=0;
    #4 yuan_in=0;jiao_in=1;
    #4 yuan_in=0;jiao_in=0;
    #4 yuan_in=1;jiao_in=0;//测试五角--一元--五角--一元
    #4 yuan_in=0;jiao_in=0;
    
    #4 yuan_in=0;jiao_in=1;
    #4 yuan_in=0;jiao_in=0;
    #4 yuan_in=1;jiao_in=1;
    #4 yuan_in=0;jiao_in=0;
    #4 yuan_in=0;jiao_in=0;
    #4 yuan_in=0;jiao_in=0;
    #4 yuan_in=0;jiao_in=1;//测试五角--一元-五角-不投--五角--一元
    #4 yuan_in=0;jiao_in=0;

    
    end

always
    begin
    #2 clk=~clk;//这里定义的时钟周期为4个时间单位
    end
endmodule


4.实验结果:
数字系统设计实验七(完结):verilog实现简易饮料贩售机
数字系统设计实验七(完结):verilog实现简易饮料贩售机
数字系统设计实验七(完结):verilog实现简易饮料贩售机
数字系统设计实验七(完结):verilog实现简易饮料贩售机
从上到下分别为:
连续投3个一元,
连续投5个五角,
五角——一元——五角——一元,
五角——一元五角同时投——不投——五角文章来源地址https://www.toymoban.com/news/detail-474722.html

到了这里,关于数字系统设计实验七(完结):verilog实现简易饮料贩售机的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Verilog数字系统设计(夏宇闻)—课后思考题记录(上)

    1、什么是信号处理电路?它通常由哪两大部分组成? 数字信号处理电路是进行一些复杂的数字运算和数据处理,并且又有实时响应需求的电路。 它们通常是由高速专用数字逻辑系统或专用数字信号处理器所构成,通常包括高速数据通道接口和高速算法电路。 2、为什么要设

    2023年04月13日
    浏览(70)
  • verilog数字系统设计教程(夏闻宇)|第一章-第六章

    早听闻此书大名,虽然有些verilog的编程经验,今天来系统的学习下verilog,完善知识体系,提升编程能力。本文章只当自己做笔记使用,记录自己没掌握的重难点,和大家一起学习。 目录 第一章  第二章 verilog语法 第三章 模块的结构、数据类型、变量和基本运算符号 1.常量

    2024年03月18日
    浏览(34)
  • Verilog数字系统设计——带进位的8位加法器

    试分别使用门级原语和always 语句设计带进位的8位加法器,要求编制测试模块对实现的逻辑功能进行完整的测试; 使用门级原语设计时注意先在草稿上做出该加法器的门级设计; 如有余力可以进一步使用门级原语设计出带超前进位链的8位加法器(期末有加分); 实验提交

    2024年02月15日
    浏览(34)
  • 【FPGA教程案例40】通信案例10——基于FPGA的简易OFDM系统verilog实现

    FPGA教程目录 MATLAB教程目录 --------------------------------------------------------------------------------------- 目录 1.软件版本 2.OFDM原理 3.OFDM系统的verilog实现

    2024年02月12日
    浏览(44)
  • Verilog数字系统设计——10进制计数器,具有异步复位功能

    编程实现10进制计数器,具有异步复位功能,十位和个位用8421BCD码表示,各端口定义如下图所示: 仔细考虑端口定义中每个端口的含义; 要求完成程序编辑、编译、时序仿真; 实验提交Verilog设计文件(.v文件)、仿真波形截图以及对于第3个步骤所提出问题的回答,文件打包

    2024年02月11日
    浏览(27)
  • 《Verilog数字系统设计教程》夏宇闻 第四版思考题答案(第5章)

    1.为什么建议在编写Verilog模块程序时,如果用到 if 语句建议大家把配套的else情况也考虑在内?   因为如果没有配套的else语句,在不满足if条件语句时,将会保持原来的状态不变,从而在综合时会产生一个锁存器,而这是设计不想要的结果。 2.用 if(条件1) 语句;elseif (条件

    2024年02月08日
    浏览(40)
  • 基于FPGA的数字电子琴——数电小系统设计【数字电子技术】(使用Vivado中的verilog语言)含piano代码文件(全)

    目录 一、电路功能描述 二、方案设计 1. 总体设计方案 2. 对原理框图或程序流程图做出简单解释 3. 各模块介绍 3.1 音频驱动模块 3.2 LED显示模块 3.3 数码管显示模块 3.4 矩阵键盘模块 3.5 PS2机械键盘模块 3.6 时钟分频模块 3.7 曲谱生成模块 三、总结 数码管和LED显示模块 矩阵键盘

    2024年02月06日
    浏览(33)
  • AES算法基于FPGA的硬件实现(3)AES算法的Verilog实现(完结)

    本设计实现AES加密算法为ecb模式,填充模式未设置,同时支持AES-128/192/256三种密钥长度。 代码完全开源,开源链接在文章末尾。 下图为GitHub仓库中上传的文件第一级结构,第一级为matlab和user,matlab中存储的是在进行列混淆运算时查表所用的coe文件,这些文件用来初始化viv

    2024年01月18日
    浏览(40)
  • 食品饮料行业如何进行数字化转型?

    数字化转型正在深耕社会发展,可以说未来 10 年是产业数字化的天下,数字化、智能化必然会占据社会发展潮流,那么企业数字化转型到底怎么做?   食品行业不仅是国民经济重要支柱产业,同时也是民生保障的基础产业。近年来,随着市场需求的转变和国际竞争日益加剧

    2024年01月16日
    浏览(41)
  • 数字信号处理实验:IIR数字滤波器设计及软件实现

    目录 一、实验目的 二、实验原理 三、实验设备 四、实验内容及步骤 五、实验结果及分析 六、实验主程序框图及程序清单 七、实验总结 熟悉用双线性变换法设计IIR数字滤波器的原理与方法; 学会调用MATLAB信号处理工具箱中滤波器设计函数(或滤波器设计分析工具FDATool)设

    2024年02月12日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包