做网站域名后缀选择,福州建设工程质量监督网站,导航网址网站怎么做,视频号小店FPGA_verilog语法整理
verilog的逻辑值 verilog的常数表达
位宽中指定常数的宽度#xff08;表示成二进制数的位数#xff09;#xff0c;单引号加表示该常数为几进制的底数符号。 二进制底数符号为b#xff0c;八进制为 o#xff0c;十进制为d#xff0c;十六进制为 h…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
… // 符合ab 条件的语句
end else if (a b) begin
… // 符合ab 条件的语句
end else begin
… // 其他条件ab下的语句
endcase ( 表达式)表达式 : 语句序列表达式, 表达式, … : 语句序列
default : 语句序列
endcase
【例】
case (data[3:0])
4h0 : begin
… // data[3:0] 为4h0 时的语句
end
4h1, 4h2 : begin
… // data[3:0] 为4h1 或4h2 时的语句
end
default : begin
… // 默认语句
end
endcaseif 和 case 语句可以在 initial 或 always 语句声明的过 程块中使用
循环语句 for 与 while
【格式】
for ( 赋值语句; 表达式; 赋值语句) 语句序列
【例】
for (i 0; i 10; i i 1) begin
… // 重复执行10 次
end【格式】
while ( 表达式) 语句序列
【例】
while (i 10) begin
… // i 小于10 时重复执行
endalways过程块
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