实例六 自动售饮料机

实例六 自动售饮料机

3.2.1. 本章导读

了解自动售货机的工作流程以及各个工作状态,以及其testbench,最后在Robei可视化仿真软件经行功能实现和仿真验证。
设计原理
自动售货机的信号定义:clk:时钟输入;reset:系统复位信号;half_dollar:代表投入5角硬币;one_dollar:代表投入1元硬币;half_out:表示找零信号;dispense:表示机器售出一瓶饮料。
当reset=0时,售货机处于工作状态,此时连续往售货机中投硬币(可以是5角也可以是一元),投入最后一枚硬币时,如果之前投入的硬币总和为2.5元,则可以取走一瓶饮料,如果少于2.5元则继续投币,如果为3元则显示可以取出一瓶饮料,而且找零显示信号为高电平。
实例六 自动售饮料机_第1张图片

3.2.2. 设计流程

1. sell模块的设计
(1)新建一个模型命名为sell,类型为module,同时具备4个输入和2个输出,每个引脚的属性和名称参照下图3-2-1经行对应的修改。
实例六 自动售饮料机_第2张图片
(2)添加代码。点击模型下方的 Code添加代码。
代码:
parameter idle=0,half=1,one=2,one_half=3,two=4;
reg[2:0] D;
always @(posedge clk)
begin
if(rst)
begin
dispense=0;
half_out=0;
D=idle;
end
case(D)
idle:
if(half_dollar)
D=half;
else if(one_dollar)
D=one;
half:
if(half_dollar)
D=one;
else if(one_dollar)
D=one_half;
one:
if(half_dollar)
D=one_half;
else if(one_dollar)
D=two;
one_half:
if(half_dollar)
D=two;
else if(one_dollar)
begin
dispense=1;
D=idle;
end
two:
if(half_dollar)
begin
dispense=1;
D=idle;
end
else if(one_dollar)
begin
dispense=1;
half_out=1;
D=idle;
end
endcase
end

(3)保存模型到一个文件夹(文件夹路径不能有空格和中文)中,运行并检查有无错误。

2. sell_test测试文件设计

(1)新建一个具有4个输入2个输出的sell_test测试文件,记得将Module Type设置为 “testbench”,各个引脚配置如图3-2-3所示。
实例六 自动售饮料机_第3张图片
(2)另存为测试文件。将测试文件保存到上面创建的模型所在的文件夹下。
(3)加入模型。在Toolbox工具箱的Current栏里会出现模型,单击该模型并在sell_test上添加,并连接引脚,如下图3-2-4所示:
实例六 自动售饮料机_第4张图片
(4)输入激励。点击测试模块下方的“Code”,输入激励算法。激励代码在结束的时候要用$finish 结束。
测试代码:
initial begin
one_dollar=0;
half_dollar=0;
rst=1;
clk=0;
#100 rst=0;
repeat(2)@(posedge clk);
#2 one_dollar=1;
repeat(1)@(posedge clk);
#2 one_dollar=0;
repeat(2)@(posedge clk);
#2 one_dollar=1;
repeat(1)@(posedge clk);
#2 one_dollar=0;
repeat(2)@(posedge clk);
#2 one_dollar=1;
repeat(1)@(posedge clk);
#2 one_dollar=0;
#20 rst=1;
#100 rst=0;
repeat(2)@(posedge clk);
#2 one_dollar=1;
repeat(1)@(posedge clk);
#2 one_dollar=0;
repeat(2)@(posedge clk);
#2 one_dollar=1;
repeat(1)@(posedge clk);
#2 one_dollar=0;
repeat(2)@(posedge clk);
#2 half_dollar=1;
repeat(1)@(posedge clk);
#2 half_dollar=0;
#20 rst=1;
#5 $finish;
end
always #10 clk=~clk;

