Verilog学习:结构要求与循环语句

目录

基本要求:

模块

变量

线网型变量wire

寄存器类型reg

循环语句

forever语句

repeat语句

while语句

for语句


基本要求:

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

 

你可能感兴趣的:(FPGA编程,Verilog)