1. 用VHDL描述含有异步清零和计数使能的8位二进制加减计数器源程序。
2. 完成自动售货机的VHDL描述。要求:有两种硬币:1元或5角,投入1元5角是输出
货物1,投入2元时输出货物2或者输出货物1并找5角零钱。
状态定义:S0表示初态,S1表示投入5角硬币,S2表示投入1元硬币,S3表示投入1元5角硬币,S4表示投入2元硬币。
输入信号:State_input(0)表示投入5角硬币,State_input(1)表示投入1元硬币,State_input(2)表示投入两元时选择货物1还是货物2。输入信号为1表示投入硬币/选择货物1,输入信号为0表示未投入硬币/选择货物2。
输出信号:output(0)表示输出货物1,output(1)表示输出货物2,output(2)表示找5角硬币。输出信号为1表示输出货物或找钱,输出信号为0表示不输出货物或不找钱。
要求:1、画出状态图
2、用VHDL描述完整源程序
3、在QuartusII上完成仿真,并画出RTL级电路图及时序仿真图。
library ieee;
use ieee.std_logic_1164.all; entity autosell is port(
A,B,C:in std_logic;--3种商品
in_money,out_money:in std_logic;--投币,和退币 out_m:out std_logic;--出币开关 Ya,Yb,Yc:out std_logic;--指示灯
ya_out,yb_out,yc_out:out std_logic);--出货信号 end;
architecture behaviol of autosell is
signal count:integer range 0 to 5;--技数 signal a1,b1,c1:std_logic; begin
process(out_money,in_money,A,B,C) begin
if in_money='1' then --投币 count<=count+1; end if;
if count>0 then a1<='1';else a1<='0';end if; if count>2 then b1<='1';else b1<='0';end if; if count>4 then c1<='1';else c1<='0';end if;
Ya<=a1;Yb<=b1;Yc<=c1; --指示灯亮 if (a1<='1' and A='1') then --按键选择商品
ya_out<='1';count<=count-1;else ya_out<='0'; end if;
if (b1<='1' and B='1') then
yb_out<='1';count<=count-3;else yb_out<='0';
1
end if;
if (c1<='1' and C='1') then
yc_out<='1';count<=count-5; else yc_out<='0'; end if;
if out_money='1' then --退币
count<=0;out_m<='1'; else out_m<='0'; end if;
end process; end;
设计并实现一个自动售货机控制电路
某自动售货机售A,B,C3种商品,他们的价格分别为1,3,4。 售票机进接受一元硬币。售货机面板上设有投币孔和退钱建,每种商品标识处有选择按键,上有指示灯表明当前投币说是否已经足够选买该商品。
用vhdl语言编写一个自动售货机,卖两种饮料,2元和3.5元,投币为三种,5角,1元和5元,要求能够显示投入金额和剩余金额,同时具有找零功能,每种饮料最多能购买2瓶! 最佳答案
我之前写了个差不多的,你改改数据就行:
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
2
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
3
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
4
第五章 直流-直流变流电路
5
4.简述图3-2a所示升压斩波电路的基本工作原理。
答:假设电路中电感L 值很大,电容C 值也很大。当V 处于通态时,电源E 向电感L 充 电,充电电流基本恒定为I1,同时电容C上的电压向负载R 供电,因C值很大,基本保持 输出电压为恒值Uo。设V 处于通态的时间为ton,此阶段电感L 上积蓄的能量为1 on EI t 。 当V处于断态时E和L共同向电容C充电并向负载R 提供能量。设V处于断态的时间为
6
第四章 逆变电路
7
6.并联谐振式逆变电路利用负载电压进行换相,为保证换相应满足什么条件?
答:假设在t 时刻触发VT2、VT3使其导通,负载电压uo就通过VT2、VT3施加在VT1、 VT4上,使其承受反向电压关断,电流从VT1、VT4向VT2、VT3转移,触发VT2、VT3时 刻t必须在uo过零前并留有足够的裕量,才能使换流顺利完成。
8
因篇幅问题不能全部显示,请点此查看更多更全内容