《可综合的Verilog语句.docx》由会员分享,可在线阅读,更多相关《可综合的Verilog语句.docx(7页珍藏版)》请在三一办公上搜索。
1、可综合的Verilog语句可综合Verilog语句 n一: 综合就是从采用Verilog HDL 语言描述的寄存器传输级电路模型构造出门级网表的过程.产生门级网表之后,逻辑优化器读入网表并以用户指定的面积和定时约束为目标优化网表. n二. 设计流程中的综合 nVerilog HDL允许用户在不同的抽象层次上对电路进行建模,这些层次从门级、寄存器传输级、行为级直至算法级。因此,同一电路就可以有多种不同的描述方式,但不是每一中描述都是可综合的。事实上, Verilog HDL 原本被设计成一种仿真语言,而不时一种综合语言。结果导致Verilog HDL 中很多结构没有相应的硬件可以对应,例如系统调
2、用$display.同样也不存在用于寄存器传输级综合的Verilog HDL 标准子集.n正是由于存在这些问题,不同的综合系统所支持的Verilog HDL 综合子集是不同的.由于Verilog HDL 中不存在单个的对象来表示锁存器或触发器,所以每一种综合系统都会提供不同的机制以实现锁存器或触发器的建模.因此各种综合系统都定义了自己的Verilog HDL 可综合子集以及自己的建模方式. n使用Verilog HDL 以不同的方式描述了同一电路.某综合系统支持对方式A和方式B的综合,但可能不支持对方式C的综合,这意味着综合模型在不同的综合系统之间通常是不可移植的. n这一局限性使设计者不仅需
3、要理解Verilog HDL ,而且必须理解特定综合系统的建模方式,才能编写出可综合的模型.可综合的数据类型n1.网线数据类型: nWire,wor,wand,tri,supply0,supply1 n2.寄存器数据类型: nReg,integer nTime,real:不能综合. n3.常量: n整型. n实型和字符串型不能综合.可综合的运算符n1.逻辑运算符能直接映射成硬件中的基本逻辑门. n2.算术运算符 n3.关系运算符: n能综合的有:,=. n4.相等性算符: n能够综合的有:=和!=. n不能综合:=和!=(有些工具按=和!=综合). n5.移位运算符: n,移位腾出的位都补0.
4、 多个时钟的可综合情况 1.多个时钟的情况:对变量的赋值不能受多个时钟控制 例如: nn module multclk(clk1,clk2,addclk,and,rstn,subclr,subn,dsadd,dssub); n input clk1,addclk,adn,rstn,subclr,subn,clk2; n output dsadd,dssub; n reg dsadd,dssub; n reg addstate,substate; n always (posedge clk1) n begin n addstate=addclk(adn|rstn); n substate=sub
5、clr(subn&rstn); n end nalways (posedge clk2) n begin n dsadd=addstate; n dssun=substate; n end n endmodule n2.多相位时钟:对变量的赋值不能受两种不同的时钟条件的控制. n module multphase(clk,a,b,c,e); n input clk,a,b,c; n output e; n reg e,d; n always (posedge clk) n e=d|c; n always (negedge clk) n d=a&b; n endmodule 用有限状态机实现的3
6、位二进制计数器.(带进位) module fsm_count(clk,rst,dout,cout); input clk,rst; output 2:0 dout; output cout; reg cout; reg 2:0 dout; reg 3:0 state; always (posedge clk) cout,dout=state; parameter zero=4b1000,one=4b0001,two=4b0010,three=4b0011,four=4b0100, five=4b0101,six=4b0110,seven=4b0111,init=4b0000; always (
7、posedge clk) begin if(!rst) state=init; else begin case(state) zero:state=one; init:state=one; one: state=two; two:state=three; three:state=four; four:state=five; five:state=six; six:state=seven; seven:state=zero; default:state=init; endcase end end 状态机设计的一般原则: 状态机是逻辑设计中的最重要的设计内容之一,通过状态转移图设计手段可以将复杂的
8、控制时序图形化表示,分解为状态之间的转换关系,将问题简化。使用HDL语言高效、完备、安全地描述状态机在一定程度上是一件体现代码功底的设计项目。下面是一些适用于Verilog和VHDL等HDL语言编写状态机的一般性原则。 1. 状态机的编码 Biary、gray-code编码使用最少的触发器,较多的组合逻辑. 而one-hot编码反之. 由于CPLD更多的提供组合逻辑资源,而FPGA更多的提供触发器资源,所以CPLD多使用gray-code,而FPGA多使用one-hot编码。 对于小型设计使用gray-code和binary编码更有效,而大型状态机使用one-hot更高效。 2. 两段式状态机
9、的设计方法 设计FSM的方法和技巧多种多样,但是总结起来有两大类: 第一种,将状态转移和状态的操作和判断等写到一个模块中。 另一种是将状态转移单独写成一个模块,将状态的操作和判断等写到另一个模块中。 其中较好的方式是后者。其原因如下。FSM和其他设计一样,最好使用同步时序方式设计,其好处不再累述。而状态机实现后,状态转移是用寄存器实现的,是同步时序部分。状态的转移条件的判断是通过组合逻辑判断实现的,之所以第二种比第一种编码方式合理,就在于第二种编码将同步时序和组合逻辑分别放到不同的程序块中实现。这样做的好处不仅仅是便于阅读、理解、维护,更重要的是利于综合器优化代码,利于用户添加合适的时序约束条
10、件,利于布局布线器实现设计。 将FSM所有的逻辑用一个状态机描述有如下缺点:时序约束、更改、调试等问题。而且不能很好的表示MealyFSM的输出,容易写出Latches,容易出错。 module fsm_count(clk,rst,dout,cout); input clk,rst; output 2:0 dout; output cout; reg cout; reg 2:0 dout; reg 3:0 currentstate,nextstate; always (posedge clk) cout,dout=currentstate; parameter zero=4b1000,one=
11、4b0001,two=4b0010,three=4b0011,four=4b0100, five=4b0101,six=4b0110,seven=4b0111,init=4b0000; always (posedge clk) always (currentstate or rst) begin if(!rst) currentstate=nextstate; nextstate=init; else begin case(currentstate) zero:nextstate=one; init:nextstate=one; one: nextstate=two; two:nextstat
12、e=three; three:nextstate=four; four:nextstate=five; five:nextstate=six; six:nextstate=seven; seven:nextstate=zero; default:nextstate=init; endcase end end endmodule 3. 初始化状态和默认状态 一个完备的状态机应该具备初始化状态和默认状态. 当芯片加电或者复位后,状态机应该能够自动将所有判断条件复位,并进入初始化状态. 大多数FPGA有GSR信号,当FPGA加电后,GSR信号拉高,对所有的寄存器,RAM等单元复位/置位,这时配置于FPGA的逻辑并未生效,不能保证正确的进入初始化状态。所以使用GSR企图进入FPGA的初始化状态,常常会产生种种不必一定的麻烦。一般的方法是采用异步复位信号,当然也可以使用同步复位,但是要注意同步复位逻辑的设计。解决这个问题的另一种方法是将默认的初始状态的编码设为全零,这样GSR复位后,状态机自动进入初始状态。 状态机也应该有一个默认状态,当转移条件不满足,或者状态发生了突变时,要能保证逻辑不会陷入死循环。 4.不要设计异步状态机.