南京观海微电子----Verilog基础(一)——数据类型、运算符

简介: 本文介绍了硬件描述语言中的基本数据类型与运算符。内容涵盖整数、X/Z不定值、参数(parameter)与局部参数(localparam)、变量(如wire、reg、memory)的定义与用法,并详细讲解了阻塞与非阻塞赋值的区别及其在时序与组合逻辑中的应用,同时介绍了拼接、位运算、赋值等运算符及优先级规则。

1. 数据类型

1.1 常量

整数:整数可以用二进制b或B,八进制o或O,十进制d或D,十六进制h或H表示,例如,8’b00001111表示8位位宽的二进制整数,4’ha表示4位位宽的十六进制整数。

X和Z:X代表不定值,z代表高阻值,例如,5’b00x11,第三位不定值,3’b00z表示最低位为高阻值。

下划线:在位数过长时可以用来分割位数,提高程序可读性,如8’b0000_1111

1.2 参数

参数 parameter:parameter可以用标识符定义常量,运用时只使用标识符即可,提高代码可读性及维护性,如定义parameterwidth = 8 ; 定义寄存器reg[width-1:0] a; 即定义了8位宽度的寄存器。

参数的传递:在一个模块中如果有定义参数,在其他模块调用此模块时可以传递参数,并可以修改参数,如下所示,在module后用#()表示。

1.3 传参示例

例如模块定义如下,该ROM模块有两个输入参数,其中addr变量为15位位宽,data变量为8位位宽:

module ROM

#(

   parameter depth=15,

   parameter width = 8

)

(

   input [depth-1:0] addr,

   input[width-1:0] data,

   output result

) ;

endmodule

调用该ROM模块时,可以在调用时修改传参来修改参数。如下代码,在调用ROM模块时,将depth和width变量的位宽分布修改成了32位位宽和16位位宽。

module top() ;

wire [31:0] addr ;

wire [15:0] data ;

wire result ;

ROM

#(

   .depth(32),

   .width(16)

)

ROM1

(

   .addr(addr) ,

   .data(data) ,

   .result(result)

) ;

endmodule

Parameter可以用于模块间的参数传递,而localparam仅用于本模块内使用,不能用于参数传递。Localparam多用于状态机状态的定义。

1.4 变量

变量是指程序运行时可以改变其值的量,下面主要介绍几个常用了变量类型。

1.4.1 Wire型

Wire 类型变量,也叫网络类型变量,用于结构实体之间的物理连接,如门与门之间,不能储存值,用连续赋值语句assign赋值,定义为wire[n-1:0] a ;其中n 代表位宽,如定义wire a ; assign a = b ;是将b的结点连接到连线a上。如下图所示,两个实体之间的连线即是wire类型变量。

1.4.2 Reg型

Reg类型变量,也称为寄存器变量,可用来储存值,必须在always语句里使用。其定义为reg [n-1:0] a ;表示n位位宽的寄存器,如reg [7:0] a;表示定义8位位宽的寄存器a。

如下所示定义了寄存器q

module TOP

(

   input d,

   input clk,

   output reg q

) ;

always @(posedge clk)

begin

   q <= d ;

end

endmodule

生成的电路为时序逻辑,下图为其结构,为D触发器。

也可以生成组合逻辑,如下面代码所示为一个数据选择器,敏感信号没有时钟

module TOP

(

   input a,

   input b,

   input c,

   input d,

   input[1:0] sel,

   output reg Mux

) ;

always @(sel or a or b or c or d)

begin

   case(sel)

   2'b00 : Mux = a ;

   2'b01 : Mux = b ;

   2'b10 : Mux = c ;

   2'b11 : Mux = d ;

   endcase

end

endmodule

最终生成电路为组合逻辑。

1.4.3 Memory型

