1.#:是延迟的意思,#号后面数字是延迟的数量,延迟的单位由'timescale控制,比如有:'timescale 1ns/1ps 意思就是单位为1ns,精度是1ps。那么,#10.5就是延迟10.5ns的意思。注意在同步时序数字逻辑电路的verilog代码中,不能加入“#”进行延迟,这不是代码编写阶段能决定的。
2.`include:文件包含处理。所谓“文件包含”处理是一个源文件可以将另外一个源文件的全部能容包含进来,即将另外的文件包含到本文件之中。Verilog HDL语言提供了`include命令用来实现“文件包含”的操作。例如:include “file2.v”.就是将file2.v的全部内容复制插入到该命令出现的地方。
关于文件包含的注意事项(https://www.cnblogs.com/icelyb24/archive/2011/09/29/2195779.html):
a:一个`include命令只能指定一个被包含的文件,如果要包含n个文件,要用n个`include命令。注意下面的写法是非法的`include"aaa.v""bbb.v";
b:'include 命令可以出现在Verilog HDL源程序的任何地方,被包含文件名可以是相对路径名,也可以是绝对路径名。例如'include "parts/count.v"
c:可以将多个`include 命令写在一行,在'include 命令行,只可以出空格喝注释行。例如下面的写法是合法的。`include "fileB" `include "fileC" //include fileB and fileC
d:如果1文件包含文件2,而文件2要用到文件3的内容,则可以在文件1用两个`include 命令分别包含文件2和文件3,而且文件3应出现在文件2之前。
e:在一个被包含文件中又可以包含另一个被包含文件。文件包含是可以嵌套的。
3.`define,parameter,localparam:
a:'define :作用是常用于定义常量可以跨模块,跨文件;所以作用范围是整个工程。【可以跨模块的定义,写在模块名称上面,在整个设计工程都有效。一旦`define指令被编译,其在整个编译过程中都有效。例如,通过另一个文件中的`define指令,定义的常量可以被其他文件调用,直到遇到`undef】
b:parameter:常用于模块间参数传递,也就是在module内有效的定义;【本module内有效的定义,可用于参数传递;如果在模块内部定义时无法进行参数传递,若在模块名后照下面这样写则可以进行传递】
//定义
module video_in
#(
parameter MEM_DATA_BITS = 64,
parameter INTERLACE =1)
(
input clk,
input rst_n,
output burst_finsh
);
//使用-》调用此模块的时候可以向端口信号传递一样进行参数传递
video_in
#( .MEM_DATA_BITS(64),
.INTERLACE(1)
)
u_video_in(
.clk(clk_50m),
.rst_n(rst_n),
.burst_finsh(burst_finsh)
);
c:localparam:常用于状态机的参数定义;本module内有效的定义,不可用于参数传递;localparam cannot be used within the module port paramter list.【本module内有效的定义,不可用于参数传递;一般情况下,状态机的参数都是用localparam的】
localparam BURST_LEN =10'd64; //一次写操作数据长度
localparam BURST_IDLE =3'd0; //状态机状态:空闲
localparam BURST_ONE_LINE_START =3'd1; //状态机状态:视频数据一行写开始
localparam BURSTING =3'd2; //状态机状态:正在处理一次ddr2写操作
localparam BURST_END =3'd3; //状态机状态:一次ddr2写操作完成
localparam BURST_ONE_LINE_END =3'd4; //状态机状态:视频数据一行写完成
reg[2:0] burst_state =3'd0; //状态机状态:当前状态
reg[2:0] burst_state_next =3'd0; //状态机状态:下一个状态