配色: 字号:
状态机理论
2013-05-23 | 阅:  转:  |  分享 
  
www.cuit.edu.cn备注页第7讲Verilog时序电路及状态机设计授课教师:邹兴平电邮地址:zou_xingping@16
3.com主要内容基本的时序电路状态机设计一、常用时序电路设计时序逻辑单元包括触发器和锁存器,可以用always过程语句
描述,也可以用任务实现对于锁存器,如果采用电平敏感周期行为进行描述,最好使用阻塞语句描述对于触发器,若采用边沿敏感的周期行为描
述,最好使用非阻塞语句描述1.锁存器电平触发的存储器单元,跟随输入变化,可能产生毛刺always@(dataorenab
le)beginIf(enable==1)q=data;Elseq=q;end2.D
触发器边沿触发存储单元,在时钟上、下沿才变化,可以抑制输入毛刺,所以应尽量使用触发器,少用锁存器。always@(posedg
eclk)Q<=data;3.多位D触发器构成的寄存器always@(posedgeclk)beginIf(oe
==1)q<=8’hz;Elseq<=data;end4.移位寄存器Always@(
posedgeclkorposedgerst) if(rst)reg_out<=3’b000;Elseca
se(mod)2’b00:reg_out<={reg_out[1:0],right_in};//左移2’b0
1:reg_out<={reg_out[2:1],left_in};//右移2’b10:reg_out<={reg_
out[1:0],parallel_in};//并行入endcase参数化的桶行移位器Modulebarrelsh
ift(din,rotate_cnt,dout);ParameterWIDTH=6;ParameterCNT_SIZE=3
;Input[CNT_SIZE-1:0]rotate_cntlInput[WIDTH-1:0]din;output[W
IDTH-1:0]dout;Wire[WIDTH-1:0]temp;Assign{dout,temp}={d
in,din}<,din[WIDTH-1:0],{rotate_cnt{1’b0}}};
5.计数器使用广泛,包括定时分频、产生时钟节拍等按触发器的翻转是否同步分为:同步计数器和异步计数器按计数方法分类:加法计数
器、减法计数器、可逆计数器(加/减法计数器)按计数容量不同:8进制、10进制等等5-1.异步计数器用T触发器构成:每个时钟翻
转一次,将低位触发器的输出端接到高位触发器的时钟输入端进行工作。例:异步8进制加法器always@(posedgeclk)
q1<=~q1;always@(posedgeq1)q2<=~q2;always@(posedgeq2)q3<=
~q3;Q3输出5-3.同步计数器与分频器1.带复位的模6二进制计数器2.占空比为50%的6分频器3.Gray计
数器以gray码作为编码方式,Gray码每次跳变,只有一位改变由常规的计数器和gray码转换电路两部分组成广泛用于跨时钟域设
计,用不同的时钟采样计数值,不会产生毛刺二进制码到gray码的转换gray最高位和二进制码相同其余位的取值取二进制码的相
应位与相邻高位异或gray[i]=bin[i]^bin[i+1]如4位二进制码到gray的转换 gray[0]=bin[0
]^bin[1] gray[1]=bin[1]^bin[2] gray[2]=bin[2]^bin[3] gray[3]=b
in[3]]Gray码到二进制码的转换最高位相同二进制码的其余位是gray码的相应位与所有高位异或如四位gray转换为二
进制Bin[0]=gray[0]^gray[1]^gray[2]^gray[3]Bin[1]=gray[1]^gray
[2]^gray[3]Bin[2]=gray[2]^gray[3]Bin[3]=gray[3]举例:源代码见gra
y_cnt6.边沿检测电路检测信号的跳变沿,如上升沿、下降沿或双沿检测广泛用于跨时钟域信号的检测,从低速时钟到高速时钟,如U
ART通信检测电路下降沿检测电路上升沿检测电路双沿检测电路Verilog源代码见edge_detect.v二、有限状态
机的设计FSM:finitestatemachine,一种重要的时序电路,在数字系统设计中有着非常重要的地位和作用,使用它可
以较容易设计出复杂的数字系统,包含组合逻辑电路有异步和同步之分,广泛使用的是同步有限状态机有限状态机的两种基本类型:mealy
型和moor型Mealy状态机结构图Moor状态机的结构图Moor和mealy状态机的选用有些资料提到Moor状态机与me
aly状态机相比,由于其状态输出与输入无关,而只与当前状态有关,所以它可以避免由输入信号引起的毛刺,因此建议使用Moor状态机实
际上只要对mealy状态机的输出逻辑加上输出寄存器进行同步,也可以有效防止毛刺产生,因此应根据实际需要选择结构状态机的设计的一般
步骤逻辑抽象,得出状态转换图状态化简如果在状态转换图中出现这样两个状态,它们在相同的输入下转换到同一状态去,
并得到一样的输出,则称它们为等价状态,可合并成一个,可以由电脑完成状态分配:又称状态编码用VerilogHDL来描述有限
状态机,使用always块语句和case(if)等条件语句及赋值语句即可方便实现举例:教材P168例12.1状态机的设计
风格状态机编程的重要依据是状态转移图,画出状态图可以使有限状态机的结构变得清晰编写代码有三种风格:一段式、两段式、三段式一段
式将状态转移寄存、状态译码和输出放在一个always块中二段式有两个always块,一个完成状态转移寄存、另一个完成状态译码和输
出三段式中两个always块,一个完成状态转移、另一个完成状态译码和输出,还对状态输出进行了寄存,有可能使用三个always,也
有可能是两个(本身已经对状态输出进行了寄存)一段式描述可读性差,更重要的是这种风格不能被综合工具很好的识别,因而比较难被优
化二段式把组合逻辑和时序逻辑分开,有较好的可读写,能被优化,但可能出现毛刺三段式在保留二段式有点的基础上,可以有效滤除毛刺,提
高工作频率,只是资源占用略多,建议使用三段式写法详见见例子程序mealyfsm(3always).v;moorefsm(2a
lways).v;one_always_fsm.v状态机的编码四种编码方式BinaryGrayOne-hot自定义
码Binary编码Binary二进制码,编码效率高,n位可表示2n种状态这种方式在译码过程中需要所有的二进位参与,导致很大
的组合逻辑电路,降低模块工作频率,消耗大量的FPGA资源更适合CPLD这种组合逻辑资源较多的器件见例子mealyfsm(3al
ways).vmoorefsm(2always).vGray码顺序跳变时因只有一位跳变而对毛刺不敏感,在某些高可靠设计或者异
步状态机中有所使用如果每一个状态都有很多调转分支,那么效果和binary一样,不会起到消除毛刺的作用。见one_always_
fsm.vOne-hot独热码任何时候寄存器中有且仅有1bit为1,其他n-1个寄存器均为0,这种编码方式比binary多用
D触发器,但译码需要的逻辑较少有两种方式:index编码、非index编码见例程index_fsm.v和not_index_f
sm.v自定义码用得比较少,最常见的是有输出指定的编码,把状态的直接作为输出,可以提高输出的速度,用在高速状态机中,有时需要增
加状态见教材P171例12.3状态机的复位和无效状态恢复复位为状态寄存器置初置,使电路进入正常工作状态并非所有状态都是有效
状态(不可到达和不可返回状态)异步或同步复位Default的使用,可默认进入任何有效状态状态机设计举例序列检测器(检测
串行输入的10011)Din为串行输入数据Resetb为复位信号Clk为时钟Out输出,检测到一个序列输出一个高电平脉冲
小节ABCEFDGH通用移位寄存器实现循环左移always@(posedgeclkorneg
edgerst_n)beginif(rst_n==1''b0)cnt_out<=3''b0;
elseif(cnt_out==3''b101)//0~5cnt_out<=3''b0
;elsecnt_out<=cnt_out+1;endalways@(posedgec
lkornegedgerst_n)beginif(rst_n==1''b0)cnt<=3
''b0;elseif(cnt==3''b101)cnt<=3''b0;else
cnt<=cnt+1;endalways@(posedgeclkornegedgerst_n)begin
if(rst_n==1''b0)clk_divide<=1''b0;elseif(c
nt>2)clk_divide<=1''b1;elseclk_divide<=
1''b0;endDQDQClksignalDQDQclksignalDQDQclksignal异或门下一状态和输出都取决于当前状态和当前输入下一状态取决于当前状态和当前输入,输出取决于当前状态IdleStartStopClearA/k1=0!AA/k2=1!Reset/k2=0k1=0!Reset/k2=0k1=0!Reset|!A/k2=0k1=1状态转移图!Reset/k2=0k1=0源代码见12_1.v
献花(0)
+1
(本文系ruguoyouyua...首藏)