可以用memory类型来定义RAM、ROM等存储器,其结构为reg [n-1:0]存储器名[m-1:0],意义为m个n位宽度的寄存器。例如,reg [7:0] ram [255:0]表示定义了256个8位寄存器,256也即是存储器的深度,8为数据宽度。

2. 运算符

运算符可分为以下几类:

(1)算术运算符(+,-,*,/,%)

(2)赋值运算符(=,<=)

(3)关系运算符(>,<,>=,<=,==,!=)

(4)逻辑运算符(&&,||,!)

(5)条件运算符(?:)

(6)位运算符(~,|,^,&,^~)

(7)移位运算符(<<,>>)

(8)拼接运算符({ })

大部分运算符与C/C++语言中定义的运算符用法基本上一致,这里主要介绍几种与C/C++语言中差异较大的运算符。

2.1 赋值运算符

“=”为阻塞赋值,”<=”为非阻塞赋值。阻塞赋值为执行完一条赋值语句,再执行下一条,可理解为顺序执行,而且赋值是立即执行;非阻塞赋值可理解为并行执行,不考虑顺序,在always块语句执行完成后,才进行赋值。

2.1.1 阻塞赋值运算符

下面先介绍阻塞赋值,代码如下:

module TOP

(

   input din,

   input clk,

   output reg a,b,c

) ;

always @(posedge clk)

begin

   a = din;

   b = a;

   c = b;

end

endmodule

下面是上面模块对应的仿真代码(用于给上面模块提供时钟、激励信号用于仿真模块功能的正确性):

module SimFile ();

reg din ;

reg clk ;

wire a,b,c ;

initial

begin

   din = 0 ;

   clk = 0 ;

   forever

   begin

       #({$random}%100)      // 随机等待一段时间(0~99ns之间)

       din = ~din ;

   end

end

always #10 clk = ~clk ;

TOP TOP_i

(

   .clk(clk),

   .din(din),

   .a(a),

   .b(b),

   .c(c)

);

clk时钟的周期是20ns,从仿真结果可以看到,在clk的上升沿时,寄存器a的值等于输入din的值,并立即赋给寄存器b,b的值赋给c。

上面编写的阻塞赋值TOP模块在FPGA内部布局成的电路(RTL)如下图所示,由RTL可以明显看出,在每个时钟周期上沿到来时,寄存器a、b、c的值都被统一赋值成了输入din的值。

2.1.2 非阻塞赋值运算符

将上面编写TOP模块的赋值方式改为非阻塞赋值方式,代码如下:

module TOP

(

   input din,

   input clk,

   output reg a,b,c

) ;

always @(posedge clk)

begin

   a <= din;

   b <= a;

   c <= b;

end

endmodule

仿真代码仍然使用2.1.1节的仿真代码提供时钟和激励信号,仿真结果如下:

在每个时钟clk上升沿时,寄存器a的值没有立即赋值给b,b为a原来的值,同样,c为b原来的值。上面编写的非阻塞赋值TOP模块在FPGA内部布局成的电路(RTL)如下图所示。

一般情况下,在时序逻辑电路中使用非阻塞赋值,可避免出现竞争冒险现象。在组合逻辑中使用阻塞赋值,执行赋值语句后立即改变。在assign语句中必须用阻塞赋值。

2.2 位拼接运算符

“{ }”拼接运算符,将多个信号按位拼接,如{a[3:0], b[1:0]},将a的低4位,b的低2位拼接成6位数据。

{n{a[3:0]}}表示将n个a[3:0]拼接,{n{1’b0}}表示n位的0拼接。如{8{1’b0}}表示为8’b0000_0000。

2.3 运算符的优先级

各种运算符的优先级别如下图所示:

