自动售货机设计与实现Word格式.docx
- 文档编号:16443072
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:59
- 大小:1.62MB
自动售货机设计与实现Word格式.docx
《自动售货机设计与实现Word格式.docx》由会员分享,可在线阅读,更多相关《自动售货机设计与实现Word格式.docx(59页珍藏版)》请在冰豆网上搜索。
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
总体
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;
0]video_g;
output[1:
0]video_b;
outputhsync;
outputvsync;
wireclk_25M;
wire[9:
0]x;
0]y;
wire[7:
0]vga_rgb;
0]mousergb;
0]mousex;
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
=outclk_pre;
=cnt_pre;
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:
ps2_clk:
inoutstd_logic;
ps2_data:
left_button:
outstd_logic;
right_button:
mousex:
inoutstd_logic_vector(9downto0);
mousey:
inoutstd_logic_vector(9downto0)
endmouse;
architectureBehavioralofmouseis
constantTOTAL_BITS:
integer:
=33;
--数据包位数
constantWATCHDOG:
=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:
signalps2_data_hi_z:
signalfallsig,risesig:
std_logic_vector(2downto0);
signalclean_clk:
--从m1跟随ps2_clk反向输出
signalrise,n_rise:
--m1状态机输出数据
signalfall,n_fall:
signaloutput_strobe:
--锁存数据到输出寄存器
signalpacket_good:
--检查数据是否有效
signalmouseyy:
std_logic_vector(9downto0);
signalclk:
std_logic;
--mouseclk------
signalcount:
integerrange0to62;
signaldata_ready:
--rx_read_o
signalerror_no_ack:
process(clk_sys,reset)
if(reset='
1'
)then
clk<
='
0'
;
count<
elsif(clk_sys'
eventandclk_sys='
if(count=62)then
=NOTclk;
elsecount<
=count+1;
endif;
endprocess;
ps2_clk<
='
whenps2_clk_hi_z='
else'
Z'
ps2_data<
whenps2_data_hi_z='
------------------------------------
--检测ps2clk上升沿和下降沿
detect_ps2clkfall:
process(clk,reset,ps2_clk)
begin
ifreset='
then
fallsig<
="
000"
elsifclk'
eventandclk='
then
fallsig(0)<
=ps2_clk;
fallsig
(1)<
=fallsig(0);
fallsig
(2)<
=fallsig
(1);
endprocess;
fall<
whenfallsig="
110"
detect_ps2clkrise:
risesig<
risesig(0)<
risesig
(1)<
=risesig(0);
risesig
(2)<
=risesig
(1);
rise<
whenrisesig="
001"
------------------m2状态
m2statech:
process(reset,clk)
if(reset='
)then
m2_state<
=m2_reset;
elsif(clk'
=m2_next_state;
--m2状态传输逻辑
m2statetr:
process(m2_state,q,fall,rise,watchdog_timer_done,bitcount,ps2_data,packet_good)
--输出信号的缺省值
ps2_clk_hi_z<
ps2_data_hi_z<
error_no_ack<
output_strobe<
casem2_stateis
whenm2_reset=>
--复位后向鼠标发送命令字
m2_next_state<
=m2_hold_clk_l;
whenm2_wait=>
if(fall='
=m2_gather;
=m2_wait;
whenm2_gather=>
if((watchdog_timer_done='
)and(bitcount=TOTAL_BITS))then
=m2_verify;
whenm2_verify=>
--if(bitcount<
TOTAL_BITS)then--替换"
packet_good='
"
--m2_next_state<
--else
=m2_use;
--endif;
whenm2_use=>
--用状态机的9个状态实现命令字传输,使鼠标进入"
streaming"
模式,
--并等待鼠标正确应答
whenm2_hold_clk_l=>
--启动看门狗!
if(watchdog_timer_done='
=m2_data_low_1;
whenm2_data_low_1=>
--数据位开始位,d[0]andd[1]
and(bitcount=2))then
=m2_data_high_1;
whenm2_data_high_1=>
--数据位d[2]
and(bitcount=3))then
=m2_data_low_2;
whenm2_data_low_2=>
--数据位d[3]
and(bitcount=4))then
=m2_data_high_2;
whenm2_data_high_2=>
--数据位d[4],d[5],d[6],d[7]
and(bitcount=8))then
=m2_data_low_3;
whenm2_data_low_3=>
--奇偶校验位
=m2_data_high_3;
whenm2_data_high_3=>
--允许鼠标拉成低电平(ACK脉冲)
and(ps2_data='
))then
=m2_error_no_ack;
elsif(fall='
=m2_await_response;
whenm2_error_no_ack=>
--为了鼠标正确进入"
模式,状态极必须等待足够长的时间,
--确保鼠标正确应答0xFA。
whenm2_await_response=>
--if(bitcount=22)then
--m2_next_state<
whenothers=>
endcase;
-----------------------------m2状态结束
bitcoun:
bitcount<
=(others=>
'
--normalreset
=bitcount+1;
elsif(watchdog_timer_done='
--rxwatchdogtimerreset
--数据移位寄存器
dataseq:
q<
=ps2_data&
q(TOTAL_BITS-1downto1);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 自动 售货 设计 实现