verilog硬件描述语言(8)有限状态机_第1页
verilog硬件描述语言(8)有限状态机_第2页
verilog硬件描述语言(8)有限状态机_第3页
verilog硬件描述语言(8)有限状态机_第4页
verilog硬件描述语言(8)有限状态机_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、综合可综合的设计 虽然Verilog提供了大量的语法可以很方便地对电路系统进行各个层次的建模,但是能够综合成实际电路的只是其中的一个子集 如果只是作算法验证,可以不考虑可综合设计的问题,但是如果目标是获得可工作的电路,必须依照可综合的语法规范来设计 不同的综合器支持的可综合子集可能略有不同 可综合设计的基本原则可综合设计的基本原则:你的每一行代码都必须具有电路的意义,能够映射成实际的电路结构;综合器没有你聪明,所以当你不知道你写的代码对应的是什么电路的时候往往综合器也不知道有限状态机 有限状态机是设计复杂时序电路最有效的方法之一。特别是设计数字逻辑的控制核心时。 moore有限状态机:输出仅依

2、赖于内部状态,跟输入无关。 mealy有限状态机:输出不仅决定于内部状态,还跟外部输入有关。 下面我们通过一个例子来了解如何描述一个状态机 下面的状态转移图表示了一个四状态的有限状态机,它的同步时钟是Clock,输入信号是 A 和 Reset,输出信号是 F 和 G。 状态的转移只能在同步时钟(Clock)的上升沿时发生,往哪个状态的转移则取决于目前所在的状态和输入的信号(Reset 和 A)。 Verilog中有许多方法可以用来描述有限状态机,最常用的是always语句和case语句。 /对状态赋值 always (state or Reset or A) begin if ( !Reset

3、) F = 0; else if (state = Stop) F = 1; end always (state or Reset or A) begin if (! Reset) G = 0; else if (state = Clear) G = 1; end使用verilog语言进行状态机设计时,需要注意的问题 建议采用case语句来建立状态机模型。 在有缺省状态的时候,要写上case语句的最后一个分支:default。 在default分支中,应将状态变量的状态设为什么? 为状态机设计异步或同步复位端。 使用always块时要注意的问题:1 1、带有带有posedgeposedge 或

4、或 negedgenegedge 关键字的事关键字的事件表达式表示沿触发的时序逻辑,没有件表达式表示沿触发的时序逻辑,没有posedgeposedge 或或negedgenegedge 关键字的表示组合关键字的表示组合逻辑或电平敏感的锁存器,或者两种都逻辑或电平敏感的锁存器,或者两种都表示。在表示时序和组合逻辑的事件控表示。在表示时序和组合逻辑的事件控制表达式中如有多个沿和多个电平,其制表达式中如有多个沿和多个电平,其间用关键字间用关键字 “ “ or ” or ” 连接连接 。 2 2、每个表示时序、每个表示时序alwaysalways块只能由一个时钟跳块只能由一个时钟跳变沿触发,置位或复位

5、最好也由该时钟跳变沿变沿触发,置位或复位最好也由该时钟跳变沿触发触发。 3、每个在每个在alwaysalways块中赋值的信号都必需定义块中赋值的信号都必需定义成成regreg型或整型型或整型。整型变量缺省为32bit。 4、alwaysalways块中应该避免组合反馈回路。块中应该避免组合反馈回路。 5、在敏感变量表中列出所有的敏感信号。在敏感变量表中列出所有的敏感信号。也就是说:用always块设计纯组合逻辑电路时, 在生成组合逻辑的always块中参与赋值的所有信号都必需有明确的值即在赋值表达式右端参与赋值的信号都必需在always (敏感电平列表)中列出, 如果在赋值表达式右端引用了敏

