verilog HDL硬件描述语言
建模方式:行为描述——过程化结构建模;数据流描述——连续赋值语句方式建模;结构花方式——采用门和模块实例语句描述建模。三种可以混合使用。
数据类型:线网型wire——表示构件间的物理连线;寄存器型reg——表示抽象的数据存储元件。
mudule AOI(a,b,c,d,f);//模块名AOI(端口列表a,b,c,d,f)
input a,b,c,d;//输入端口a,b,c,d
output f;//输入端口f
wire a,b,c,d;//定义信号类型
assign f=~(a&b)|(c&d);//逻辑功能描述:数据流描述
endmodule
module<模块名>(端口列表);
端口说明(input,output,inout)
参数定义
连续赋值语句assign
过程块(initial和always)
行为描述语句
底层模块实例化
任务和函数
延时说明块
endmodule
端口就是硬件的管角pin,端口没有定义类型,则默认为wire。
常量 程序运行时不能改变的量成为常量
1.整数 <size>'<base><value> size:大小,没有定义则默认32位;base:基数,可为2(b),8(o),10(d),16(h)进制。value:有效数值。例子:8‘b10101101//位宽8的二进制数
2实数:8.5 14e-4=0.0014 1.6e3=1600
变量 程序运行时可以改变的量成为变量
1.wire 常用来表示assig关键字指定的组合逻辑信号。
wire a;//定义了一位的wire型的数据
wire[7:0] b;//定义了8位的wire数据b
wire[3:0]c,d;//定义了两个4位的数据
2.reg型 常用来便是always模块指定信号,常代表触发器。通常,在设计中要由always块通过使用行为描述语句来表达逻辑关系。在always块内被赋值的每一个信号都必须定义为reg型。reg型只表示被定义的信号将用在always快内。
3.标识符 字母和下划线开头,后面可以是字母、数字、下划线和$。
赋值语句
1.连续赋值语句
assign 1.只要在右端的表达式的操作数上有事件(事件为值得变化)发生时,表达式即被计算;
2.如果计算的结果值有变化,新结果就被赋给左边的线网。
2.过程赋值语句
- 仅在intial语句和always语句内赋值。
- 只能对reg型的变量赋值。右端可以是任何表达式。
- 阻塞赋值和非阻塞赋值两种。
Done = #5 1'b1;//通过延时,右端的值赋给左边被延迟。
#5 Done=1'b1;//语句执行完,被延迟,之后在向下执行。
阻塞赋值是顺序执行,而非阻塞是并行,即同时执行。
always语句 always +时序控制+执行表达式
always@(敏感变量or posedge 信号 or negedge 信号)
always #10 clk=~clk;
一个模块中可以有多个always语句块,他们彼此并行执行。
块语句
begin和end之间是顺序执行。fork和join之间是并行块语句。