自动售货机设计与实现.docx
- 文档编号:3537734
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:59
- 大小:1.62MB
自动售货机设计与实现.docx
《自动售货机设计与实现.docx》由会员分享,可在线阅读,更多相关《自动售货机设计与实现.docx(59页珍藏版)》请在冰豆网上搜索。
自动售货机设计与实现
深圳大学实验报告
课程名称:
数字系统现场集成技术
实验项目名称:
自动售货机设计与实现
学院:
信息工程学院
专业:
集成电路设计与集成系统
指导教师:
报告人:
学号:
班级:
同组人:
学号:
班级:
实验时间:
实验报告提交时间:
一、实验目的
1、进一步熟悉ISE软件的使用,熟悉FPGA开发流程;
2、掌握编写fpga代码的步骤,学会绘制ASM图;
3、学会调用ip核实现系统的设计。
二、实验设备
1、装有ISE软件的PC机一台;2、nexys2开发板一块。
三、实验内容与要求
设计一个秒表
基本要求:
该实验为团队协作,2人一个小组。
可以对3种不同种类的货物进行自动售货,价格分别为A=4.00,B=2.50,C=1.00。
售货机可以接受10元,5元,1元三种硬币(即有三种输入信号SY,WY,IY),并且在7段数码管(二位代表元,一位代表角)显示已投入的总钱数,选择货物的输入信号Ia,Ib,Ic,输出指示信号为Sa,Sb,Sc分别表示售出相应的货物,同时输出的信号yuan,jiao代表找零,并显示在7段数码管上。
高级要求(可选):
VGA显示3种货物图片及其价格,鼠标点击购买数量(1-9)后显示总价,安规格说明2中的button2-button4输入硬币,VGA显示已投入的总钱数,鼠标点击购买后,显示找零数目,购买物品闪烁,交易完成。
规格说明:
1.按一下button1按钮,表示购买货物A,第一个LED灯亮;按两下button1按钮,表示购买货物B,第二个LED灯亮;按三下button1按钮,表示购买货物C,第三个LED灯亮,同时7段数码管显示所要购买货物的价格。
2.LED灯亮后,开始输入硬币。
button2按一下,输入10元,按两下,输入二十元,以此类推;Button3按一下输入5元,按两下输入10元,以此类推;button4按一下输入1元,按两下输入2元,以此类推。
7段数码管显示已投入的总钱数,再次按下button1键,7段数码管显示找零数目,同时指示货物的LED灯熄灭。
3.如果投入的钱币不够就按下button1键确认购买,数码管显示“ER”。
4.本实验使用FPGA板:
nexys2(建project时,需要选择该芯片的型号)。
四、实验步骤
1、设计系统框图,设计采取自上而下的设计方案,整个秒表系统的原理图如下所示。
主要包括四个模块——分频模块、vga协议模块、鼠标、vga数据处理模块。
而vga数据处理模块里面又有好几个模块–有vga数码管显示模块,显示地址模块(用来生成地址给rom的),还有好多各rom的显示模块,板子按键的处理模块以及鼠标按键的处理模块。
总的RTL图
分频器
Vga协议
Vga数据处理
Mouse
Vga数据处理
总体
2、所编写的代码如下。
------------------------顶层文件----程序主代码------------------------------------------
moduletop_2(
clear,
clk,
rst_p,
key_1yuan,
key_5yuan,
key_10yuan,
video_r,
video_g,
video_b,
ps2clk,
ps2data,
hsync,
vsync,
);
inputclear;
inputclk;
inputrst_p;
inputkey_1yuan;
inputkey_5yuan;
inputkey_10yuan;
inoutps2clk;
inoutps2data;
wirerst_n;
assignrst_n=~rst_p;
output[2:
0]video_r;
output[2:
0]video_g;
output[1:
0]video_b;
outputhsync;
outputvsync;
wireclk_25M;
wire[9:
0]x;
wire[9:
0]y;
wire[7:
0]vga_rgb;
wire[7:
0]mousergb;
wire[9:
0]mousex;
wire[9:
0]mousey;
wireleft_button;
wireright_button;
wiredata;
mouseu1ps2mouse
(
.clk_sys(clk_25M),
.reset(rst_p),
.ps2_clk(ps2clk),
.ps2_data(ps2data),
.left_button(left_button),
.right_button(right_button),
.mousex(mousex),
.mousey(mousey)
);
div#(.counter(32'b1))
div_2
(
.inclk(clk),
.rst_n(rst_n),
.outclk(clk_25M)
);
//xiaofka(
//.clk(clk_25M),
//.rst_n(rst_n),
//.x(x),
//.y(y),
//.rgb(vga_rgb)
//);
vga_picture_allvga_picture_all
(
.clk(clk_25M),
.rst_n(rst_n),
.mx(mousex),
.my(mousey),
.left_button(left_button),
.right_button(right_button),
.key_1yuan(key_1yuan),
.key_5yuan(key_5yuan),
.key_10yuan(key_10yuan),
.vga_x(x),
.vga_y(y),
.vga_rgb(vga_rgb)
);
VGA_protocolVGA_protocol
(
.video_clk(clk_25M),
.rst_n(rst_n),
//raminterface
.video_rgb(vga_rgb),
.video_x(x),//pointcoordinate
.video_y(y),
//VGAtransfer
.video_hsync(hsync),
.video_vsync(vsync),
.video_en(en_vga),
.video_r(video_r),
.video_g(video_g),
.video_b(video_b)
);
endmodule------------------------------------------------------------------------------------
-------------------------------以下是每个模块的代码----------------------------------------
--------------------------------------分频-----------------------------------------------------------
modulediv#(parametercounter=32'd1)
(inclk,rst_n,outclk);
inputinclk;
inputrst_n;
outputregoutclk;
wireoutclk_pre;
reg[31:
0]cnt;
wire[31:
0]cnt_pre;
always@(posedgeinclkornegedgerst_n)
begin
if(!
rst_n)
begin
outclk<=0;
cnt<=1;
end
else
begin
outclk<=outclk_pre;
cnt<=cnt_pre;
end
end
assigncnt_pre=(cnt==counter?
1'b1:
(cnt+1'b1));
assignoutclk_pre=(cnt==counter?
~outclk:
outclk);
endmodule-----------------------------------------------------------------------------
------------------------------鼠标-----------------------------------
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitymouseis
Port(
clk_sys:
instd_logic;
reset:
instd_logic;
ps2_clk:
inoutstd_logic;
ps2_data:
inoutstd_logic;
left_button:
outstd_logic;
right_button:
outstd_logic;
mousex:
inoutstd_logic_vector(9downto0);
mousey:
inoutstd_logic_vector(9downto0)
);
endmouse;
architectureBehavioralofmouseis
constantTOTAL_BITS:
integer:
=33;--数据包位数
constantWATCHDOG:
integer:
=320;--400usec所需sys_clk脉冲数
typem2statetypeis(m2_reset,m2_wait,m2_gather,m2_verify,m2_use,m2_hold_clk_l,
m2_data_low_1,m2_data_high_1,m2_data_low_2,m2_data_high_2,m2_data_low_3,
m2_data_high_3,m2_error_no_ack,m2_await_response);
signalm2_state,m2_next_state:
m2statetype;
signalwatchdog_timer_done:
std_logic;--命令传输超时标志
signalq:
std_logic_vector(TOTAL_BITS-1downto0);--位序列
signalbitcount:
std_logic_vector(5downto0);--位计数器
signalwatchdog_timer_count:
std_logic_vector(8downto0);--等待时间
signalps2_clk_hi_z:
std_logic;
signalps2_data_hi_z:
std_logic;
signalfallsig,risesig:
std_logic_vector(2downto0);
signalclean_clk:
std_logic;--从m1跟随ps2_clk反向输出
signalrise,n_rise:
std_logic;--m1状态机输出数据
signalfall,n_fall:
std_logic;--m1状态机输出数据
signaloutput_strobe:
std_logic;--锁存数据到输出寄存器
signalpacket_good:
std_logic;--检查数据是否有效
signalmouseyy:
std_logic_vector(9downto0);
signalclk:
std_logic;--mouseclk------
signalcount:
integerrange0to62;
signaldata_ready:
std_logic;--rx_read_o
signalerror_no_ack:
std_logic;
begin
process(clk_sys,reset)
begin
if(reset='1')then
clk<='0';
count<=0;
elsif(clk_sys'eventandclk_sys='1')then
if(count=62)then
count<=0;
clk<=NOTclk;
elsecount<=count+1;
endif;
endif;
endprocess;
ps2_clk<='0'whenps2_clk_hi_z='0'else'Z';
ps2_data<='0'whenps2_data_hi_z='0'else'Z';
------------------------------------
--检测ps2clk上升沿和下降沿
------------------------------------
detect_ps2clkfall:
process(clk,reset,ps2_clk)
begin
ifreset='1'then
fallsig<="000";
elsifclk'eventandclk='1'then
fallsig(0)<=ps2_clk;
fallsig
(1)<=fallsig(0);
fallsig
(2)<=fallsig
(1);
endif;
endprocess;
fall<='1'whenfallsig="110"else'0';
detect_ps2clkrise:
process(clk,reset,ps2_clk)
begin
ifreset='1'then
risesig<="000";
elsifclk'eventandclk='1'then
risesig(0)<=ps2_clk;
risesig
(1)<=risesig(0);
risesig
(2)<=risesig
(1);
endif;
endprocess;
rise<='1'whenrisesig="001"else'0';
------------------m2状态
m2statech:
process(reset,clk)
begin
if(reset='1')then
m2_state<=m2_reset;
elsif(clk'eventandclk='1')then
m2_state<=m2_next_state;
endif;
endprocess;
--m2状态传输逻辑
m2statetr:
process(m2_state,q,fall,rise,watchdog_timer_done,bitcount,ps2_data,packet_good)
begin
--输出信号的缺省值
ps2_clk_hi_z<='1';
ps2_data_hi_z<='1';
error_no_ack<='0';
output_strobe<='0';
casem2_stateis
whenm2_reset=>--复位后向鼠标发送命令字
m2_next_state<=m2_hold_clk_l;
whenm2_wait=>
if(fall='1')then
m2_next_state<=m2_gather;
else
m2_next_state<=m2_wait;
endif;
whenm2_gather=>
if((watchdog_timer_done='1')and(bitcount=TOTAL_BITS))then
m2_next_state<=m2_verify;
else
m2_next_state<=m2_gather;
endif;
whenm2_verify=>
--if(bitcount --m2_next_state<=m2_wait; --else m2_next_state<=m2_use; --endif; whenm2_use=> output_strobe<='1'; m2_next_state<=m2_wait; --用状态机的9个状态实现命令字传输,使鼠标进入"streaming"模式, --并等待鼠标正确应答 whenm2_hold_clk_l=> ps2_clk_hi_z<='0';--启动看门狗! if(watchdog_timer_done='1')then m2_next_state<=m2_data_low_1; else m2_next_state<=m2_hold_clk_l; endif; whenm2_data_low_1=> ps2_data_hi_z<='0';--数据位开始位,d[0]andd[1] if(fall='1'and(bitcount=2))then m2_next_state<=m2_data_high_1; else m2_next_state<=m2_data_low_1; endif; whenm2_data_high_1=> ps2_data_hi_z<='1';--数据位d[2] if(fall='1'and(bitcount=3))then m2_next_state<=m2_data_low_2; else m2_next_state<=m2_data_high_1; endif; whenm2_data_low_2=> ps2_data_hi_z<='0';--数据位d[3] if(fall='1'and(bitcount=4))then m2_next_state<=m2_data_high_2; else m2_next_state<=m2_data_low_2; endif; whenm2_data_high_2=> ps2_data_hi_z<='1';--数据位d[4],d[5],d[6],d[7] if(fall='1'and(bitcount=8))then m2_next_state<=m2_data_low_3; else m2_next_state<=m2_data_high_2; endif; whenm2_data_low_3=> ps2_data_hi_z<='0';--奇偶校验位 if(fall='1')then m2_next_state<=m2_data_high_3; else m2_next_state<=m2_data_low_3; endif; whenm2_data_high_3=> ps2_data_hi_z<='1';--允许鼠标拉成低电平(ACK脉冲) if(fall='1'and(ps2_data='1'))then m2_next_state<=m2_error_no_ack; elsif(fall='1'and(ps2_data='0'))then m2_next_state<=m2_await_response; else m2_next_state<=m2_data_high_3; endif; whenm2_error_no_ack=> error_no_ack<='1'; m2_next_state<=m2_error_no_ack; --为了鼠标正确进入"streaming"模式,状态极必须等待足够长的时间, --确保鼠标正确应答0xFA。 whenm2_await_response=> --if(bitcount=22)then m2_next_state<=m2_verify; --else --m2_next_state<=m2_await_response; --endif; whenothers=>m2_next_state<=m2_wait; endcase; endprocess;-----------------------------m2状态结束 --位计数器 bitcoun: process(reset,clk) begin if(reset='1')then bitcount<=(others=>'0');--normalreset elsif(clk'eventandclk='1')then if(fall='1')then bitcount<=bitcount+1; elsif(watchdog_timer_done='1')then bitcount<=(others=>'0');--rxwatchdogtimerreset endif; endif; endprocess; --数据移位寄存器 dataseq: process(reset,clk) begin if(reset='1')then q<=(others=>'0'); elsif(clk'eventandclk='1')then if(fall='1')then q<=ps2_data&q(TOTAL_BITS-1downto1); endif; end
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 自动 售货 设计 实现