目录
Vivado 下载安装使用教程
这个网络上有很多申请license的方法和安装教程
如果嫌麻烦可以给我留言,给你发2018版的压缩包
VerilogHDL
什么是VerilogHDL
是一种用于数字逻辑电路设计的硬件描述语言
使用verilogHDL可以像设计软件一样设计硬件系统。(HDL:hardware description language 硬件描述语言)
verilog模块的定义
编写verilog代码
词法(可用单词)
-
常用关键字:and always assign case else end if initial inout input integer for module or output parameter posedge
-
标识符(类似c语言)
-
注释(类似c++)://单行注释
/*多
行
注释
*/ -
数字的写法:
- 书写格式: <位数>’ <进制>数字
- 进制:
字母 意义 b 二进制 o 八进制 d 十进制 h 十六进制 - 负数:在位数前加 “-”
- 举例:3‘b101 3位 二进制 数值:5 储存:101
- 特殊数字x z:x表示不定值,z表示高阻值
-
常量、变量
- 常量
- 定义:在代码运行过程中,值不能改变的量,成为常量。
- 数字(包括整数,x和z值,负数) 、 parame常量(或称为符号常量)
定义格式: parameter 变量名1 = 数字,变量名2 =数字, … ;
例子:parameter UP = 2’d0 ;
- 变量
- wire型变量
格式:wire 变量名1,变量名2,…,变量名n ;
wire[n-1:0] 变量名1,变量名2,… , 变量名m;(n是指位宽,数据宽度,共声明了m个变量,每个变量位宽为n) - reg型变量(具有记忆功能,always块里给变量赋值,变量必须是reg型)
定义:在过程块中被赋值的信号,往往代表触发器,也可能是组合逻辑信号
格式: reg 数据名1 ,数据名2,… ,数据名n;
reg[n-1:0] 数据名1,数据名2, … ,数据名m; - memory型变量——reg数组
定义:由若干个相同宽度的reg型变量组成的数组。
可描述RAM、ROM和reg堆
格式:reg[n-1:0] 储存器名[m-1:0];
例子:
reg[7:0] RAM[63:0]; //声明储存器RAM
RAM[10]= 8’d34; //访问第10个储存单元
- 其他变量:large型…
- wire型变量
- 常量
-
运算符(八种)
- 算术运算符(+ - * / %)
- 逻辑运算符(&& || !)
- 位运算符(& | ~ ^ ^~ )
- 关系运算符( < > >= <=)
- 赋值运算符(<= =)
- 移位运算符(<< >>)
- 条件运算符(?:)
- 位拼接运算符({})
reg[0:7] a_8, b_8;
reg[0:15] a_1,b_16;
always…begin
a_16 = { a_8,b_8};
end - 优先级
-
表达式
语法(单词如何组织成有意义的语句)
基本结构
// verilog模块的基本结构
module <模块名>(口1,口2,...);
<I/O端口说明>
....
<内部信号说明> (变量声明)
....
<assign语句>
<实例元件语句>
<结构说明语句块>
endmodule
begin
<语句>
end
相当于C语言中的大括号
各个语句(注意末尾加 ; )
- assign语句:无论右边表达式操作数何时发生变化,右边表达式都会重新计算,并且给左边变量赋值。
- 格式:assign <变量> = <表达式> ;
- 一般用于赋值wire型变量
- 因为一直执行,也被称为连续赋值语句
- 实例元件或子模块语句
- 格式: 模块名 实例名(口1,口2,……)
- 用法:如已完成一个2选1数据选择器,即可在此器件中使用该语句,使用2选1 构成4选1
module mux4(d0,d1,d2,d3,s,y); // I/O端口说明 input [3:0] d0,d1,d2,d3; input [1:0] s; output [3:0] y; //内部信号说明(变量声明 wire [3:0] low,high; //实例元件语句 mux2 lowmux(d0,d1,s[0],low); mux2 highmux(d2,d3,s[0],high); mux2 finalmux(low,high,s[1],y); endmodule
- 结构说明语句
-
always块(有触发条件)
always @ (敏感信号列表)
<语句>
- 例子:(电平触发) always @ (a or b) //每当a或b的值变化时执行一遍块内语句 begin <语句> end (信号沿触发,只能一位) always @ (posedge clk) //每当时钟上升沿到来时执行一遍
-
initial 块 (没触发条件,只在仿真零时刻执行一次)
initial
<语句>- 一般用于测试激励文件
-
- 赋值语句(能在alway和initial块中使用)
- 不建议将一个reg变量分开赋值
- 与assign的区别:
- assign是连续赋值,等号左右恒等,只能写在always外,左边是wire变量,与always块并发执行。
- 赋值语句是在块内赋值,触发时,将等号右边的值赋给左边。写在alway块或者initial块中,左边是reg变量。
- 阻塞赋值:= 描述组合逻辑电路
- 非阻塞赋值 <= 描述时序电路
- 例子:一位全加器
module add1(a,b,cin,sum,cout)
input a,b,cin;
output sum,cout;
wire q = a & b ; //内部变量
wire g = a ^ b ;
assign sum = cin ^ g ; //连续赋值
assign cout = cin & g | q ;
endmodule
- 条件语句(只能在always块中使用)
- 多分支选择语句(只能在always块中使用)
- case(表达式)
<分支一>:<语句>
<分支二>:<语句>
default:<语句>
endcase
- case(表达式)
- 块语句:begin <语句> end