(5)执行仿真并查看波形。查看输出信息。
检查没有错误之后查看波形。点击右侧 Workspace 中的信号,进行添加并查看分析仿真结果。如图3-2-5所示:
实例六 自动售饮料机_第5张图片

3. sell_constrain约束文件设计

(1)新建一个模块,命名为sell_constrain,模块类型选择为constrain,具有4个输入和2个输出,如图3-2-6所示。
实例六 自动售饮料机_第6张图片
(2)将约束模块和设计的sell模块保存到同一个目录下,用鼠标左键单击把sell模块从左侧的ToolBox添加到约束模块中;
(3)修改约束模块的端口名称。如图3-2-7所示。本设计中使用到的开发板硬件引脚如下:
实例六 自动售饮料机_第7张图片
clk对应开发板的拨码开关T16;
reset对应开发板的拨码开关W13;
one_dollar对应开发板的拨码开关G15;
half_dollar对应开发板的拨码开关P15;
dispense对应开发板LED灯M14;
half_out对应开发板LED灯M15;
(4)保存并执行,如果软件显示“Generate constrain file complete”,说明约束文件已经成功生成。

3.2.3. 板级验证

为了测试所设计sell的工作特性,我们选择合适的开发板进行板级间验证,该开发板需要搭载XILINX公司的Z-7010芯片,所以选用VIVADO设计平台进行Synthesis、Implementation和Generate Bitstream,最终将生成的数据流文件下载到开发板内,并进行验证。

1. VIVADO设计平台进行后端设计

1.1启动Vivado软件并选择设备XC7Z010CLG400-1作为硬件对象,设计语言选用Verilog,建立新的工程,添加通过Robei设计的文件sell.v。
(1)打开Vivado,选择开始>所有程序>Xilinx Design Tools> Vivado2013.4> Vivado2013.4;
(2)单击创建新项目Create New Project启动向导。你将看到创建一个新的Vivado项目对话框,单击Next;
(3)在弹出的对话框中输入工程名sell及工程保存的位置,并确保Create project subdirectory复选框被选中,单击Next;
实例六 自动售饮料机_第8张图片
(4)选择项目类型表单的RTL Project选项,不勾选Do not specify sources at this time复选框,然后单击Next;
(5)使用下拉按钮,选中Verilog作为目标文件和仿真语言;
(6)点击添加Add Files按钮,浏览到刚刚我们Robei项目的目录下打开Verilog文件夹,选择sell.v,单击Open,然后单击Next去添加现有的IP模型;
(7)由于我们没有任何的IP添加,跳过这一步,单击Next去添加约束形成;
(8)点击添加Add Files按钮,浏览到设计的sell模块目录下的constrain文件夹,选中其中的sell_constrain.xdc文件,然后单击Next;
(9)在默认窗口中,按照图5-1-13所示设置Filter中的选项,然后在Parts中选择XC7Z010CLG400-1,单击Next;
(10)单击Finish,本Vivado项目创建成功。
实例六 自动售饮料机_第9张图片
实例六 自动售饮料机_第10张图片
1.2打开sell_constrain.xdc文件,查看引脚约束源代码。
(1)在资源窗口sources中,展开约束文件夹,如图3-2-14,然后双击打开sell_constrain.xdc进入文本编辑模式;
实例六 自动售饮料机_第11张图片
(2)Xilinx设计约束文件分配FPGA位于主板上的开关和指示灯的物理IO地址,这些信息可以通过主板的原理图或电路板的用户手册来获得。
本次设计的约束文件代码是通过Robei软件自动生成,但是,Robei软件目前生成的约束代码只有对输入输出端口的分配,在这个设计中,我们使用了一个通过开关控制的模拟时钟clk,而非系统时钟,这种电路在综合的时候一般都会报错,所以,在约束文件最后,我们需要手动添加一句命令:
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets clk_IBUF]
来保证流程中不会出错。
完整的约束代码如下:
#This file is generated by Robei!
#Pin Assignment for Xilinx FPGA with Software Vivado.
set_property PACKAGE_PIN T16 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
set_property PACKAGE_PIN W13 [get_ports rst]
set_property IOSTANDARD LVCMOS33 [get_ports rst]
set_property PACKAGE_PIN G15 [get_ports one_dollar]
set_property IOSTANDARD LVCMOS33 [get_ports one_dollar]
set_property PACKAGE_PIN P15 [get_ports half_dollar]
set_property IOSTANDARD LVCMOS33 [get_ports half_dollar]
set_property PACKAGE_PIN M15 [get_ports half_out]
set_property IOSTANDARD LVCMOS33 [get_ports half_out]
set_property PACKAGE_PIN M14 [get_ports dispense]
set_property IOSTANDARD LVCMOS33 [get_ports dispense]
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets clk_IBUF]

