找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12399|回复: 12
收起左侧

Verilog HDL自动售货机系统设计与仿真实验报告

  [复制链接]
ID:242893 发表于 2017-11-10 11:16 | 显示全部楼层 |阅读模式
利用VerilogHDL来设计设计一个自动售货机,机器设有2个投币孔,可以接受一元和五角的硬币,每瓶饮料2.5元,可用2个按键来代替。还设有2个输出,要求有找零和提示信号,分别输出饮料和找零,编写一个测试平台,并通过仿真对该模型进行测试。

自动售货机的设计与仿真

目录

前言

一、设计程序

Verilog程序源代码:

测试代码:

二、程序仿真

仿真程序图

系统的顶层原理图如下:

三、程序说明

电路变量分析

四、知识点说明

五、实验结论及总结




前言

随着电子技术和计算机技术的飞速发展,电子线路的设计工作也日益显得重要。经过人工设计、制作实验板、调试再修改的多次循环才定型的传统产品设计方法必然被计算机辅助设计所取代,因为这种费时费力又费资源的设计调试方法既增加了产品开发的成本,又受到实验工作场地及仪器设备的限制。为了克服上述困难,加拿大Interactive Image Technologies公司推出的基于Windows 95/98/NT操作系统的EDA软件。他可以将不同类型的电路组合成混合电路进行仿真。此外,从另一角度来看,随着计算机技术和集成电路技术的发展,现代电子与电工设计,已经步入了电子设计自动化(EDA)的时代,采用虚拟仿真的手段对电子产品进行前期工作的调试,已成为一种发展的必然趋势。通过对实际电子线路的仿真分析,从而提高对电路的分析、设计和创新能力。

数字集成电路本身在不断地进行更新换代。它由早期的电子管、晶体管、小中规模集成电路、发展到超大规模集成电路(VLSIC,几万门以上)以及许多具有特定功能的专用集成电路。但是,随着微电子技术的发展,设计与制造集成电路的任务已不完全由半导体厂商来独立承担。系统设计师们更愿意自己设计专用集成电路(ASIC)芯片,而且希望ASIC的设计周期尽可能短,最好是在实验室里就能设计出合适的ASIC芯片,并且立即投入实际应用之中,因而出现了现场可编程逻辑器件(FPLD),其中应用最广泛的当属现场可编程门阵列(FPGA)和复杂可编程逻辑器件(CPLD)。

FPGA(现场可编程门阵列)与 CPLD(复杂可编程逻辑器件)都是可编程逻辑器件,它们是在PAL,GAL等逻辑器件的基础之上发展起来的。同以往的PAL,GAL等相比较,FPGA/CPLD的规模比较大,它可以替代几十甚至几千块通用IC芯片。这样的FPGA/CPLD实际上就是一个子系统部件。

本次EDA课程设计就是利用VerilogHDL来设计设计一个自动售货机,机器设有2个投币孔,可以接受一元和五角的硬币,每瓶饮料2.5元,可用2个按键来代替。还设有2个输出,要求有找零和提示信号,分别输出饮料和找零,编写一个测试平台,并通过仿真对该模型进行测试。

一、设计程序Verilog程序源代码:
  1. module sell(yi_yuan,wu_jiao,  get,half_out,sell_out,reset,clk);
  2. parameter idle=0, half=1, one=2,two=3,three=4;
  3. input yi_yuan,wu_jiao,reset,clk;
  4. output get,half_out,sell_out;
  5. reg get,half_out,sell_out;
  6. reg[2:0] s;

  7. always @(posedge clk)

  8. begin
  9. if(reset)
  10.         begin
  11.         sell_out=0;   get=0;  half_out=0;  s=idle;
  12.         end
  13.   else
  14. case(s)
  15.       idle: begin
  16.         sell_out=0;   get=0; half_out=0;
  17.        if(wu_jiao)  s=half;
  18.          else  if(yi_yuan)s=one;
  19.       end
  20. half: begin
  21. if(wu_jiao)  s=one;
  22.         else if(yi_yuan)
  23.          s=two;
  24.            end
  25. one: begin
  26.   if(wu_jiao) s=two;
  27.          else if(yi_yuan)s=three;
  28.    end
  29. two:   begin
  30.         if(wu_jiao) s=three;
  31.           else if(yi_yuan)
  32.                begin
  33.    sell_out=1;get=1;  s=idle;
  34.                end
  35. end
  36.    three:  begin
  37.    if(wu_jiao)
  38.            begin
  39.      sell_out=1; get=1;  s=idle;
  40.            end
  41.    else if(yi_yuan)
  42.           begin
  43. …………
  44. …………
  45. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
