hdm - FPGA知识点(4)

2025-07-14

更为重要的是对基数表示或非基数表示的负整数处理方式不同。非基数表示形式的负整数作为有符号数处理,而基数表示形式的负整数值作为无符号数。因此-44和-6'o54 (十进制的44等于八进制的54)在下例中处理不同。

integer Cone; . . .

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

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

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

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

线网中的值被解释为无符号数。

assign Prt = -3; Prt被赋于位向量1101,实际上为十进制的13。 assign Prt = 4'HA; Prt被赋于位向量1010,即为十进制的10。

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。

位选择从向量中抽取特定的位。net_or_reg_vector [bit_select_expr] State [1] && State [4] //寄存器位选择。 Prt [0] | Bbq //线网位选择。

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

State [1:4] //寄存器部分选择。 Prt [1:3] //线网部分选择。

选择范围越界 或 为x、z时, 部分选择的值为x。

存储器单元从存储器中选择一个字。形式如下:

memory [word_address]

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

Ack = Dram [60]; //存储器的第60个单元。

将存储器单元赋值给寄存器变量,然后对该寄存器变量 采用部分选择或位选择操作。例如,Ack [2] 和Ack [2:4]是合

法的表达式。

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

4.2 操作符

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

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

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

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

算术操作符中的任意操作数是X或Z,那么整个结果为X。'b10x1 + 'b01111 结果为不确定数'bxxxxx

2. 无符号数和有符号数

执行算术操作和赋值时,注意哪些操作数为无符号数、哪些操作数为有符号数非常重要。无符号数存储在: * 线网 * 一般寄存器

* 基数格式表示形式的整数 有符号数存储在: * 整数寄存器

* 十进制形式的整数

reg [0:5] Bar;

integer Tab; . . .

Bar = -4'd12; //寄存器变量Bar的十进制数为52,向量值为110100。 Tab = -4'd12; / /整数Tab的十进制数为-12,位形式为110100。

-4'd12 / 4 //结果是1073741821。 -12 / 4 //结果是-3

Bar = 4 - 6; Tab = 4 - 6;

Bar被赋于十进制值62(-2的二进制补码),而Tab被赋于十进制值-2(位向量为111110)。

Bar = -2 + (-4); Tab = -2 + (-4);

Bar被赋于十进制值58(位向量为111010),而Tab被赋于十进制值-6(位向量为111010)。

关系操作符有:

* >(大于)* <(小于)* >=(不小于)* <=(不大于) 关系操作符的结果为真(1)或假(0)。如果操作数中有一位为X或Z,那么结果为X。

* = =(逻辑相等) * !=(逻辑不等) * = = =(全等) * != =(非全等) 在全等比较中,值x和z严格按位比较。

逻辑比较中,值x和z具有通常的意义,且结果可以不为x

在逻辑比较中,如果两个操作数之一包含x或z,结果为未知的值(x)。 Data = 'b11x0; Addr = 'b11x0;

那么:Data = = Addr 不定,也就是说值为x,但: Data = = = Addr 为真,也就是说值为1。

如果操作数的长度不相等,长度较小的操作数在左侧添0补位,例如:

==和!=是比较逻辑值,由于操作数中某些位可能是x,所以比较结果也有可能是x。

===和!==是按位比较,所以不会出现结果为x的情况。

逻辑操作符有: * && (逻辑与) * || (逻辑或) * !(逻辑非) 这些操作符在逻辑值0或1上操作。逻辑操作的结构为0或1 对于向量操作, 非0向量作为1处理。例如,假定: A_Bus = 'b0110; B_Bus = 'b0100; 那么:

A_Bus || B_Bus 结果为1 A_Bus && B_Bus 结果为 1

! A_Bus 与! B_Bus的结果相同。 结果为0。

如果任意一个操作数包含x,结果也为x。 !x 结果为x

按位操作符有:

* ~(一元非) * &(二元与) * |(二元或) * ^(二元异或) * ~^, ^~(二元异或非)

4.2.9 连接和复制操作

连接操作是将小表达式合并形成大表达式的操作。形式如下: {expr1, expr2, . . .,exprN}

wire [7:0] Dbus; wire [11:0] Abus;

assign Dbus [7:4] = {Dbus [0], Dbus [1], Dbus[2], Dbus[3]}; //以反转的顺序将低端4位赋给高端4位。 assign Dbus = {Dbus [3:0], Dbus [7:4]}; //高4位与低4位交换。

由于非定长常数的长度未知, 不允许连接非定长常数 {Dbus,5} //不允许连接操作非定长常数。

移位操作符有:

* << (左移) * >> (右移)

条件操作符根据条件表达式的值选择表达式,形式如下: cond_expr ? expr1 : expr2

如果cond_expr 为真(即值为1),选择expr1;如果cond_expr为假(值为0),选择expr2。

2.5 结构化描述形式

1) 内置门原语(在门级);

2) 开关级原语(在晶体管级); 3) 用户定义的原语(在门级); 4) 模块实例 (创建层次结构)。 nand #1 (Q, R, Qbar);

nand #1 (Qbar, S, Q,);

//在门实例语句中,实例名称是可选的。