6、感电平列表中没有列出的信号,那么在综合时,将会为该没有列出信号隐含地产生一个透明锁存器,这是因为该信号的变化不会立刻引起所赋值的变化,而必须等到敏感电平列表中某一个信号变化时,它的作用才显现出来,也就是相当于存在着一个透明锁存器把该信号的变化暂存起来,待敏感电平列表中某一个信号变化时再起作用, 纯组合逻辑电路不可能做到这一点。这样,综合后所得电路已经不是纯组合逻辑电路了,这时综合器会发出警告提示设计中插入了锁存器。例:input a,b,c;reg e,d;always (a or b or c) begin e =d & a & b; /* 因为d没有在敏感电平列表中,所以d

7、变化时, e不能立刻变化,要等到a或b或c变化时才体现出来, 这就是说实际上相当于存在一个透 明锁存器在起作用, 把d信号的变化锁存其中 */ d =e | c; end 6、对一个寄存器型(reg)和整型(integer)变量给定位的赋值只允许在一个always块内进行,如在另一always块也对其赋值,这是非法的。状态机设计步骤1、逻辑抽象,得出状态图;2、状态化简;3、状态编码;4、描述状态机;状态机设计序列检测器 序列检测器是时序数字电路设计中经典的教学范例。 序列检测器的逻辑功能描述: 序列检测指的就是将一个指定的序列从数字码流中识别出来。本例中,我们将设计一个“10010”序列的检

8、测器。设X为数字码流输入,Z为检出标记输出,高电平表示“发现指定序列”,低电平表示“没有发现指定序列”。考虑码流为“ 110010010000100101” 则有下表:时钟12345678910111213141516171819X110010010000100101Z000001001000000010 在时钟26,码流X中出现指定序列“10010”,对应输出Z在第6个时钟变为高电平“1”,表示“发现指定序列”。同样地,在时钟1317码流,X中再次出现指定序列“10010”,Z输出“1”。注意,在时钟59还有一次检出,但它是与第一次检出的序列重叠的,即前者的前面两位同时也是后者的最后两位。

9、根据以上逻辑功能描述,我们可以分析得出状态转换图如下:Verilog HDL代码。/文件:sequence.vmodule seqdet( x, z, clk, rst);input x,clk, rst;output z;reg 2:0 state;/状态寄存器wire z;parameter IDLE= d0,A=d1, B=d2,C=d3, D= d4 ,E=d5, F=d6, G=d7;assign z=(state=D & x=0) ? 1 :0;always (posedge clk or negedge rst)if(!rst)begin state=IDLE; ende

10、lsecasex( state)IDLE: if(x=1)begin state=A;endA: if (x=0)begin state=B;endB: if (x=0)begin state=C;end elsebegin state=F;endC: if(x=1)begin state=D;end elsebegin state=G;endD: if(x=0) beginstate=E; endelse beginstate=A; endE:if(x=0) beginstate=C; endelse beginstate=A; end F: if(x=1)beginstate=A;end

11、elsebeginstate=B;endG: if(x=1)beginstate=F;enddefault: state=IDLE;endcase endmodule测试用代码:sequence.tftimescale 1ns/1nsmodule t;reg clk, rst;reg 23:0 data;wire z,x;assign x=data23;initialbeginclk=0;rst=1;#2 rst=0;#30 rst=1; /复位信号data=b1100_1001_0000_1001_0100; /码流数据endalways #10 clk=clk; /时钟信号always (

12、posedge clk) / 移位输出码流data=data22:0,data23;seqdet m ( .x(x), .z(z), .clk(clk), .rst(rst); /调用序列检测器模块/ Enter fixture code hereendmodule / t 其中、X码流的产生,我们采用了移位寄存器的方式,以方便更改测试数据。仿真结果如下图所示: 从波形中,我们可以看到程序代码正确地完成了所要设计的逻辑功能。另外,sequence.v的编写,采用了可综合的Verilog HDL 风格,它可以通过综合器的综合最终实现到FPGA中。. .状态机状态机的的置位与复位置位与复位 状态机

13、状态机的的异步置位与复位异步置位与复位 异步置位与复位是与时钟无关的.当异步置位与复位到来时它们立即分别置触发器的输出为1或0,不需要等到时钟沿到来才置位或复位。把它们列入always块的事件控制括号内就能触发always块的执行,因此,当它们到来时就能立即执行指定的操作。 状态机的异步置位与复位是用always块和事件控制实现的。先让我们来看一下事件控制的语法:事件控制语法 ( ) 沿关键词包括 posedge(用于高电平有效的set、reset或上升沿触发的时钟)和 negedge(用于低电平有效的set、reset或下降沿触发的时钟),信号可以按任意顺序列出。事件控制实例1) 异步、高电

