FPGA_verilog语法整理

FPGA_verilog语法整理

verilog的逻辑值

verilog的常数表达

位宽中指定常数的宽度(表示成二进制数的位数),单引号加表示该常数为几进制的底数符号。

二进制底数符号为b,八进制为 o,十进制为d,十六进制为 h

verilog的变量声明

wire与reg

用于声明数据类型

wire型数据常用来表示以assign关键字指定的组合逻辑信号,模块的输入输出端口类型都默认为wire型,wire相当于导线,默认初始值是z。

reg型表示的寄存器类型,用于always模块内被赋值的信号,必须定义为reg型,常用于时序逻辑电路,reg相当于存储单元,默认初始值是x。

对于reg

如果这个条件是时钟的上升沿或下降沿,那么这个硬件模型就是一个触发器;

如果这个条件是某一信号的高电平或低电平,那么这个硬件模型就是一个锁存器;

如果这个条件是赋值语句右侧任意操作数的变化,那么这个硬件模型就是一个组合逻辑。

assign与always

assign(连续赋值)相当于连线,一般是将一个变量的值不间断地赋值给另一个变量,就像把这两个变量连在一起,所以习惯性的当做连线用,比如把一个模块的输出给另一个模块当输入。

always(过程赋值)

1.电平触发,例如always @(a or b or c),a、b、c均为变量,当其中一个发生变化时,下方的语句将被执行。

2.第二种是沿触发,例如always @(posedge clk or negedge rstn),即当时钟处在上升沿或下降沿时,语句被执行。

复制代码
always @(posedge clk or negedge rstn)//当时钟处在上升沿或下降沿时,语句被执行

寄存器型变量

寄存器型变量可以在接下来将要介绍的 always 和 initial 语句中实现过程赋值(Procedural Assignment)。这种方式称为过程赋值。过程赋值分为阻塞式和非阻塞式赋值两种。

非阻塞赋值--类似于于移位寄存器

阻塞式赋值是一种按照代码顺序进行赋值的方式。在先赋值的代码赋值完成之前阻塞后续代码的赋值,因此得名阻塞式赋值。阻塞式赋值使用 = 运算符。(串行)

非阻塞式赋值中所有代码不会互相阻塞,同时进行赋值。非阻塞式赋值使用 <= 运 算符。(并行)

网络型变量

复制代码
assign < 网络型变量> = < 表达式>;
< 网络类型> (符号) ( 位宽) < 变量名> = < 表达式>;

verilog中的运算符


位运算符

逻辑运算符

逻辑语句

条件分支语句if和case

复制代码
【格式】
if (< 表达式>) < 语句序列>
if (< 表达式>) < 语句序列> else < 语句序列>
【例】
if (a > b) begin
... // 符合a>b 条件的语句
end else if (a == b) begin
... // 符合a==b 条件的语句
end else begin
... // 其他条件(a<b)下的语句
end

case (< 表达式>)
< 表达式> : < 语句序列>
< 表达式>, < 表达式>, ... : < 语句序列>
default : < 语句序列>
endcase
【例】
case (data[3:0])
4'h0 : begin
... // data[3:0] 为4'h0 时的语句
end
4'h1, 4'h2 : begin
... // data[3:0] 为4'h1 或4'h2 时的语句
end
default : begin
... // 默认语句
end
endcase

if 和 case 语句可以在 initial 或 always 语句声明的过
程块中使用

循环语句 for 与 while

复制代码
【格式】
for (< 赋值语句>; < 表达式>; < 赋值语句>) < 语句序列>
【例】
for (i = 0; i < 10; i = i + 1) begin
... // 重复执行10 次
end

【格式】
while (< 表达式>) < 语句序列>
【例】
while (i < 10) begin
... // i 小于10 时重复执行
end

always过程块

复制代码
always @(< 事件表达式>) < 语句序列>
always #< 常数表达式> < 语句序列>

当指定 always 语句中的事件表达式时,所指定的事件触发时执行其中的语句序列。

事件可以是特定信号的变化、信号的上升沿

(posedge)、信号的下降沿(negedge)等。always 语句中如果使用常数,则会在每经过该常数时间便执行一次 always 中的语句序列。
这个功能主要是在仿真时使用。always 过程中可以使用寄存器变量赋值、if、case、for、while 等语句。

使用 always 语句描述组合电路

事件表达式中写入通配符 *。这样一来,任何输入信号变化

时都会执行过程块中的代码。

复制代码
【格式】
always @(*) begin
... // 组合电路的描述
end

【例】
module adder (
input wire [31:0] in_0,
input wire [31:0] in_1,
output reg [31:0] out
);
always @(*) begin
out = in_0 + in_1;
end
endmodule

使用 always 描述时序电路

复制代码
【格式】
always @(< 边沿> < 信号> [or ...]) begin
... // 记述时序电路
end
相关推荐
南瓜胖胖1 分钟前
R语言科研编程-标准偏差柱状图
开发语言·r语言
岂是尔等觊觎3 分钟前
PCB设计教程【入门篇】——电路分析基础-元件数据手册
经验分享·笔记·嵌入式硬件·学习·pcb工艺
#眼镜&7 分钟前
STC89C52RC/LE52RC
嵌入式硬件
编码小笨猪13 分钟前
[ Qt ] | 常见控件(一): enable、geometry
开发语言·qt
jerry60917 分钟前
蒙特卡洛树搜索 (MCTS)
人工智能·笔记·深度学习·学习·算法·机器学习
Eiceblue28 分钟前
通过Python 在Excel工作表中轻松插入行、列
开发语言·vscode·python·pycharm·excel
韩明君30 分钟前
前端学习笔记——Promis.All
前端·笔记·学习
无影无踪的青蛙34 分钟前
[C++]洛谷B3626 跳跃机器人(题干 + 详细讲解, BFS练习题)
开发语言·c++·算法·bfs·广度优先
江畔柳前堤42 分钟前
PyQt学习系列11-综合项目:多语言文件管理器
开发语言·网络·python·学习·django·pyqt
君莫愁。43 分钟前
【Unity】使用InputSystem实现UI控件与键盘输入绑定以及如何快速制作虚拟摇杆
开发语言·unity·c#·游戏引擎·input system·输入系统