明德扬FPGA连载课程第一阶段第三章VERILOG(2)_第1页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

1、明德扬fpga连载课程第一阶段第三章verilog(2)3.2 数字3.2.1数字表示方式 在中的数字表示方式,最常用的格式是:位宽>基数>数值>,如,4b1011。 位宽:描述常量所含位数的十进制整数,是可选项。4b1011中的4就是位宽。通俗理解就是4根线。假如没有这一项,可以从常量的值判断出。例如b1011可知位宽是4;b10010可判断出位宽为5。 基数:表示数值是多少进制。可以是b,b,d,d,o,o,h或者h,分离表示二进制、十进制、八进制和十六进制。假如没有此项,则缺省默认为十进制数。 例如,二进制的4b1011,可以写成十进制的4d11,也可以写成十六进制的4

2、hb,或者八进制的4o13,还可以不写基数挺直写成11。不管怎么样,只要二进数相同,写成十进制、八进制和十六进制,都是同样的数字。 数值:是由基数所打算的表示常量真切值的一串ascii码。假如基数定义为 b或b,数值可以是0,1,x,x,z或z。假如基数定义为 o或o,数值还可以是2,3,4,5,6,7。假如基数定义为 h或h,数值还可以是8,9,a,b,c,d,e,f,a,b,c,d,e,f。对于基数为d或者d的状况,数值符可以是随意的十进制数:0到9。但不行以是x或z。 例如,4b12是错误的,由于b表示二进制,数值只能是0、1、x或者z,不有是2。 32h12等同于32h00000012

3、,也就是数值未写完整时,高位补0。3.2.2二进制是基础 在数字中,假如芯片a给芯片b传递数据,例如传递0或者1信息。可以将芯片a和芯片b,通过一个管脚举行相连。然后由芯片a控制该管脚为高电平或者低电平,通过凹凸电平来表示0和1。例如,芯片b检测到该管脚为低电平常,表示收到0;当芯片b检测到该管脚为高电平常,表示收到1。假如用低电平表示收到1,用高电平表示收到0,这可不行以呢?固然可以,只要芯片a和芯片b事先协定。芯片a要发数字1时,会将该管脚置为低电平。芯片b检测到该管脚为低电平,知道收到了数字1,通信完成。一个管脚拥有凹凸电平两种状态,可以分离表示数字0和1两种状况。假如芯片a要发数字0、

4、1、2、3给芯片b,那该怎么办呢? 可以让芯片a和芯片b衔接两根管脚,即两条线,a和b。当两条线都为低电平常,表示发送数字0;当a为高电平,b为低电平常,表示发送数字1;当a为低电平,b为高电平常,表示发送数字2;当两条线都是高电平常,表示数字3。根据同样的道理,芯片a要发送数据4,5,6,7给芯片b的时候,只要再添加一条线就可以了。三根线一共有8种状态,可以表示8个数字。 综上所述,我们可能通过线的不同电平状态,表示不同的含义。有多少个不同状态,就可以表示多少个数字。假如芯片a要发送+1,-1,0,+2等数字给芯片b,这里有正负了,那又该如何表示呢?参考前面的思想,线的凹凸电平表示的含义,是

5、由芯片双方向事先商定好的。既然是这样,那么我们拿一根线出来,例如低电平表示正数,高电平表示负数。上面就是三根线,我们用线c表示正负,0表示正数,1表示负数。用线a和线b表示数值。3b111,可以说明为十进制数7,也可以说明为有符号数原码“-3”,也可以说明为有符号数补码“-1”,这取决于工程师对二进制数的定义。只要这个定义不影响到电路之间的通信那就肯定不会有问题。 所以,数字中的“0”和“1”不仅可以表示含义,也可以表示其他意义,如正负符号等。同样的道理,在数字电路中,二进制数是其他如八进制、十进制、十六进制、有符号数、无符号数、小数等的根本。在设计中,不清晰小数、有符号数的计算办法,最根本的

