verilog数字系统设计教程课件1PPT文件格式下载.ppt
《verilog数字系统设计教程课件1PPT文件格式下载.ppt》由会员分享,可在线阅读,更多相关《verilog数字系统设计教程课件1PPT文件格式下载.ppt(69页珍藏版)》请在冰点文库上搜索。
![verilog数字系统设计教程课件1PPT文件格式下载.ppt](https://file1.bingdoc.com/fileroot1/2023-5/7/98d4a06d-4a6a-406b-a2d2-05e580e591ac/98d4a06d-4a6a-406b-a2d2-05e580e591ac1.gif)
always(posedgeclock)if(ControlSwith=ON)out=in;
elseout=out;
带复位端和使能端的寄存器,moduleregena(clock,ena,reset,R,Q);
parametern=8;
inputn-1:
0R;
inputclock,enareset;
outputn-1:
0Q;
always(posedgeclockornegedgereset)if(!
reset)Q=0;
elseif(ena)Q=R;
endmodule,ena,R,clock,D,Q,Q,reset,具有并行置数和使能控制输入的移位寄存器,具有并行置数和使能控制输入的移位寄存器,moduleshiftregs(R,load,ena,w,clock,Q,reset);
input3:
inputw,load,ena,reset,clock;
output3:
reg3:
integerk;
elseif(load)Q=R;
elseif(ena)beginQ0=W;
for(k=1;
k4;
k+1)Qk=Qk-1;
endendmodule,组合逻辑举例之二:
一个八位三态数据通路控制器,defineON1b1defineOFF1b0wireLinkBusSwitch;
0outbuf;
inout7:
0bus;
assignbus=(LinkBusSwitch=ON)?
outbuf:
8hzz,.,.,八位三态数据通路控制器的波形:
静态随机存储器(SRAM),Sel信号必须维持一定时间,直到经过两个反向器传递过来的Data信号可以自动保持;
Data的驱动能力必须大于小反向器的驱动能力;
用的三极管很少,可以把密度做得很高。
静态随机存储器(SRAM)阵列,地址译码和SRAM块的读写,Dataoutput,开关逻辑应用举例寄存器间数据流动的控制开关,开关逻辑应用举例寄存器间数据流动的控制开关,开关逻辑的时延问题控制数据运算和流动的开关的开启和关闭时序.,全局时钟网和平衡树结构,避免冒险和竞争,由于组合逻辑和布线的延迟引起,避免冒险和竞争与流水线,组合逻辑和布线的延迟在组合逻辑中的叠加,为什么要设计有限状态机?
如果能严格以时钟跳变沿为前提,按排好时时序,来操作逻辑系统中每一个开关Si,则系统中数据的流动和处理会按同一时钟节拍有序地进行,可以控制冒险和竞争现象对逻辑运算的破坏,时延问题就能有效地加以解决。
利用同步有限状态机就能产生复杂的以时钟跳变沿为前提的同步时序逻辑,并提供操作逻辑系统的开关阵列所需要的复杂控制时序(具有信号互锁和先后次序等要求的)。
为什么要设计有限状态机?
如果我们能设计这样一个电路:
1)能记住自己目前所处的状态;
2)状态的变化只可能在同一个时钟的跳变沿时刻发生,而不可能发生在任意时刻;
3)在时钟跳变沿时刻,如输入条件满足,则进入下一状态,并记住自己目前所处的状态,否则仍保留原来的状态;
4)在进入不同的状态时刻,对系统的开关阵列做开启或关闭的操作。
clock,10ns,S2,开,关,S1,t,t,t,Sn,S3,t,t,t,S4,为什么要设计有限状态机?
有了以上电路,我们就不难设计出复杂的控制序列来操纵数字系统的控制开关阵列。
能达到以上要求的电路就是时序和组合电路互相结合的产物:
同步有限状态机和由状态和时钟共同控制的开关逻辑阵列。
我们只要掌握有限状态机的基本设计方法,加上对基本电路的掌握,再加上对数据处理的过程的细致了解,我们就可以避免由于逻辑器件和布线延迟产生的冒险竞争现象所造成的破坏,设计出符合要求的复杂数字逻辑系统。
数字系统的构成示意图,同步有限状态机的设计,什么是有限状态机(FSM)FSM的种类和不同点设计举例,什么是有限状态机?
-有限状态机是由寄存器组和组合逻辑构成的硬件时序电路;
-其状态(即由寄存器组的1和0的组合状态所构成的有限个状态)只能在同一时钟跳变沿的情况下才能从一个状态转向另一个状态;
-究竟转向哪一状态不但取决于各个输入值,还取决于当前状态。
-状态机可用于产生在时钟跳变沿时刻开关的复杂的控制逻辑,是数字逻辑的控制核心。
Mealy状态机下一个状态=F(当前状态,输入信号);
输出信号=G(当前状态,输入信号);
图1.时钟同步的状态机结构(Mealy状态机),Moor状态机下一个状态=F(当前状态,输入信号)输出信号=G(当前状态);
带流水线输出的Mealy状态机下一个状态=F(当前状态,输入信号);
输出,简单的状态机设计举例,状态转移图表示RTL级可综合的Verilog模块表示,有限状态机的图形表示,图形表示:
状态、转移、条件和逻辑开关,图3.4状态转移图,有限状态机的Verilog描述,定义模块名和输入输出端口;
定义输入、输出变量或寄存器;
定义时钟和复位信号;
定义状态变量和状态寄存器;
用时钟沿触发的always块表示状态转移过程;
在复位信号有效时给状态寄存器赋初始值;
描述状态的转换过程:
符合条件,从一个状态到另外一个状态,否则留在原状态;
验证状态转移的正确性,必须完整和全面。
表示方法之一,modulefsm(Clock,Reset,A,K2,K1);
inputClock,Reset,A;
/定义时钟、复位和输入信号outputK2,K1;
/定义输出控制信号的端口regK2,K1;
/定义输出控制信号的寄存器reg1:
0state;
/定义状态寄存器parameterIdle=2b00,Start=2b01,Stop=2b10,Clear=2b11;
/定义状态变量参数值always(posedgeClock)if(!
Reset)begin/定义复位后的初始状态和输出值state=Idle;
K2=0;
K1=0;
end,表示方法之一(续),elsecase(state)Idle:
beginif(A)beginstate=Start;
endelsestate=Idle;
endStart:
beginif(!
A)state=Stop;
elsestate=Start;
end,表示方法之一(续),Stop:
begin/符合条件进入新状态,否则留在原状态if(A)beginstate=Clear;
K2=1;
endelsestate=Stop;
endClear:
A)beginstate=Idle;
K1=1;
endelsestate=Clear;
endendcaseendmodule,表示方法之二,我们还可以用另一个VerilogHDL模型来表示同一个有限状态,见下例。
(用可综合的Verilog模块设计用独热码表示状态的状态机)modulefsm(Clock,Reset,A,K2,K1);
outputK2,K1;
regK2,K1;
parameterIdle=4b1000,Start=4b0100,Stop=4b0010,Clear=4b0001;
表示方法之二(续),always(posedgeclock)if(!
Reset)beginstate=Idle;
endelsecase(state)Idle:
if(A)beginstate=Start;
表示方法之二(续),Start:
if(!
Stop:
if(A)beginstate=Clear;
Clear:
表示方法之二(续),default:
state=Idle;
endcaseendmodule例2与例1的主要不同点是状态编码,例2采用了独热编码,而例1则采用Gray码,究竟采用哪一种编码好要看具体情况而定。
表示方法之三,在比较复杂的状态机设计过程中,我们往往把状态的变化与输出开关的控制分成两部分来考虑。
就象前面讲过的Mealy状态机输出部分的组合逻辑。
为了调试方便,还常常把每一个输出开关写成一个个独立的always组合块。
在调试多输出状态机时,这样做比较容易发现问题和改正模块编写中出现的问题。
建议同学们在设计复杂的多输出状态机时采用下面的风格举例,说明如下:
表示方法之三(续),modulefsm(Clock,Reset,A,K2,K1);
reg1:
0state,nextstate;
parameterIdle=2b00,Start=2b01,Stop=2b10,Clear=2b11;
表示方法之三(续),/-每一个时钟沿产生一次可能的状态变化-always(posedgeClock)beginif(!
Reset)state=Idle;
elsestate=nextstate;
end/-,表示方法之三(续),/-产生下一状态的组合逻辑-always(stateorA)case(state)Idle:
if(A)nextstate=Start;
elsenextstate=Idle;
Start:
A)nextstate=Stop;
elsenextstate=Start;
if(A)nextstate=Clear;
elsenextstate=Stop;
A)nextstate=Idle;
elsenextstate=Clear;
default:
nextstate=2bxx;
endcase,表示方法之三(续),/-产生输出K1的组合逻辑-always(stateorResetorA)if(!
Reset)K1=0;
elseif(state=Clear/-endmodule,表示方法之四用输出指定的码表示状态的状态机,方法四采用了另一种方法:
直接把状态码定义为输出。
也就是把状态码的指定与状态机控制的输出联系起来,把状态的变化直接用作输出,这样做可以提高输出信号的开关速度并节省电路器件。
这种设计方法常用在高速状态机中。
建议同学们在设计高速状态机时采用方法四的风格。
例中state3和state0分别表示前面两个例子中的输出K2和K1。
表示方法之四(续),modulefsm(Clock,Reset,A,K2,K1,state);
output4:
reg4:
assignK2=state4;
/把状态变量的最高位用作输出K2assignK1=state0;
/把状态变量的最低位用作输出K1,表示方法之四(续),parameter/-outputcodedstateassignment-/-K2_i_j_n_K1Idle=5b0_0_0_0_0,Start=5b0_0_0_1_0,Stop=5b0_0_1_0_0,StopToClear=5b1_1_0_0_0,Clear=5b0_1_0_1_0,ClearToIdle=5b0_0_1_1_1;
表示方法之四(续),always(posedgeClock)if(!
if(A)state=Start;
elsestate=Idle;
表示方法之四(续),Stop:
if(A)state=StopToClear;
elsestate=Stop;
StopToClear:
state=Clear;
A)state=ClearToIdle;
elsestate=Clear;
ClearToIdle:
endcaseendmodule,状态机的测试,不同风格的描述适合不同规模的状态机和不同的综合工具,有的风格查错和修改较容易,但写简单的状态机时比较麻烦。
Synopsys公司的综合器建议使用这种风格来描述状态机。
上面四个例子是同一个状态机的四种不同的VerilogHDL模型,它们都是可综合的,在设计复杂程度不同的状态机时有它们各自的优势。
如用不同的综合器对这四个例子进行综合,综合出的逻辑电路可能会有些不同,但逻辑功能是相同的。
下面列出测试这些不同风格状态机的测试模块,供同学们参考:
状态机的测试模块,timescale1ns/1nsmodulet;
rega;
regclock,rst;
wirek2,k1;
initial/initial常用于仿真时信号的给出。
begina=0;
rst=1;
/给复位信号变量赋初始值clock=0;
/给时钟变量赋初始值#22rst=0;
/使复位信号有效#133rst=1;
/经过一个多周期后使复位信号无效end,状态机的测试模块,always#50clock=clock;
/产生周期性的时钟always(posedgeclock)/在每次时钟正跳变沿时刻产生不同的abegin#30a=$random%2;
/每次a是0还是1是随机的。
#(3*50+12);
/a的值维持一段时间endinitialbegin#100000$stop;
end/系统任务,暂停仿真以便观察仿真波形。
/-调用被测试模块t.m-fsmm(.Clock(clock),.Reset(rst),.A(a),.K2(k2),.K1(k1);
endmodule,状态机设计的总结:
有限状态机设计的一般步骤:
1)逻辑抽象,得出状态转换图2)状态化简3)状态分配在触发器资源丰富的FPGA或ASIC设计中采用独热编码(one-hot-coding)既可以使电路性能得到保证又可充分利用其触发器数量多的优势,也可以采取输出编码的状态指定来简化电路结构,并提高状态机的运行速度。
4)选定触发器的类型并求出状态方程、驱动方程和输出方程。
5)按照方程得出逻辑图,状态机设计的总结:
用VerilogHDL来描述有限状态机,可以充分发挥硬件描述语言的抽象建模能力,使用always块语句和case(if)等条件语句及赋值语句即可方便地实现。
具体的逻辑化简及逻辑电路到触发器映射均可由计算机自动完成,上述设计步骤中的第2步及4、5步不再需要很多的人为干预,使电路设计工作得到简化,效率也有很大的提高。
逻辑电路的测试,故障模型测试集合的复杂性路径的激活树状结构的电路随机测试时序电路的测试电路内部自测试(Build-inSelf-Test)线路板的测试,逻辑电路的测试故障模型,信号无法变化的模型信号w总是固定在0或1:
stuck_at_0表示为:
w/0stuck_at_1表示为:
w/1单个故障和多个故障把多个故障问题简化为许多个单个故障问题来处理。
CMOS电路的故障特点晶体三极管的开路或短路:
stuck_at_0或stuck_at_1复杂的情形,不定态;
组合逻辑变为时序逻辑的行为.,逻辑电路的测试测试集合的复杂性,想要知道模块中a,b,c,d,f端中是否有电平不能变化的,需要测试信号w1,w2,w3的各种变化组合。
最全的情况有8种,最少有四种:
测试集合=001,010,011,100,逻辑电路的测试测试路径的激活(Sensitizing),把w1端的变化直接传到f端,必须把w2置1,w3置0,w4置1。
这叫做从w1到f的路径被激活。
逻辑电路的测试树状结构的电路,最小测试集合的确定比较麻烦,扫描路径的安排,电路内部自测试(Build-inSelf-Test),在芯片中必须存储有对测试向量的正确响应,经过比较知道被测试电路是否有故障。
测试向量,被测试电路,测试结果处理,x0,Pm-1,P0,Xn-1,四位内部逻辑块观察器Built-inLogicBlockObserver(BILBO),M1M2的不同组合产生不同的功能,sin,xor,四位内部逻辑块观察器(BILBO)的M1M2的不同组合时不同的功能,M1M2=11,正常系统模式,p0到p3直接传递到q0到q3;
M1M2=00,当G/S=1时,为移位寄存器模式,测试矢量一位一位地移动进入,给被测试电路一位一位地加上测试信号。
当G/S=0时,电路成为二进制伪随机序列发生器。
(xor的两个为输入端相同时,输出为0,否则为1)M1M2=10,为签字模式,p0到p3与寄存器中存储的数比较后,得到签字输出q0到q3,相同为0,不同出现1。
M1M2=01,复位模式,所有触发器置0。
签字分析,分五个步骤完成签字分析过程:
签字分析的五个步骤,把测试向量一位一位地输入BILBO1,复位BILBO2。
用BILBO1做伪随机序列信号源,用BILBO2产生签字分析结果。
把BILBO2的内容逐位输出,在外面比较签字分析;
然后逐位向BILBO2输入CN2的测试向量,启动测试;
把BILBO1中的寄存器复位。
用BILBO2做伪随机序列信号源,用BILBO1产生签字分析结果。
把BILBO1的内容逐位输出,在外面比较签字分析。
边界扫描,电路的可测试性:
可以施加测试向量,并可观察输出结果。
电路的可测试性包括:
芯片的可测试、线路板可测试、系统可测试。
用移位寄存器的方法,把测试向量逐位移入寄存器,把测试结果逐位移出寄存器,与EDA仿真工具的结果进行比较,分析真实的物理线路是否运行正常。
这个方法非常普及。
已经建立有关边界扫描的国际标准:
IEEEStandard1149.1.设计线路板、芯片都要符合国际标准。
有自动化工具在芯片设计的过程中(功能逻辑设计结束后)插入有关DFT(DesignForTest)设计。
有关测试的总结,小规模的电路可以进行全覆盖测试来验证它的功能。
组合逻辑可以根据真值表来测试。
时序逻辑可以根据状态转移表来测试。
如果电路是根据上面介绍的可测试性来设计的,则小规模的电路进行完整的测试是比较容易的。
大规模电路无法进行全覆盖的穷举测试,因为测试向量数量太大,必须动脑筋想办法找到可管理的有效测试集合,以节省测试时间。
EDA工具对于得到设计电路的测试集是有帮助的,但是并不能确定电路的功能确实完全符合设计初衷。