相关文章
|
11天前
南京观海微电子---残影原理和调试方法简介
本文详解液晶显示中AC与DC残影的成因、判定及调试方法。AC残像源于液晶配向不足,DC残像由离子聚集与电压偏置引起,可通过调节Vcom和非对称gamma改善,同时介绍Flicker闪烁现象及其优化方案。
|
11天前
南京观海微电子--STN-LCD简介
本文介绍了液晶显示屏的发展历程,重点解析STN-LCD与TN-LCD的技术差异。STN型具有高对比度、宽视角、多显示模式等优势,适用于仪器仪表等领域,虽成本较高但工艺相对简单。内容涵盖结构、工作原理及偏光片、配相膜等关键组件。
|
4天前
|
芯片
南京观海微电子---高速MOS驱动电路设计和应用指南
自举栅极驱动技术用于高边N沟道MOSFET驱动,通过自举电容和电平移位电路实现高压侧浮动供电。适用于中高电压系统,可集成于PWM控制器或专用驱动IC,提升效率并延长开关导通时间,广泛应用于电源管理领域。
南京观海微电子---高速MOS驱动电路设计和应用指南
|
1天前
|
芯片
南京观海微电子----开关调节器的控制逻辑方法
开关稳压器通过远程控制实现节能、时序管理与浪涌电流抑制。本文介绍正负逻辑控制架构,对比隔离与非隔离外部电路,实验证明其在低功耗、顺序启动中的有效应用。
|
1天前
|
容器
南京观海微电子----AC/DC、DC/DC转换器知识
AC是交流电,方向周期性变化;DC是直流电,方向不变。家用AC需经AC/DC转换器变为设备所需的DC。常见转换方式有变压器式和开关式,后者效率高、体积小。DC/DC转换器则用于调节直流电压,分降压、升压等类型,广泛应用于电子设备中。
南京观海微电子----AC/DC、DC/DC转换器知识
|
1天前
|
芯片
南京观海微电子----运放的偏置电流对运放电路产生什么影响
运放偏置电流是输入级晶体管的基极直流电流,虽微小但会引发输出误差。本文以同相放大电路为例,分析偏置电流Ib1在反馈电阻R2上产生Ib1×R2的电压误差,导致输出偏差。尤其在高精度ADC应用中,20mV误差可能引发显著阶数偏差,不可忽视。
南京观海微电子----运放的偏置电流对运放电路产生什么影响
|
1天前
|
安全 数据建模 芯片
南京观海微电子---MOS栅极-源极的下拉电阻作用
MOSFET栅极-源极下拉电阻可防止米勒电容耦合导致的误开通,并为栅极电荷提供泄放路径,避免静电损伤。其阻值兼顾泄放速度与功耗,常用于中小功率电源(10K–20K)及大功率应用(4.7K–10K),提升系统可靠性与安全性。
南京观海微电子---MOS栅极-源极的下拉电阻作用
|
1天前
|
数据建模 物联网
南京观海微电子-----PCB设计怎样降低EMI
开关电源因高频开关动作易产生EMI,影响系统稳定性。本文详解EMI的辐射、传导与感应耦合机制,剖析PCB设计中环路面积、布局布线、寄生参数等关键因素,并提供优化布局、使用电源模块、屏蔽、滤波等实用降噪技术,助力实现电磁兼容性(EMC),确保设备可靠运行。
南京观海微电子-----PCB设计怎样降低EMI
|
1天前
|
安全
南京观海微电子---DC 电源输入防反接保护电路总结
电源接反易烧毁元件,常用防反接保护有二极管型、整流桥型和MOS管型。二极管法简单但功耗高;MOS管导通电阻小、效率高,是主流方案,继电器法则适用于大电流场景。
南京观海微电子---DC 电源输入防反接保护电路总结
|
2天前
|
芯片
南京观海微电子-----555函数信号发生器电路分析
本电路利用555芯片构成多谐振荡器产生方波,经积分电路转换为三角波,再通过低通滤波器滤除高次谐波,提取基波生成正弦波。适用于固定频率信号转换,原理基于傅里叶变换,实现波形逐步变换,输出稳定正弦信号。
南京观海微电子-----555函数信号发生器电路分析