网上翻译网站做译员,上海互联网网站建设公司,深圳网站开发公司哪家好,wordpress 显示全部文章Verilog基础语法 1. 常用关键字/保留字模块 module endmodule输入输出信号 input output inout变量 wire reg参数 parameter localparam常数赋值alwaysassign 运算符归约运算符、按位运算符逻辑运算符关系运算符移位运算符位拼接运算符条件运算符优先级 分支控制语句if-elsecas… Verilog基础语法 1. 常用关键字/保留字模块 module endmodule输入输出信号 input output inout变量 wire reg参数 parameter localparam常数赋值alwaysassign 运算符归约运算符、按位运算符逻辑运算符关系运算符移位运算符位拼接运算符条件运算符优先级 分支控制语句if-elsecase 系统函数 1. 常用关键字/保留字
.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 (8d100) //实例化时参数可修改
)//always
always (posedge sys_clk or negedge sys_rst_n)if(sys_res_n 1b0)cnt 8d0;else if (cnt CNT_MAX)cnt CNT_MAX;else cnt cnt 8d1;//assign
assign po_flag (cnt CNT_MAX) ? 1b1 : 1b0;endmodule模块 module endmodule
用module表示模块的开始模块有开始就有结束。用endmodule表示模块的结束。模块开始后需要写入模块名模块名一般与.main文件一致
输入输出信号 input output inout
输入信号input输出信号output既可以做输入信号也可以做输出信号inout
变量 wire reg
输入信号需要不能直接变成输出数据需要经过变量之间的操作修改。
线网型变量 用wire申明可以看成实际的连接在物理实验中会看成一条真实的连线 寄存器型变量 用reg申明具有对某一数据保留的功能会被映射成为一个真实的物理寄存器
参数 parameter localparam
有两个关键字可以用来定义参数。
parameter 可以在顶层文件通过实例化对此功能模块中的参数进行修改localparam 只能在模块内部使用不能实例化。
常数
使用基数表示法格式 [换算为二进制后位宽的总长度][][数值进制符号][与数值进制符号对应的数值]eg. 8d171 //位宽为8bit十进制的171 [数值进制符号] [h]十六进制、[o]八进制、[b]二进制 8hab //8bit的十六进制数ab
8o253 //8bit的八进制数253
8b1010_1011 //8bit的二进制数1010_1011-增强可读性[换算为二进制后的位宽总长度]可有可无verilog会自动匹配合适的位宽。当总位宽大于实际位宽自动在左边补0总位宽小于实际位宽自动截断左边超出的位数。 d7与 8d7表示相同数值
8d7 换算为二进制为8b0000_0111前补5个0;
2d7 换算为二进制为2b11超过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
always (posedge sys_clk or negedge sys_rst_n)if(sys_res_n 1b0) //当复位信号有效时cnt 8d0; //cnt初值设置为0else if (cnt CNT_MAX) //如果计数到最大值cnt CNT_MAX; //cnt保持在最大值else cnt cnt 8d1;//否则每一个时钟周期cntassign
assign po_flag (cnt CNT_MAX) ? 1b1 : 1b0;
//如果满足括号内条件则将1b1赋值给po_flag反之将1b0赋值给po_flag运算符
归约运算符、按位运算符
以’为例
作为一元运算符 表示归约m表示将m中所有比特相与最终的结果为1bit。4b1111 1111 1b1
4b1101 1101 1b0作为二元运算符 表示按位与mn将m的每个比特与n的相应比特相与运算的时候需要保证m和n的比特数相等最后的结果和m(n)的比特数相同。4b1010 4b0101 4b0000
4b1101 4b1111 4b1101逻辑运算符
“逻辑与、”||“逻辑或、”“逻辑相等、”逻辑不等
关系运算符
、、、一般用于条件判断语句
移位运算符
左移将运算符左边的操作数左移指定的位数用0补充空闲位。 b a1 a左移1位结果赋值给b右移将运算符右边的操作数右移指定的位数用0补充空闲位。 b a2 a右移2位结果赋值给b注意因为会用0填充一个二进制数一直移位最终全部会变成0可以代替乘除法使用1看成*21 看成/2但需要注意位宽的扩展
位拼接运算符
格式{ ,}拼接不同的数据之间用, 隔开。bit eg.将8bit的a、3bit的b、5bit的c 按顺序拼接成一个16bit的d d { a, b, c} ;
条件运算符
? :是一个三元运算符格式:表达式1 ? 表达式2 : 表达式3执行过程if(表达式1) 表达式2作为条件表达式的值else 表达式3作为条件表达式的值。 eg. a 6, b 7, c ( a b ) ? a : b 最终得到c7
优先级
归约运算符 算术运算符 移位运算符 关系运算符 “” “!” 按位运算符 “” “||” 条件运算符 一元运算符 二元运算符 三元运算符
分支控制语句
if-else
与C相同
case
case分支语句有case、“casez”、casex三种
case (控制表达式)分支语句1 : 语句块1 ;……分支语句n : 语句块n ;default : 语句块 n1 ;
endcase注意与c语言不同的是最后要有endcase
系统函数
Verilog中预先定义的任务和函数大多数只能在仿真中使用方便进行验证 常用系统函数
$display //打印信息自动换行
$write //打印信息
$strobe //打印信息自动换行最后执行
$monitor //监测变量
$stop //暂停仿真
$finish //结束仿真
$time //时间函数
$random //随机函数
$readmemb //读文件函数时间参数 timescale 1ns/1ns //时间尺度预编译指令 时间单位/时间精度时间单位和时间精度由值1、10、100和单位s、ms、us、ns、ps和fs组成。时间单位定义仿真过程中所有与时间相关量的单位 仿真过程中使用#数字 表示延时相应时间单位的时间例 #10 表示延时10个单位的时间即10ns。时间精度决定时间相关量的精度及仿真显示的最小刻度 timescale 1ns/10ps 精度0.01,#10.11 表示延时’10110ps’错误写法timesace 100ps/1ns 单位时间不能比时间精度小