cpld的verilog学习(8)

2019-09-02 19:04

RamCnt = 'b01x1Z;

RamCnt在赋值后的值为'b01010。 3.8 参数

参数是一个常量。参数经常用于定义时延和变量的宽度。使用参数说明的参数只被赋值一次。参数说明形式如下:

parameter param1 = const_expr1, param2 = const_expr2, . . . , paramN = const_exprN; 下面为具体实例:

parameter LINELENGTH = 132, ALL_X_S = 16'bx; parameter BIT = 1, BYTE = 8, PI = 3.14; parameter STROBE_DELAY = ( BYTE + BIT) / 2; parameter TQ_FILE = \

参数值也可以在编译时被改变。改变参数值可以使用参数定义语句或通过在模块初始化语句中定义参数值(这两种机制将在第9章中详细讲解)。 习题

1. 下列标识符哪些合法,哪些非法?

COunT, 1_2 Many, /**1, Real?, /wait, Initial 2. 系统任务和系统函数的第一个字符标识符是什么? 3. 举例说明文本替换编译指令? 4. 在Verilog HDL中是否有布尔类型? 5. 下列表达式的位模式是什么?

7'o44, 'Bx0, 5'bx110, 'hA0, 10'd2, 'hzF 6. 赋值后存储在Qpr中的位模式是什么? reg [1:8*2] Qpr; . . . Qpr = \

7. 如果线网类型变量说明后未赋值,其缺省值为多少?

8. Verilog HDL 允许没有显式说明的线网类型。如果是这样,怎样决定线网类型?

9. 下面的说明错在哪里? integer [0:3] Ripple;

10. 编写一个系统任务从数据文件“memA.data”中加载32×64字存储器。

11. 写出在编译时覆盖参数值的两种方法。

本章讲述在Verilog HDL中编写表达式的基础。

表达式由操作数和操作符组成。表达式可以在出现数值的任何地方使用。

4.1 操作数

操作数可以是以下类型中的一种: 1) 常数 2) 参数 3) 线网 4) 寄存器 5) 位选择 6) 部分选择 7) 存储器单元 8) 函数调用 4.1.1 常数

前面的章节已讲述了如何书写常量。下面是一些实例。 256,7 //非定长的十进制数。 4'b10_11, 8'h0A //定长的整型常量。 'b1, 'hFBA //非定长的整数常量。 90.00006 //实数型常量。

\串常量;每个字符作为8位ASCII值存储。

表达式中的整数值可被解释为有符号数或无符号数。如果表达式中是十进制整数,例如,12被解释为有符号数。如果整数是基数型整数(定长或非定长),那么该整数作为无符号数对待。下面举例说明。 12是01100的5位向量形式(有符号) -12是10100的5位向量形式(有符号) 5'b01100是十进制数12(无符号) 5'b10100是十进制数20(无符号) 4'd12是十进制数12(无符号)

更为重要的是对基数表示或非基数表示的负整数处理方式不同。非基数表示形式的负整数作为有符号数处理,而基数表示形式的负整数值作为无符号数。因此-44和-6'o54

(十进制的44等于八进制的54)在下例中处理不同。 integer Cone; . . .

Cone = -44/4 Cone = -6'o54/ 4;

注意-44和-6'o54以相同的位模式求值;但是-44作为有符号数处理,而-6'o54作为无符号数处理。因此第一个字符中Cone的值为-11,而在第二个赋值中Cone的值为1073741813。 4.1.2 参数

前一章中已对参数作了介绍。参数类似于常量,并且使用参数声明进行说明。下面是参数说明实例。

parameter LOAD = 4'd12, STORE = 4'd10;

LOAD 和STORE为参数的例子,值分别被声明为12和10。 4.1.3 线网

可在表达式中使用标量线网(1位)和向量线网(多位)。下面是线网说明实例。

wire [0:3] Prt; //Prt 为4位向量线网。 wire Bdq; //Bbq 是标量线网。

线网中的值被解释为无符号数。在连续赋值语句中, assign Prt = -3;

Prt被赋于位向量1101,实际上为十进制的13。在下面的连续赋值中, assign Prt = 4'HA;

Prt被赋于位向量1010,即为十进制的10。 4.1.4 寄存器

标量和向量寄存器可在表达式中使用。寄存器变量使用寄存器声明进行说明。例如: integer TemA, TemB; reg [1:5] State; time Que [1:5];

整型寄存器中的值被解释为有符号的二进制补码数,而reg寄存器或时间寄存器中的值被解释为无符号数。实数和实数时间类型寄存器中的值被解释为有符号浮点数。

TemA = -10; //TemA值为位向量10110,是10的二进制补码。 TemA = 'b1011; //TemA值为十进制数11。

State = -10; //State值为位向量10110,即十进制数22。 State = 'b1011; //State值为位向量01011,是十进制值11。 4.1.5 位选择

位选择从向量中抽取特定的位。形式如下:

net_or_reg_vector [bit_select_expr] 下面是表达式中应用位选择的例子。 State [1] && State [4] //寄存器位选择。 Prt [0] | Bbq //线网位选择。

如果选择表达式的值为x、z,或越界,则位选择的值为x。例如State [x]值为x。 4.1.6 部分选择

在部分选择中,向量的连续序列被选择。形式如下: net_or_reg_vector [msb_const_expr:1sb_const_expr] 其中范围表达式必须为常数表达式。例如。 State [1:4] //寄存器部分选择。 Prt [1:3] //线网部分选择。

选择范围越界或为x、z时,部分选择的值为x。 4.1.7 存储器单元

存储器单元从存储器中选择一个字。形式如下: memory [word_address] 例如:

reg [1:8] Ack, Dram [0:63]; . . .

Ack = Dram [60]; //存储器的第60个单元。 不允许对存储器变量值部分选择或位选择。例如, Dram [60] [2] 不允许。 Dram [60] [2:4] 也不允许。

在存储器中读取一个位或部分选择一个字的方法如下:将存储器单元赋值给寄存器变量,然后对该寄存器变量采用部分选择或位选择操作。例如,Ack [2]

和Ack [2:4]是合法的表达式。 4.1.8 函数调用

表达式中可使用函数调用。函数调用可以是系统函数调用(以$字符开始)或用户定义的函数调用。例如: $time + SumOfEvents (A, B)

/*$time是系统函数,并且SumOfEvents是在别处定义的用户自定义函数。*/

4.2 操作符

Verilog HDL中的操作符可以分为下述类型:

1) 算术操作符 2) 关系操作符 3) 相等操作符 4) 逻辑操作符 5) 按位操作符 6) 归约操作符 7) 移位操作符 8) 条件操作符 9) 连接和复制操作符

下表显示了所有操作符的优先级和名称。操作符从最高优先级(顶行)到最低优先级(底行)排列。同一行中的操作符优先级相同。 除条件操作符从右向左关联外,其余所有操作符自左向右关联。下面的表达式: A + B - C 等价于:

(A + B ) - C //自左向右 而表达式: A ? B : C ? D : F 等价于:

A ? B : (C ? D : F) //从右向左

圆扩号能够用于改变优先级的顺序,如以下表达式: (A ? B : C) ? D : F 4.2.1 算术操作符 算术操作符有: * +(一元加和二元加) * -(一元减和二元减) * *(乘) * /(除) * %(取模)

整数除法截断任何小数部分。例如: 7/4 结果为 1

取模操作符求出与第一个操作符符号相同的余数。 7%4 结果为 3 而:

- 7%4 结果为 -3


cpld的verilog学习(8).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:停车设备基础知识培训稿(定稿) - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: