目录
基本要求:
1)Verilog HDL程序是由模块组成。模块嵌套在module和endmodule声明语句中。模块可以进行层次嵌套
2)每个Verilog HDL源文件中只有一个顶层模块,其他是子模块。每个模块一个文件
3)每个模块需要进行端口定义,并说明输入输出端口,然后对端口进行逻辑描述
4)模块中的时序逻辑部分在always块的内部,在always块内部只能对寄存器变量进行赋值
5)模块中对端口或其他wire型变量进行赋值,必须在always块的外部使用assign语句进行,通常是将寄存器的值送出
6)程序格式自由,一行可以写几个语句,也可以一个语句分多行写
7)除了endmodule,begin——end,for-join语句之外,每个语句或者数据定义的最后必须有分号
8)可用/*....*/ 或者//...对程序进行注释,
模块
模块通常由端口定义、端口说明、信号类型、功能说明四个主要部分组成。
module ss(clk,a,b,c);//端口定义
input clk,a;//端口说明
ouput b;
ouput c;
reg c = 0;//信号类型说明
reg b;
//行为描述
assign c = clk; //阻塞赋值,按照语句顺序执行
always@(posedge clk)
begin
b <= a;//非阻塞赋值,所有语句同时执行
end
endmodule
变量
线网型变量wire
除了特别声明,所有的输入输出默认是wire。wire主要是信号之间起到连接作用,用来构成信号的传递或者形成组合逻辑,需要在时序控制always块之外进行赋值,使用assign语句。
wire不保存状态,其值随时可以改变,不受时钟信号的影响。
寄存器类型reg
寄存器是数据存储单元的抽象,通过对寄存器的赋值语句可以改变寄存器存储的值。reg型数据通常用来表示时序控制always块内的指定信号,代表触发器,在时钟的有效边沿改变值。通常在设计中,always块通过使用行为描述语句来表达逻辑关系。在always块内部被赋值的吗,每一个信号都必须定义为寄存器的或者功能等同于寄存器型的变量
设计文件中。可以设置输入为wire,输出为reg或wire。。。只有输出通过assign语句赋值的时候才使用wire,一般可以使用reg
仿真文件相反,输入使用reg,输出使用wire.
循环语句
Verilog中存在四种循环语句,在C语言中比较常用,但是在Verilog一般用于仿真激励,难以综合,要想系统可以综合,循环次数需要固定
forever语句
连续执行的语句
//方法一
forever begin
#10 clk = 1;
#10 clk = 0;
end
//方法二
always #10 clk = ~clk;
repeat语句
连续执行n次的语句
repeat(表达式)//表达式是循环次数,可以是整数,变量或者数值表达式
begin
a = b + 3'd1;
end
while语句
执行语句,直到某个条件不满足
while(表达式)begin
a = b + 3'd1;
end
for语句
使用类似c语言,三个部分,
for(i = 1; i < 6 ;i ++) begin
a = a + 4'd1;
end