⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合Verilog HDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。 🔥文章和代码已归档至【Github仓库:hardware-tutorial】,需要的朋友们自取。
$display是Verilog中最有用的任务之一,用于将指定信息(被引用的字符串、变量值或者表达式)以及结束符显示到标准输出设备上。其格式如下:
以 `(反撇号)开头的标识符就是编译指令,用来控制代码的整个过程。在Verilog代码编译的整个过程中,编译指令始终有效(编译过程可能跨越多个文件),直至遇到其他不同的编译指令为止。
`timescale time_unit/time_precision
`include " ../../header.v "
`define WORD_SIZE 32 //定义文本宏
`undef
`ifdef
`ifndef
`else
`elseif
`endif
`timescale命令用于在文件中指明时间单位和时间精度,通常在对文件进行仿真时体现。EDA工具可以支持在一个设计中可根据仿真需要在不同模块里面指定不同的时间单位。如模块A仿真的时间单位为皮秒(ps),模块B仿真的时间单位为纳秒(ns)。
使用`timescale命令语句格式如下:
时间单位是定义仿真时间和延迟时间的基准单位;时间精度是定义模块仿真时间的精确程度的,又被称为取整精度(在仿真前,被用来对延迟的时间值进行取整操作)。如果在同一个设计中,出现多个`timescale命令,工具会采用最小的时间精度值来决定仿真的时间单位。
`timescale 1ns / 1ps:此命令已定义模块中的时间单位为1ns,即仿真模块中所有的延迟时间单位都是1ns的整数倍;定义了模块的时间精度为1ps,即仿真模块中延迟单位可以指定到小数点后3位,小数超过3位会进行取小数点后3位的操作。
在设计中,为了提高程序可读性和简化程序描述,可以使用指定的标识符来代替一个长的字符串,或者使用一个简单的名字来代替没有含义的数字或者符号,此时需使用到宏定义命令`define。
使用`define命令格式如下:
//例1 :
`define LENGTH 16
reg [ `LENGTH–1 : 0 ] writedata;
//即定义reg[15:0] writedata;
//例2 :
`define expression a+b+c
assign data = `expression + d ; //经宏展开之后
//assign data = a+b+c+d;
//例3 :
`define A a+b
`define B c+`A
assign data = `B ; // 即data = c + a + b;
和C语言中声明头文件很类似。其一般形式为:
``include “文件名”`
例:文件para.v中有一个宏定义 `define A 2+3, 在test.v文件中可以直接调用。
`timescale 1ns/1ps
`include "para.v"
`module test(
input wire clk,
output reg [7:0] result
);
always@(posedge clk)
begin
result <= `A + 10;
end
endmodule
关于文件包含的几点说明:
例:para.v 中 : `define A 2+3 para2.v 中: `define B `A+2 test.v中:
`timescale 1ns/1ps
`include " para.v"
`include " para2.v"
module test(
input wire clk,
output reg [7:0] result
);
always@(posedge clk)
begin
result <= `B+ 10;
end
endmodule