自动贩卖机核心电路设计设计目标(1)三种商品(咖啡、可乐、橙汁)可供选择,价格分别是3元、2元、1元。一次只能买一件商品。同时选择多种商品时,价格低的有效。投钱后选择商品,得到商品并找零钱。(2)两个投币口:1元和5元,最多投5元。当投币大于5元时,或者钱不够,则自动退款。(3)有取消功能(即按下取消键,就无条件退款)。设计过程输入有:clk(时钟信号)、I1和I5(分别表示投币一元和五元)、x1(橙汁)、x2(可乐)、x3(咖啡)、C(取消按钮)。所有信号都是高有效。输出:O1(得到商品橙汁)、O2(得到商品可乐)、O3(得到商品咖啡)r[4:0](退款数,二进制表示)自动贩卖机核心电路采用状态机设计,投币最高5元,包括初始状态,总共6个状态,分别是Init、s1、s2、s3、s4、s5,分别代表没有投币和投币1至5元。根据投币的数目不同进行状态之间的转移,在每个状态内,根据选择商品x1、x2、x3和C的是否有效进行不同的状态转移和输出O1、O2、O3和r[3:0]。具体实现采用Verilog实现。为了实现一次只能买一件商品采用语句if-elseif即可实现。为了实现取消时无条件退款,每个状态加入判断C,当C有效时,根据状态的不同,决定退款数目。Verilog代码moduleSELL(x1,x2,x3,C,I1,I5,clk,O1,O2,O3,r);inputx1,x2,x3,C,I1,I5,clk;outputO1,O2,O3;output[3:0]r;regO1,O2,O3;reg[3:0]r;reg[2:0]state;parameter[2:0]init=3'b000,s1=3'b001,s2=3'b010,s3=3'b011,s4=3'b100,s5=3'b101;always@(posedgeclk)begincase(state)init:if(I1)state=s1;elseif(I5)state=s5;elsebeginstate=init;O1=0;O2=0;O3=0;r=4'b0000;ends1:if(I1)state=s2;elseif(x1)beginO1=1;r=4'b0000;state=init;endelseif(C||x2||x3)beginr=4'b0001;state=init;O1=0;O2=0;O3=0;endelseif(I5)beginr=4'b0110;state=init;O1=0;O2=0;O3=0;endelsebeginstate=s1;O1=0;O2=0;O3=0;r=4'b0000;ends2:if(I1)state=s3;elseif(x1)beginO1=1;r=4'b0001;state=init;endelseif(x2)beginO2=1;r=4'b0000;state=init;endelseif(C||x3)beginr=4'b0010;state=init;O1=0;O2=0;O3=0;endelseif(I5)beginr=4'b0111;state=init;O1=0;O2=0;O3=0;endelsebeginstate=s2;O1=0;O2=0;O3=0;r=4'b0000;ends3:if(I1)state=s4;elseif(x1)beginO1=1;r=4'b0010;state=init;endelseif(x2)beginO2=1;r=4'b0001;state=init;endelseif(x3)beginO3=1;r=4'b0000;state=init;endelseif(C)beginr=4'b0011;state=init;O1=0;O2=0;O3=0;endelseif(I5)beginr=4'b1000;state=init;O1=0;O2=0;O3=0;endelsebeginstate=s3;O1=0;O2=0;O3=0;r=4'b0000;ends4:if(I1)state=s5;elseif(x1)beginO1=1;r=4'b0011;state=init;endelseif(x2)beginO2=1;r=4'b0010;state=init;endelseif(x3)beginO3=1;r=4'b0001;state=init;endelseif(C)beginr=4'b0100;state=init;O1=0;O2=0;O3=0;endelseif(I5)beginr=4'b1001;state=init;O1=0;O2=0;O3=0;endelsebeginstate=s4;O1=0;O2=0;O3=0;r=4'b0000;ends5:if(x1)beginO1=1;r=4'b0100;state=init;endelseif(x2)beginO2=1;r=4'b0011;state=init;endelseif(x3)beginO3=1;r=4'b0010;state=init;endelseif(C)beginr=4'b0101;state=init;O1=0;O2=0;O3=0;endelseif(I5||I1)beginr=4'b1100;state=init;O1=0;O2=0;O3=0;endelsebeginstate=s5;O1=0;O2=0;O3=0;r=4'b0000;enddefault:beginstate=init;O1=0;O2=0;O3=0;r=4'b0000;endendcaseendendmodule仿真结果分析:不连续投币1元,一共投入3个,没有投入5元。投币结束后一段时间选择x2(2元的商品),经过一个时钟周期,只有O2有效,取出相应商品,找零1元。分析:不连续投币1元,一共投入3个,间隔一个时钟周期投入一个5元,大于最大投入5元的限制。在选择商品之前,自动贩卖机退款8元,没有任何商品取出。分析:没有投入1元,投入1个5元,同时选择商品x1、x2和x3。只有O1商品取出,其它无效,找零4元。分析:没有投入1元,投入1个5元,之后选择取消,退款5元,之后再选择商品,无商品取出。结论设计Verilog程序能满足设计目标,仿真没有错误出现,符合要求。心得体会对于状态比较多,特别是输入和输出比较多的时候,才用Verilog能十分清晰简洁地描述状态转移关系,Verilog设计更加有优势。对于不确定的冗余状态和无关的转移条件,采用Verilog的default和else能十分简单地处理,省去了大量简化步骤。序列信号检测器设计目标能同时检测自己名字的首字母p和学号末位数3的ASCII编码。设计思路采用2个74x194移位寄存器进行串联,能作为一个8位的移位寄存器使用,将8位数据经过与门进行检测,在经过或门即能实现同时检测两个8位二进制序列。原理图仿真结果分析检测序列:p01110000;300110011;测试序列:000111000011001101110000001100110000000.测试结果:000000000010000010000000100000001000000.结论实现了同时检测字母p和数字3ASCII编码。心得体会采用移位寄存器进行序列检测十分方便。