6、缘由是不清晰这些数据所对应的二进制值。只要理解了它所对应的二进制值,无数问题都可以解决。 例如,有初学者常常问,fpga中如何实现小数计算,如“0.5+0.25”这个功能。首先,尽人皆知的,0.5+0.25的结果为0.75。 第二,我们可以考虑,0.5、0.25和0.75用二进制该如何表示?这取决于工程师的做法,由于这种表示办法有无数种,例如定点小数,浮点小数,甚至如前面所研究,用几根线自行来定义,只要能正常通信,那就肯定没有问题。 假设,某工程师用三根线,自行定义了二进制值所表示的小数值。为了解释二进制值的意义是可以任凭定义的,我特意将数字挨次打乱。固然,有读者可能说为什么惟独这几种小数呢?

7、这是由于我假定本系统就惟独这几种数字,假如想表示更多数字,那就增强线就行了。 有了上面定义之后,要实现“0.5+0.25”就很简单了,其实就是3b001和3b100“相加”,期望得到3b010。假如我们挺直用法3b001 + 3b100,结果为“101”了,不是想要的结果。那怎么办呢?可以这么写:固然,这是其中一种写法。总之,只要能实现所对应的功能,结果正确就可以。有读者问,按上面的表格0.1+0.8应当为0.9,但上面没有0.9的表示。这个其实是设计者这个表格定义有缺陷,或者设计者认为不会浮现这个状况吧。总之,笔者要表达的是,只要定义好所对应的二进制数,无数功能是很简单设计的。固然,实际的工

8、程中,我们通常会遵守商定成俗的做法,没须要自己搞得另类。例如下面是常用的定点小数的定义。现在要实现0+0.5=0.5,也就是3b000和3b100相加,期望能得到3b100。我们发觉挺直用二进制3b000+3b100就可以得到3b100。 要实现0.125+0.75=0.8725,也就是3b001和3b110相加,期望能得到3b111。我们发觉挺直用二进制3b001+3b110就可以得到3b111。 要0.5+0.75=1.25,这个1.25已经超出了表示范围,要不就增强信号位宽,要不只能表示小数位。假如只是表示小数位,那结果就是0.25。也就是3b100和3b110相加,期望得到3b010。

9、我们发觉3b100 + 3b110 = 4b1010,用3位表示就是3b010,也就是0.25了。 综上所述,对于定点小数的计算很容易,就是挺直相加。3.2.3不定态 前面讲过,数字电路惟独高电平和低电平,分离表示1和0。但代码中常常能看到x和z,如1bx,1bz。那么这个x和z是什么电平呢?答案是没有实际的电平来对应。这个x和z是更多地用来表示设计者的意图或者用于目的,告知仿真器和综合器怎么说明这段代码。 x态,称之为不定态,设计者常用于推断条件,用于告知综合工具,设计者不关怀它的电平是多少,是0还是1都可以。上面的例子,条件是din=4b10x0,这个条件等价于din=4b1000|din

10、=4b1010,其中“|”是“或”符号。明德扬则建议,挺直写成din=4b1000|din=4b1010,好于写成“din=4b10x0”,挺直容易明白。 仿真的时候,有些信号产生了不定态,那么设计者就要仔细分析,这个不定态是不是应当的。假如真的不关怀它是0还是1,那么可以不解决。但明德扬建议,全部信号都不应当处于不定态,是0还是1,写清晰,不要给设计添加“思量”的棘手。3.2.4高阻态z态,普通称之为高阻态,表示设计者不驱动这个信号(既不给0也不给1),通常用于三态门接口当中。上图就是三态的应用案例。图中的衔接总线对于cpu和fpga来说,既当作输入又当作输出,是双向接口。普通的硬件电路中,

11、会将该线接上一个上拉(弱上拉)或下拉电阻(弱下拉)。 当cpu和fpga都不驱动该总线时,a点保持为高电平。当fpga不驱动该总线,cpu驱动该总线时,a点的值就由cpu打算。当cpu不驱动该总线,fpga驱动该总线时,a点的值就由fpga打算。fpga和cpu不能同时驱动该总线,否则a的电平就不确定了。通常fpga和cpu何时驱动总线,是按协议事先商议好的。上图是典型的i2c的时序。i2c的总线sda就是一个三态信号。i2c协议已规定好上面的时光中,哪段时光是由主设备驱动,哪段时光是由从设备驱动,双方都要遵守协议,不能存在同时驱动的状况。那么fpga在设计中,是如何做到“不驱动”这一行为呢?