测试代码:
`timescale 1ns/1ns
module sell_top;
reg yi_yuan,wu_jiao,reset,CLK;
wire get,half_out,sell_out;
always #50 CLK=~CLK;
initial
begin
CLK =0; reset=1;
#100                reset=0;
yi_yuan=0;
wu_jiao=0;
end

always@(posedge CLK)
begin
  wu_jiao={$random}%2;#50 wu_jiao=0;
  end
always@(posedge CLK)
begin
  if(!wu_jiao)yi_yuan=1;#50 yi_yuan=0;
end
sell m(.yi_yuan(yi_yuan),.wu_jiao(wu_jiao), .get(get),
.half_out(half_out),.sell_out(sell_out),.reset(reset),.clk(CLK));
endmodule
二、程序仿真仿真程序图

仿真波形及分析

分析前仿真波形,每个时钟周期为100ns,如图:在100ns系统复位,到550ns时,输入5个wu_jiao信号,get和sell_out信号出现告电平,持续100ns,表示卖出和取饮料信号。第三组开始输入信号:在1050ns且为上升沿时,1个yi_yuan高电平,后接着俩wu_jiao高电平,又一个yi_yuan高电平,half_out/get和sell_out信号出现告电平持续100ns,表示分别有卖出、找零和取饮料信号。在1850ns时第5组测试数据开始,同时为时钟上升沿,分别有三个wu_jiao和一个yi_yuan高电平,满足输出,get、sell_out同时为高,持续100ns,表示分别卖出和取饮料信号。

系统的顶层原理图如下

1.本次仿真实验通过对自动售货机状态转换图的分析得出其工作原理,并根据工作原理编写出Verilog HDL源程序;

2.通过仿真验证,该设计能较好的实现自动售货机的基本功能;

3.根据仿真结果,仿真输出与理论值相比有一定的延时,这是系统误差,难以消除。

三、程序说明电路变量分析
根据设计要求,共有七个变量。
clk:时钟输入;
reset:系统复位信号;
wu_jiao:代表投入五角硬币;
yi_yuan:代表投入一元硬币;
half_out:售货机找回一枚五角硬币信号;
sell_out:机器售出一瓶饮料;
get:提示投币者取走饮料。
四、知识点说明

1、从仿真的角度来说,HDL语言面对的是编译器(如Modelsim等),相当于软件思路。 这时:

wire对应于连续赋值,如assign

reg对应于过程赋值,如always,initial  

从综合的角度来说,HDL语言面对的是综合器(如DC等),要从电路的角度来考虑。 这时:

1、wire型的变量综合出来一般是一根导线; 2、reg变量在always块中有两种情况:

(1)、always后的敏感表中是(a or b or c)形式的,也就是不带时钟边沿的,综合出来还是组合逻辑

(2)、always后的敏感表中是(posedge clk)形式的,也就是带边沿的,综合出来一般是时序逻辑,会包含触发器(Flip-Flop)  

2、verilog中always@(posedge clk)无竞争冒险,因为这是时序电路,a和c值的更新是在时钟沿到来时才会被采样的,你所看见的一个时钟周期,就是周期的概念,是延迟一周期后才赋值的,比如在0时刻,你给b,a一个初值1,1,而之前b,a值为0,0,则此时a为0的那个值赋给c,b为0值赋给a,在运行完这之后,由于有新值a=1,a值变化,a为1,即此时a=1,b=1,c=0,在下个周期时,c才等于1的。

3、#加数字表示延迟

4、Verilog中Timescale的用法

(1)`timescale 1ns / 1ps,含义为:时延单位为1ns,时延精度为1ps。

(2)在编译过程中,`timescale会影响其后面所有模块中的时延值,直至遇到另一个`timescale指令或`resetall指令。

(3) 当一个设计中的多个模块带有自身的`timescale编译指令时,模拟器将定位在所有模块的最小时延精度上,并且所有时延都相应地换算为最小时延精度。

5、$random(seed)是verilog中最简单的产生随机数的系统函数,给$random传入了参数seed。

6、reg [2:0]s:定义一个三位的计数器

7、parameter 作用于声明的那个文件;`define 从编译器读到这条指令开始到编译结束都有效,或者遇到`undef命令使之失效。状态机的定义可以用parameter 定义,但是不推荐使用`define 宏定义的方式,因为'define 宏定义在编译时自动替换整个设计中所定义的宏,而parameter 仅仅定义模块内部的参数,定义的参数不会与模块外的其他状态机混淆。

五、实验结论及总结

    通过此次仿真实验—基于状态机的自动售货机的设计,我掌握了Quartus II软件的基本使用方法以及Verilog HDL语言的语法特点,可以初步编写一些逻辑功能较为简单的源程序。同时,通过此次实验,我掌握了设计工作的完整流程,为以后的课程设计积累了宝贵的经验。最后,实验过程中难免遇到一些问题,我们要冷静分析,找出原因。总之,通过此次实验,我学到了许多有益的知识。


以上图文的Word格式文档下载(内容和本网页上的一模一样,方便大家保存):(共11页):
Verilog HDL--自动售货机设计.docx (153.49 KB, 下载次数: 209)

评分

参与人数 2黑币 +54 收起 理由
starrynight73 + 4 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:314321 发表于 2018-4-23 11:10 | 显示全部楼层
很棒+++++
回复

使用道具 举报

ID:264962 发表于 2018-6-4 10:23 | 显示全部楼层
很棒,很实用,哈哈哈
回复

使用道具 举报

ID:348875 发表于 2018-6-10 18:26 | 显示全部楼层
为什么测试里找零信号一直是低电平
回复

使用道具 举报

ID:389133 发表于 2019-6-27 15:33 | 显示全部楼层
解难了
回复

使用道具 举报

ID:579126 发表于 2019-7-6 21:02 | 显示全部楼层
很有用
回复

使用道具 举报

ID:282095 发表于 2019-7-6 22:16 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:773783 发表于 2020-6-9 11:35 | 显示全部楼层
感觉楼主的分享
回复

使用道具 举报

ID:835186 发表于 2020-11-27 11:02 | 显示全部楼层

这个怎么仿真
回复

使用道具 举报

ID:976342 发表于 2021-10-31 08:12 | 显示全部楼层

用quartus ii
回复

使用道具 举报

ID:1036307 发表于 2022-6-22 09:54 | 显示全部楼层
求源代码
回复

使用道具 举报

ID:1073329 发表于 2023-12-14 20:45 | 显示全部楼层
他的找零,售出,取品怎么都是低电平
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表