.main文件速览
module example //模块开始 模块名
{
input wire sys_clk , //输入信号
input wire sys_rst_n , //输入信号
inout wire sda , //输入输出信号
output wire po_flag //输出信号
};
//线网型变量
wire [0:0] flag ;
//寄存器型变量
reg [7:0] cnt;
//参数
parameter CNT_MAX = 100;
localparam CNT_MAX = 100;
//模块实例化
example
#(
.CNT_MAX (8'd100) //实例化时参数可修改
)
//always
always (posedge sys_clk or negedge sys_rst_n)
if(sys_res_n == 1'b0)
cnt <= 8'd0;
else if (cnt == CNT_MAX)
cnt <= CNT_MAX;
else cnt <= cnt + 8'd1;
//assign
assign po_flag = (cnt == CNT_MAX) ? 1'b1 : 1'b0;
endmodule
module
表示模块的开始,模块有开始就有结束。endmodule
表示模块的结束。input
output
inout
输入信号需要不能直接变成输出数据,需要经过变量之间的操作修改。
wire
申明reg
申明有两个关键字可以用来定义参数。
parameter
localparam
eg. 8'd171 //位宽为8bit,十进制的171
8'hab //8bit的十六进制数ab
8'o253 //8bit的八进制数253
8'b1010_1011 //8bit的二进制数1010_1011,'-'增强可读性
'd7与 8'd7:表示相同数值
8'd7 换算为二进制为8'b0000_0111,前补5个0;
2'd7 换算为二进制为2'b11,超过2位宽的部分被截断
如果直接写参数,例如100,表示位宽32bit的十进制数100
=
//串行a = 1;
b = 2;
c = 3;
begin
a = b;
c = a;
end
因为是阻塞串行执行,最终得到的结果为
a = 2;
b = 2;
c = 2;
<=
//并行a = 1;
b = 2;
c = 3;
begin
a <= b;
c <= a;
end
因为是并行执行,a、c被赋值是同时执行的,最终得到的结果为
a = 2;
b = 2;
c = 1;
always (posedge sys_clk or negedge sys_rst_n)
if(sys_res_n == 1'b0) //当复位信号有效时
cnt <= 8'd0; //cnt初值设置为0
else if (cnt == CNT_MAX) //如果计数到最大值
cnt <= CNT_MAX; //cnt保持在最大值
else cnt <= cnt + 8'd1;//否则每一个时钟周期cnt++
assign po_flag = (cnt == CNT_MAX) ? 1'b1 : 1'b0;
//如果满足括号内条件,则将1'b1赋值给po_flag,反之将1'b0赋值给po_flag;
以’'&"为例:
&m
表示将m中所有比特相与,最终的结果为1bit。&4'b1111 = 1&1&1&1 = 1'b1
&4'b1101 = 1&1&0&1 = 1'b0
m&n
将m的每个比特与n的相应比特相与,运算的时候需要保证m和n的比特数相等,最后的结果和m(n)的比特数相同。4'b1010 & 4'b0101 = 4'b0000
4'b1101 & 4'b1111 = 4'b1101
"&&“逻辑与、”||“逻辑或、”==“逻辑相等、”!="逻辑不等
<、>、<=、>=,一般用于条件判断语句
b <= a<<1
a左移1位,结果赋值给bb <= a>>2
a右移2位,结果赋值给b格式:{ ,}
拼接不同的数据之间用","
隔开。bit
eg.将8bit的a、3bit的b、5bit的c 按顺序拼接成一个16bit的d d = { a, b, c} ;
? :
是一个三元运算符,格式:表达式1 ? 表达式2 : 表达式3
a = 6, b = 7, c = ( a > b ) ? a : b
最终得到c=7归约运算符 > 算术运算符 > 移位运算符 > 关系运算符 > “==” “!=” > 按位运算符 > “&&” “||” > 条件运算符
一元运算符 > 二元运算符 > 三元运算符
与C++相同
case分支语句有"case"、“casez”、"casex"三种
case (<控制表达式>)
<分支语句1> : 语句块1 ;
……
<分支语句n> : 语句块n ;
default : 语句块 n+1 ;
endcase
注意与c语言不同的是,最后要有endcase
Verilog中预先定义的任务和函数大多数只能在仿真中使用,方便进行验证
常用系统函数
$display //打印信息,自动换行
$write //打印信息
$strobe //打印信息,自动换行,最后执行
$monitor //监测变量
$stop //暂停仿真
$finish //结束仿真
$time //时间函数
$random //随机函数
$readmemb //读文件函数
timescale 1ns/1ns //时间尺度预编译指令 时间单位/时间精度
timescale 1ns/10ps
精度0.01
,#10.11
表示延时’10110ps’timesace 100ps/1ns
单位时间不能比时间精度小