(3)点击File->Save File保存文件。
1.3使用Vivado综合工具来综合设计,并进行Implementation任务实现。
(1)单击综合任务下拉菜单中的Run Synthesis,综合过程将分析sell.v文件并生成网表文件。当综合过程完成了,且没有错误信息,将会弹出带有三个选项的完成对话框;
(2)如果有错误,根据错误信息提示修改,直至综合没有错误。然后选择Run Implementation选项,执行任务实现,然后单击OK;
(3)任务实现过程将在综合后的设计上运行。当这个过程完成,且没有错误信息,将会弹出带有三个选项的任务实现完成对话框;
(4)如果有错误,根据错误信息提示修改,直至综合没有错误。
1.4将开发板上的电源开关拨到ON,生成比特流并打开硬件会话,对FPGA进行编程。
(1)确保微型USB电缆连接到PROG UART接口;
(2)确保JP7设置为USB提供电源;
(3)接通电源板上的开关;
(4)点击任务实现完成弹出的对话框中Generate Bitstream或者点击导航窗口中编程和调试任务中的Generate Bitstream。比特流生成过程将在任务实现设计后运行。当完成比特流生成后会弹出有三个选项的完成对话框;
(5)这一过程将已经生成的sell.bit文件放在sell.runs目录下的impl_1目录下;
(6)选择打开硬件管理器Open Hardware Manager选项,然后单击确定。硬件管理器窗口将打开并显示“未连接”状态;
(7)点击Open a new hardware target。如果之前已经配置过开发板你也可以点击最近打开目标链接Open recent target;
(8)单击Next看Vivado自定义搜索引擎服务器名称的形式;
(9)单击Next以选择本地主机端口;
实例六 自动售饮料机_第12张图片
实例六 自动售饮料机_第13张图片
(10)单击两次Next,然后单击Finish。未连接硬件会话状态更改为服务器名称并且器件被高亮显示,如图3-2-19所示。还要注意,该状态表明它还没有被编程;
实例六 自动售饮料机_第14张图片
(11)选择器件,并验证sell.bit被选为常规选项卡中的程序文件;
实例六 自动售饮料机_第15张图片
(12) 在器件上单击鼠标右键,选择Program device或单击窗口上方弹出的Program device-> XC7z010_1链接到目标FPGA器件进行编程;
实例六 自动售饮料机_第16张图片
(13)单击确定对FPGA进行编程。开发板上Done指示灯亮时,器件编程结束;
(14)通过控制拨动和按键开关的开闭来观察LED(请参考前面的逻辑图)验证输出结果。

2. 开发板验证

首先,按住reset (SW2)拨至高电平,再来回拨动clk (SW3)1到2次,进行复位操作;其次,设置不同的输入,这里分别进行了one_dollar (SW0),half_dollar (SW1)的验证。最后,按clk时钟键,经验证该自动贩卖机功能无误。
实例六 自动售饮料机_第17张图片

3.2.4. 问题与思考

思考做一个能卖多种价格的饮料的售货机。

你可能感兴趣的:(教育,FPGA,Robei案例,高校)