12、这是由于fpga内部有三态门。三态门是一个硬件,上图是它的典型结构。三态门有四个接口,例如上图中的写使能wr_en、写数据wr_data、读数据rd_data和与外面器件相连的三态信号data。 注重写使能信号,当该信号有效时,三态门会将wr_data的值赋给三态线data,此时data的值由wr_data打算,当wr_data为0时,data值就为0;当wr_data为1时,data值就为1。 当写使能信号无效时,则不管wr_data值是多少,都不会对外面的data值有影响,也就是不驱动。 那么在verilog中,是通过如下两行代码来描述这一功能的。综合器看到这两行代码,就知道要综合成三态门

13、了。 这个高阻z的作用就在于这里。而且注重到,硬件上用三态线是为了削减管脚,而在fpga内部没有须要削减连线,所以用法三态信号是没故意义的。 也就是说,明德扬的设计建议,fpga内部不要用法高阻态“z”,没有须要给自己添加“思量”的棘手。固然,用法了也不会报错,也能实现功能。 总结一点,高阻态“z”是表示“不驱动总线”这个行为,事实上数字电路就是高电平或者低电平,不存在其他电平的状况。3.2 数据类型 verilog hdl的信号类型有无数种,但主要包括两种数据类型:线网类型(net type) 和寄存器类型(reg type)。明德扬的设计,也是只会用法这两个类型。3.2.1线网类型wire

14、 线网类型用于对结构化器件之间的物理连线的建模。如器件的管脚,内部器件如与门的输出等。以上面的加法器为例,输入信号a,b是由外部器件所驱动,异或门x1的输出s1是与异或门x2输入脚相连的物理衔接线,它由异或门x1所驱动。 因为线网类型代表的是物理衔接线,因此它不存贮规律值。必需由器件所驱动。通常由assign 举行赋值。如 assign a = b c;wire 类型定义语法如下: wire msb: lsb wire1, wire2, . . .,wiren; msb 和lsb 定义了范围,表示了位宽。例如7:0是8位位宽,也就是可以表示成8b0至8b1111_1111; msb和lsb必需

15、为常数值; 假如没有定义范围,缺省值为1位; 信号没有定义数据类型时,缺省为wire 类型。 对数组类型,请按降序方式,如7:0 ;不要写成0:7。wire 3:0 sat; / s a t 为4 位线型信号 wire cnt; /1 位线型信号 wire 0:31 kisp, pisp, lisp ;/ kisp, pisp, lisp 都是32位的线型信号,不建议这样定义。3.3.2寄存器类型reg reg 是最常用的寄存器类型,寄存器类型通常用于对存储单元的描述,如d型触发器、rom 等。存储器类型的信号当在某种触发机制下分配了一个值,在分配下一个值之时保留原值。但必需注重的是,reg

16、类型的变量,不一定是存储单元,如在always 语句中举行描述的必需用reg 类型的变量。 reg 类型定义语法如下: reg msb: lsb reg1, reg2, . . . r e g n; msb 和lsb 定义了范围,表示了位宽。例如7:0是8位位宽,也就是可以表示成8b0至8b1111_1111; msb和lsb必需为常数值; 假如没有定义范围,缺省值为1位; 信号没有定义数据类型时,缺省为wire 类型,不是reg型。 对数组类型,请按降序方式,如7:0 ;不要写成0:7。例如:reg 3:0 sat; / s a t 为4 位寄存器。reg cnt; /1 位寄存器。reg 1:32 kisp, pisp, lisp ;3.3.3wire和reg定义的场合区别 reg型信号不一定生成寄存器。那么什么时候用法wire类型,什么时候用reg类型,明德扬总结出一套办法:在本模块中,用法always设计的信号都定义为reg型;其他都用wire型。上面代码中,cnt1是用always设计的,所以要用reg型。add_cnt1和end_cnt不是由always产生的,所以定义为wire型。上面代码中,x是用always设计的,所以要定义为reg型。注重,实际的电路中,x不是寄存器,但我们仍然定义为reg型。 上面是例化的代码,其中

温馨提示

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

评论

0/150

提交评论