用vhdl语言编写一个自动售货机,急!

用vhdl语言编写一个自动售货机,卖两种饮料,2元和3.5元,投币为三种,5角,1元和5元,要求能够显示投入金额和剩余金额,同时具有找零功能,每种饮料最多能购买2瓶!最好... 用vhdl语言编写一个自动售货机,卖两种饮料,2元和3.5元,投币为三种,5角,1元和5元,要求能够显示投入金额和剩余金额,同时具有找零功能,每种饮料最多能购买2瓶!
最好快点啊,很急的说~~
展开
 我来答
甜甜圈的店铺
2010-01-12 · TA获得超过1092个赞
知道小有建树答主
回答量:231
采纳率:100%
帮助的人:238万
展开全部
我之前写了个差不多的,你改改数据就行:
module shoumaiji (clk,a,b,duanxuan,weixuan,out,out1);
input clk;
input a,b; //a为投入0.5元信号,b为投入1元信号
output [8:1]duanxuan;//输出8位段选信号
output weixuan;//输出1位位选信号
output out; //out为高电平时售卖机闸门打开,汽水掉出来
output out1; //out1为高电平时候找0.5元

reg weixuan;
reg [8:1]duanxuan;
reg [31:0]count; //数码管动态扫描计数
reg [31:0]count1; //用于计算售卖机闸门打开时间
reg [4:1]a1,b1; //用a1,b1寄存投入的0.5元和1元硬币数目
reg out,out1;

always @(posedge a or posedge out)
begin
if(out==1) a1<=0;//汽水出来后计数值清零
else a1<=a1+4'b1;
end

always @(posedge b or posedge out)
begin
if(out==1) b1<=0;//汽水出来后计数值清零
else b1<=b1+4'b1;
end

always@(posedge clk) //1KHz时钟
begin
if(a1==5) out<=1; //因为汽水为2.5,可以给5个0.5元
else if(a1==3&&b1==1) out<=1; //可以给3个0.5元和1个1元
else if(a1==1&&b1==2) out<=1; //,可以给1个0.5元和2个1元
else if(b1==3)begin out<=1;out1<=1;end //可以给3个一块的,系统找回0.5元
else if(a1==0&&b1==0) //如果没人投币,则两位数码管显示0
begin
if(count==50) //如果实际运行中发现数码管有闪烁,可以将此数值调小
begin
weixuan<=1'b0;
duanxuan<=8'b00111111; //0
end

if(count==100) //如果实际运行中发现数码管有闪烁,可以将此数值调小
begin
weixuan<=1'b1;
duanxuan<=8'b00111111; //0
count<=0;
end
end
else if(a==1) //投币0.5元,显示0.5,假设数码管为共阴极的
begin
count<=count+1;
if(count==50) //如果实际运行中发现数码管有闪烁,可以将此数值调小
begin
weixuan<=1'b0;
duanxuan<=8'b01101101; //5
end

if(count==100) //如果实际运行中发现数码管有闪烁,可以将此数值调小
begin
weixuan<=1'b1;
duanxuan<=8'b10111111; //0.
count<=0;
end
end

else if(b==1) //投币1元,显示01
begin
count<=count+1;
if(count==50) //如果实际运行中发现数码管有闪烁,可以将此数值调小
begin
weixuan<=1'b0;
duanxuan<=8'b00000110; //1
end
if(count==100) //如果实际运行中发现数码管有闪烁,可以将此数值调小
begin
weixuan<=1'b1;
duanxuan<=8'b00111111; //0
count<=0;
end
end

if(out==1)
begin
if(count1==3000)//让闸门打开3秒,由于为1KHz时钟,故要数3000下
begin
out<=0;
out1<=0;
count1<=0;
end
else count1<=count1+1;
end

end
endmodule
原澜潭梦华
2019-07-11 · TA获得超过3741个赞
知道大有可为答主
回答量:3046
采纳率:26%
帮助的人:431万
展开全部
我之前写了个差不多的,你改改数据就行:
module
shoumaiji
(clk,a,b,duanxuan,weixuan,out,out1);
input
clk;
input
a,b;
//a为投入0.5元信号,b为投入1元信号
output
[8:1]duanxuan;//输出8位段选信号
output
weixuan;//输出1位位选信号
output
out;
//out为高电平时售卖机闸门打开,汽水掉出来
output
out1;
//out1为高电平时候找0.5元
reg
weixuan;
reg
[8:1]duanxuan;
reg
[31:0]count;
//数码管动态扫描计数
reg
[31:0]count1;
//用于计算售卖机闸门打开时间
reg
[4:1]a1,b1;
//用a1,b1寄存投入的0.5元和1元硬币数目
reg
out,out1;
always
@(posedge
a
or
posedge
out)
begin
if(out==1)
a1<=0;//汽水出来后计数值清零
else
a1<=a1+4'b1;
end
always
@(posedge
b
or
posedge
out)
begin
if(out==1)
b1<=0;//汽水出来后计数值清零
else
b1<=b1+4'b1;
end
always@(posedge
clk)
//1KHz时钟
begin
if(a1==5)
out<=1;
//因为汽水为2.5,可以给5个0.5元
else
if(a1==3&&b1==1)
out<=1;
//可以给3个0.5元和1个1元
else
if(a1==1&&b1==2)
out<=1;
//,可以给1个0.5元和2个1元
else
if(b1==3)begin
out<=1;out1<=1;end
//可以给3个一块的,系统找回0.5元
else
if(a1==0&&b1==0)
//如果没人投币,则两位数码管显示0
begin
if(count==50)
//如果实际运行中发现数码管有闪烁,可以将此数值调小
begin
weixuan<=1'b0;
duanxuan<=8'b00111111;
//0
end
if(count==100)
//如果实际运行中发现数码管有闪烁,可以将此数值调小
begin
weixuan<=1'b1;
duanxuan<=8'b00111111;
//0
count<=0;
end
end
else
if(a==1)
//投币0.5元,显示0.5,假设数码管为共阴极的
begin
count<=count+1;
if(count==50)
//如果实际运行中发现数码管有闪烁,可以将此数值调小
begin
weixuan<=1'b0;
duanxuan<=8'b01101101;
//5
end
if(count==100)
//如果实际运行中发现数码管有闪烁,可以将此数值调小
begin
weixuan<=1'b1;
duanxuan<=8'b10111111;
//0.
count<=0;
end
end
else
if(b==1)
//投币1元,显示01
begin
count<=count+1;
if(count==50)
//如果实际运行中发现数码管有闪烁,可以将此数值调小
begin
weixuan<=1'b0;
duanxuan<=8'b00000110;
//1
end
if(count==100)
//如果实际运行中发现数码管有闪烁,可以将此数值调小
begin
weixuan<=1'b1;
duanxuan<=8'b00111111;
//0
count<=0;
end
end
if(out==1)
begin
if(count1==3000)//让闸门打开3秒,由于为1KHz时钟,故要数3000下
begin
out<=0;
out1<=0;
count1<=0;
end
else
count1<=count1+1;
end
end
endmodule
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式