14、平有效的置位(时钟的上升沿) (posedge clk or posedge set)2) 异步低电平有效的复位(时钟的上升沿) (posedge clk or negedge reset)3)异步低电平有效的置位和高电平有效的复位(时钟的上升沿) (posedge clk or negedge set or posedge reset )4)带异步高电平有效的置位与复位的always块样板always (posedge clk or posedge set or posedge reset) begin if(reset) begin/*置输出为0*/ end else if(set) be

15、gin /*置输出为1*/ end else begin /*与时钟同步的逻辑*/ endend5)带异步高电平有效的置/复位端的D触发器实例module dff1( q, qb, d, clk, set, reset );input d, clk, set, reset;output q, qb;/声明q和qb为reg类型,因为它需要在always块内赋值reg q, qb;always ( posedge clk or posedge set or posedge reset ) begin if(reset) beginq = 0;qb = 1; end else if (set) be

16、gin q = 1; qb = 0; endelse begin q = d; qb = d; endendendmodule 状态机状态机的的同步置位与复位同步置位与复位同步置位与复位是指只有在时钟的有效跳变沿时刻置位或复位信号才能使触发器置位或复位(即,使触发器的输出分别转变为逻辑1或0)。不要把set和reset信号名列入always块的事件控制表达式,因为当它们有变化时不应触发always块的执行。相反,always块的执行应只由时钟有效跳变沿触发,是否置位或复位应在always块中首先检查set和reset信号的电平。 事件控制语法: ()其中沿关键词指 posedge(正沿触发)或

17、 negedge(负沿触发)事件控制实例:1) 正沿触发 (posedge clk)2) 负沿触发 (negedge clk)3) 同步的具有高电平有效的置位与复位端的always块样板always (posedge clk)begin if(reset) begin/*置输出为0*/ end else if(set) begin /*置输出为1*/ endelse begin /*与时钟同步的逻辑*/ endend4) 同步的具有高电平有效的置位/复位端的D触发器module dff2( q, qb, d, clk, set, reset);input d, clk, set, reset;

18、output q, qb;reg q, qb;always (posedge clk) begin if(reset) begin q=0; qb=1; endelse if(set) begin q=1; qb=0; endelse begin q=d; qb=d; endendendmoduleVerilogVerilog模块编程要点:模块编程要点:掌握可综合风格的Verilog模块编程的八个原则会有很大的帮助。在编写时牢记这八个要点可以为绝大多数的Verilog用户解决在综合后仿真中出现的90-100% 的冒险竞争问题。1) 时序电路建模时,用非阻塞赋值。时序电路建模时,用非阻塞赋值。2

19、) 锁存器电路建模时,用非阻塞赋值。锁存器电路建模时,用非阻塞赋值。3) 用用alwaysalways块建立组合逻辑模型时,用阻塞赋块建立组合逻辑模型时,用阻塞赋值。值。4) 在同一个在同一个alwaysalways块中建立时序和组合块中建立时序和组合逻辑电路时,用非阻塞赋值。逻辑电路时,用非阻塞赋值。5) 在同一个在同一个alwaysalways块中不要既用非阻塞块中不要既用非阻塞赋值又用阻塞赋值。赋值又用阻塞赋值。6) 不要在一个以上的不要在一个以上的alwaysalways块中为同一块中为同一个变量赋值。个变量赋值。7) 用用$strobe$strobe系统任务来显示用非阻塞赋系统任务来显示用非阻塞赋值的变量值。值的变量值。8) 在赋值时不要使用在赋值时不要使用 #0 #0 延迟。延迟。 输入口(input)可以由寄存器或网络连接驱动,但它本身只能驱动网络

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论