您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > Verilog12教程
Verilog有限状态机设计主要内容1VerilogHDL有限状态机的一般形式2Moore型有限状态机设计3Mealy型有限状态机设计4SystemVerilog的枚举类型应用5状态机图形编辑设计方法6状态编码7非法状态处理8硬件数字技术排除毛刺1.VerilogHDL有限状态机的一般形式有限状态机是由寄存器组和组合逻辑构成的硬件时序电路;其状态(即由寄存器组的1和0的组合状态所构成的有限个状态)只能在同一时钟跳变沿的情况下才能从一个状态转向另一个状态;究竟转向哪一状态不但取决于各个输入值,还取决于当前状态。状态机可用于产生在时钟跳变沿时刻开关的复杂的控制逻辑,是数字逻辑的控制核心。1.1为什么要使用状态机高效的顺序控制模型:状态机克服了纯硬件数字系统顺序方式控制不灵活的缺点。容易利用现成的EDA优化工具。性能稳定:状态机容易构成性能良好的同步时序逻辑模块。设计实现效率高:状态机的HDL表述丰富多样、程序层次分明,易读易懂。高速性能:在高速运算和控制方面,状态机更有其巨大的优势。高可靠性。1.2有限状态机的结构分类:从状态机的信号输出方式上:Mealy型与Moore型。米利机的下一状态和输出取决于当前状态和当前输入;摩尔机的下一状态取决于当前状态和当前输入,但其输出仅取决于当前状态。状态机的描述结构上:单过程状态机与多过程状态机。从状态表达方式:符号化状态机和确定状态编码的状态机。状态编码方式上分:顺序编码状态机、一位热码编码状态机或其它编码状态机状态机的结构包括4个部分:说明部分、主控时序过程、主控组合过程、辅助过程说明部分状态转换变量的定义和所有可能状态的说明,必要时还要确定每一状态的编码形式。说明:用参数parameter来定义各状态的,其中各状态的取值或编码必须写上。typedef是用户自定义语句关键词,enum是定义枚举类型关键词,type_user是标示符。2.主控时序过程(REG进程)负责状态机运行和在时钟驱动下负责状态转换的过程。主控组合进程(COM进程)主控组合过程也可称为状态译码过程,其任务是根据外部输入的控制信号(包括来自状态机外部的信号和来自状态机内部其它非主控的组合或时序过程的信号)以及当前状态的状态值确定下一状态(next_state)的取向,即next_state的取值内容,以及确定对外输出或对内部其它组合时序过程输出控制信号的内容。4.辅助进程配合状态机工作的组合过程或时序过程。时序过程只负责将当前状态转换为下一状态,不管将要转换的是哪一个状态。rst是低电平有效,clk是上升沿有效。观察输入信号0到3的变化,此例是Moore还是Mealy型?(2)关于参数定义表述用parameter进行参数定义虽然十分必要,一旦打来状态机萃取开关,状态定义可以十分随意。定义什么值都可以。(3)状态变量定义表述Moore型有限状态机的设计Mealy状态机:输出是当前状态和所有输入信号的函数。不依赖时钟同步。Moore状态机:输出仅为当前状态的函数,所以在输入发生变化时还要等待时钟的到来,所以比机要多等待一个时钟周期。项目一:ADC采样控制设计及多过程结构型状态机START:转换启动信号,高电平有效。ALE:模拟信号输入选通端口地址锁存信号。上升沿有效。EOC:转换结束信号。高电平有效,表示转换结束。是0809发送给状态机的信号。OE:输出允许信号,高电平有效,表示转换结束可以把结果输出去了。EOC:转换结束信号。高电平有效,表示转换结束。是0809发送给状态机的信号。过程:复位信号后进入状态s0;第二个clk上升沿后,状态机进入s1,由START、ALE发出启动采样和地址选通的控制信号,之后EOC进入了低电平,0809的8位数据输出端出现高阻态”ZZ”,在状态s2等待了数个CLK后,EOC变为高电平,表示转换结束。进入s3状态后,OE变为高电平,此时0809的数据输出端D已经输出转换好的5EH。在状态s4,LOCK_T发出一个脉冲,其上升沿立即将D端数据5E锁入Q和REGL中。把例8-2中的组合过程可以分成两个组合过程:一个负责状态译码和状态转换。另一个负责对外控制信号的输出。分开写如下:自动售货机FSMNDResetClockOpen硬币传感器商品释放机制项目二简单自动售货机设计自动售货机在收到15美分之后就会给出一件商品,这台机器具有能够接收5美分和1角硬币的单个投币口,每次投入一枚硬币,其中机械传感器用来指示插入投币口是5美分还是1角,控制器的输出导致一件商品交到顾客手中两个假设简化设计:不找零在每次使用前,机器都会复位1、理解问题假设:投入5美分,在单个周期内N为真;投入1角,在单个周期内D为真;在上一次复位之后,若收到15美分或更多,则状态机Open为真,并保持一个周期例:简单的自动售货机2、有限状态机抽象表达列出最终能给出商品的输入顺序:3个5美分:N,N,N2个5美分,再1角:N,N,D1角,5分:D,N5分,1角:N,D2个1角:D,D画状态图:输入:N,D,reset,clk输出商品:open假设:假设信号N和D从来不会同时为真省略了自环N=D=0(nocoin)只将open信号为真时列出例:简单的自动售货机3、状态最简化:状态S4~S8具有等价,可合并成一个状态每个状态表示接受到钱的数量最简化的符号状态转换表presentinputsnextoutputstateDNstateopen0¢000¢0015¢01010¢011––5¢005¢00110¢01015¢011––10¢0010¢00115¢01015¢011––15¢––15¢10¢[0]Reset5¢[0]NNN+D10¢[0]D15¢[open]D状态图状态转换表当前状态输入次态输出tQ1Q0DND1D0open0000000010101010011–––0100010011001011011–––1000100011101011011–––11––111例:简单的自动售货机4、进行状态分配4个状态,采用2位状态编码:0¢(00)、5¢(01)、10¢(10)、15¢(11)状态分配后的状态转换表简单的自动售货机(verilog)moduleautosell(clk,reset,D,N,open);inputclk,reset,D,N;outputopen;parametercell0=2'b00,cell5=2'b01,cell10=2'b10,cell15=2'b11;reg[2:1]state;reg[2:1]next_state;always@(posedgeclk)if(reset)state=cell0;elsestate=next_state;always@(NorDorstate)case(state)cell0:beginif(N)next_state=cell5;elseif(D)next_state=cell10;elsenext_state=cell0;endcell5:beginif(N)next_state=cell10;elseif(D)next_state=cell15;elsenext_state=cell10;endcell10:beginif(N)next_state=cell15;elseif(D)next_state=cell15;elsenext_state=cell10;endcell15:next_state=cell15;endcaseassignopen=(state==cell15);endmodule项目三:较复杂自动售货机设计设计目标(1)用四个发光二极管分别模拟售出价值为5角、1元、1.5元和2元的小商品,购买者可以通过开关选择任意一种标价中的小商品。(2)灯亮时表示该小商品售出。(3)用开关分别模拟5角、1元硬币和5元纸币投入,可以用几只发光二极管(或数码管)分别代表找回剩余的硬币。(4)每次只能售出一种小商品,当所投硬币达到或超过购买者所选面值时,售出货物并找回剩余的硬币,回到初始状态;(5)当所投硬币值不足面值时,可通过一个复位键退回所投硬币,回到初始状态。设计原理图由控制输入电路、FPGA、显示电路电路组成。系统工作状态分析判断开关被按下的个数N。若N=2表示所选本次选择无效,返回初始状态;若N=1则显示所选商品,并继续执行下面的流程。四个开关分别代表四种商品。另外四个开关分别代表投入0.5元,1元,2元,5元,统计投入总额。投入总额与商品价格做比较,如果总额商品价格,退钱并返回初始状态如果总额=商品价格,则继续执行下面的程序。找零=总额-商品价格,数码管显示找零金额。系统工作状态图具体工作状态要求初始状态各变量都设置为零,按下rst键后,一切恢复到初始状态。选商品状态分别有价格为0.5元、1元、1.5元和2元的商品,每次选择商品前,设置一个标志位btn_sell表示选择商品状态。此自动售货机每一次售货时只能一次选择一种商品,当同时选择两种以上时,选择商品无效,数码管显示清零,重新进行商品选择。选择商品后,数码管显示所选商品价格。投币状态当选好商品后,开始投币。同样有一标志位btn_price表示投币金额。投币口只接受三种面值的钱币0.5元、2元和5元,可以同时投入多种面值钱币。投完币后,先有一个确认买商品的过程,若投了币但又不购买商品了,就将全部投币金额退回;若确认购买商品,则进入下一状态——找零状态。找零状态投完币,并确认购买商品后,进入找零状态。首先要将所投的金额与所选商品的价格做比较,若所投金额小于商品价格,则退回所投钱币;若大于等于商品价格,则两者做差,得到需要找零的钱。Verilog端口表述moduleauto_seller(clk,rst,dis_mony,dis_price,btn_ok,btn_mon,btn_sell,led_warn,led,beep);inputclk,rst,btn_ok;input[2:0]btn_mon;//选择放入的钱input[3:0]btn_sell;//选择商品bbt_5,gz_10,kqs_15,kl_20output[3:0]led;//led_5,led_10,led_15,led_20outputled_warn;//钱不足,指示灯output[11:0]dis_mony;//数码管显示投入面值,dia_mony[11:8]=com位选,dis_mony[7:0]=段码output[11:0]dis_price;//数码管显示价钱outputbeep;regclk_500Hz;reg[3:0]led;//led_5,led_10,led_15,led_20regled_warn;//警告放入钱不足reg[11:0]dis_mony;reg[11:0]dis_price;reg[31:0]counter;reg[9:0]price,price_all;reg[1:0]flag;//数码管显示标志位regbeep;parameterCOUNT1=25'd10000;Verilog分频稳定数码管always@(posedgeclk)beginif(counter==0)begincounter=COUNT1;clk_500Hz=~clk_500Hz;endelsecounter=counter-1;end数码管显示商品价格/*分频后将时钟给数码管,数码管分别显示放入钱的多少、商品价格*/always@(posedgeclk_500Hz)begincase(flag)2'b00:begindis_mony={4'b1110,led7(price_all%10),1'b1};dis_price={4'b1110,led7(price%10),1'b1};flag=2'b01;end2'b01:begin
本文标题:Verilog12教程
链接地址:https://www.777doc.com/doc-1432451 .html