门级模型是对电路的具体描述,主要是描述与、或、非等基本电路的连接方式;开关级建模则更加接近“底层”,它把最基本的MOS晶体管连接起来实现电路功能。 Verilog HDL中提供下列内置基本门: 1) 多输入门:and, nand,or, nor,xor,xnor

2) 多输出门:buf, not

3) 三态门:bufif0, bufif1, notif0,notif1

4) 上拉、下拉电阻:pullup, pulldown

5) MOS开关:cmos, nmos, pmos, rcmos, rnmos, rpmos

6) 双向开关:tran,tranif0, tranif1, rtran, rtranif0, rtranif1

gate_type [instance_name] (term1, term2, . . . ,termN);

primitive_type[instance_name] (term1, term2, .........,termN);

其中,primitive_type是26个基元之一,如and、cmos;instance_name是基元的实例名,是可选项。不同的基元输入输出端口的数量和功能都不同,termN表示输入输出端口。 输出端口在前

同一门类型的多个实例能够在一个结构形式中定义。语法如下:

gate_type

[instance_name1] (term11, term12, . . .,term1N), [instance_name2] (term21, term22, . . .,term2N), . . .

[instance_nameM] (termM1, termM2, . . .,termMN);

注意,instance_name是可选的;gate_type为前面列出的某种门类型。各term用于表示与门的输入/输出端口相连的线网或寄存器。

1) 多输入门:and, nand,or, nor,xor,xnor 只有单个输出,1个或多个输入

multiple_input_gate_type [instance_name] (OutputA, Input1, Input2, . . .,InputN); 第一个端口是输出,其它端口是输入。

and A1(Out1, In1, In2); 单元名为A1、输出为Out1、并带有两个输入In1和In2的两输入与门

and RBX (Sty, Rib, Bro, Qit, Fix); 单元名为RBX,输出为Sty,4个输入为Rib、Bro、Qit和Fix

xor (Bar, Bud[0],Bud[1], Bud[2]), (Car, Cut[0], Cut[1]),

(Sar, Sut[2], Sut[1], Sut[0], Sut[3]); 异或门,没有单元名。它的输出是Bar,三个输入分别为Bud[0]、Bud[1]和Bud[2]。这一个实例语句中还有两个相同类型的单元。

2) 多输出门:buf, 缓冲门 not 非门 只有单个输入,一个或多个输出。

multiple_output_gate_type [instance_name] (Out1, Out2, . . . OutN ,InputA); 其余的所有端口为输出端口。最后的端口是输入端口

buf B1 (Fan [0],Fan [1],Fan [2],Fan [3],Clk); Clk是缓冲门的输入。门B1有4个输出:Fan[0]到Fan[3]。 not N1 (PhA,PhB,Ready); Ready是非门的唯一输入端口 门N1有两个输出:PhA和PhB。

3) 三态门:bufif0, bufif1, not if0,notif1 对三态驱动器建模。这些门有一个输出、一个数据输入和一个控制输入 1表示控制信号不取反,0表示控制信号取反。bufif表示输出不取反,notif表示输出取反 tristate_gate[instance_name] (OutputA, IputB,ControlC);

根据控制输入,输出可被驱动到高阻状态,即值z。

对于bufif0,若通过控制输入为1,则输出为z;否则数据被传输至输出端。 对于bufif1,若控制输入为0,则输出为z。

对于notif0,如果控制输入为1,那么输出为z;否则输入数据值的非传输到输出端。 对于notif1,若控制输入为0;则输出为z。

bufif1 BF1 (Dbus,MemData,Strobe);当Strobe为0时,bufif1门BF1驱动输出Dbus为高阻;否则MemData被传输至Dbus。

notif0 NT2 (Addr, Abus, Probe); 当Probe为1时,Addr为高阻;否则Abus的非传输到Addr。

4) 上拉、下拉电阻:pullup, pulldown 没有输入 只有输出。上拉电阻将输出置为1。下拉电阻将输出置为0。

pull_gate [instance_name] (OutputA); 只包含1个输出 pullup PUP (Pwr); 上拉电阻实例名为PUP,输出Pwr置为高电平1。

5) MOS开关:c mos, n mos, p mos, rc mos, rn mos, rp mos

单向开关建模。即数据从输入流向输出,并且可以通过设置合适的控制输入关闭数据流。

MOS模型在仿真时表现为两种状态,开或关,即导通或不导通,所以MOS可作为开关使用。对于MOS来说,数据只能从输入端流向输出端,并且可以通过设置控制信号来关闭数据流,所以MOS是单向的 pmos、nmos、rnmos和rpmos都是三端口MOS开关,

pmos(p类型MOS管)、nmos(n类型MOS管),rnmos(r代表电阻)和rpmos开关 mos_type[instance_name](OutputA, InputB, ControlC);

gate_type[instance_name] (OutputA, InputB, ControlC); 第三个端口是控制输入端

如果nmos和rnmos开关的控制输入为0,pmos和rpmos开关的控制为1,那么开关关闭,即输出为z;如果控制是1,输入数据传输至输出;


hdm - FPGA知识点(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:几何12圆与扇形

相关阅读
本类排行
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 7

支付方式:

开通VIP包月会员 特价:29元/月

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