当前位置:首页 > 新闻资讯 > FPGA之家动态 >

【从0开始学FPGA-04】Verilog 模块的结构

时间:2024-08-02      来源:网络搜集 关于我们 0

  一个多年老硬件攻城狮,开始从0学FPGA......

小编通过Vivado学习了几个例程,基本把软件环境搞通了,最大的体会是回到Verlilo的学习,只有把Verilog这门语言学会了,才能在实际的开发中得心应手。需求是输入,算法是核心、语言和开发环境是工具,真所谓“巧妇难为无米之炊”。模块是Verilog的基本单元,Verilog的模块对应的是一个电路模块,一个电路模块有输入和输出以及完成的功能,因此,Verilog中的模块包含两部分,一部分是描述接口,包括输入和输出;另一部分是描述的模块的功能,定义由输入得到什么样的输出。

01

模块端口的定义格式

模块端口的定义格式

module 模块名 (端口1,端口2,端口3,端口4,........);

模块的端口表示的是模块的输入和输出口名,也就是说,它与别的模块联系端口的标识。在引用模块时候其端口可以使用以下两种方式连接:1.在引用时,严格按照模块定义的端口顺序来连接,不用标明原模块定义时规定的端口名;2.在引用时用“.”符号,标明原模块是定义时规定的端口名。

02

模块内容

模块内容模块的内容:模块的内容包括I/O说明、内部信号声明功能定义I/O说明格式:输人口:

    input[信号位宽-1:0] 端口名1;

    input[信号位宽-1:0] 端口名2;

input[信号位宽-1:0] 端口名i;       //(共有i个输口)

输出口:

        output[信号位宽-1;0] 端口名1;

        output[信号位宽-1:0] 端口名2;

       output[信号位宽-1:0] 端口名j;    //(共有j个输出口)

    输人/输出口:

        inout[信号位宽-1:0] 端口名1;

        inout[信号位宽-1;0] 端口名2;

        inout[信号位宽-1:0] 端口名k;   //(共有k个双向总线端口)

I/0说明也可以写在端口声明语句里。其格式如下:module module_name(input port1,input port2……output port1,output port2……);内部信号声明:

在模块内用到的和与端口有关的 wirereg 类型变量的声明。

wire(或net)用来表示已assign关键字指定的组合逻辑信号,模块的输入输出端口类型默认为wire型,wire型相当于物理连线,默认初始值是高阻态。 reg型表示的是寄存器类型,用于always模块内被赋值的信号,且必须定义为reg型,代表的是触发器,常用于时序逻辑电路,reg相当于存储单元。模块描述时在模块内部对模块的端口进行描述,是从内部角度出发的,因此将input端口看作是外界引申进来的的一条线,只能为wire变量,同理inout有输入和输出,也应该看作wire变量,而output端口被看模块的输出,即可以直接输出(如组合逻辑),也可以寄存后输出(如时序逻辑)。因此output的端口可设置为wire或者reg型变量。模块被调用时是上级模块中对下级模块的例化,描述了其采用了何种信号与芯片(即底层模块)连接,进行驱动或者得到输出。此时是从外部角度出发,上级模块对下级模块的输入可以是组合和时序输入,因此iput可以定义为wire或者reg型变量,而output是上级模块对下级模块的被动接收,是下级模块的一根输出线,因此output只能定义为wire型变量,同理,inout端口也只能是wire型变量。模块的功能定义: 模块中最重要的部分是逻辑功能定义部分。有以下3种方法可在模块中产生逻辑。(1)用“assign”声明语句 如:assign a=b&c; 

                这种方法的句法很简单,只须写一个“assign”,后面再加一个方程式即可。例中的方程式描述了一个有两个输人的与门。

(2)用实例元件如:and #2 u1( q,a,b);        采用实例元件的方法像在电路图输入方式下调入库元件一样,键人元件的名字和相连的引脚即可。这表示在设计中用到一个跟与门(and)一样的名为 u1的与门,其输入端为a、b,输出为 q,也就是输出在前,输输入在后。输出延迟为2个单位时间。要求每个实例元件的名字必须是唯一的,以避免与其他调用与门(and)的实例混淆。(3)用“always”块如:always @(posedge clk or posedge clr);beginif(clr)    q<=0;else if(en)   q<=d;end     采用assign”语句是描述组合逻辑最常用的方法之一。而always”块既可用于描述组合逻辑,也可描述时序逻辑

03

模块示例分析

如下定义了一个求out=a&b&c&d的模块:

////////////////////////////////////////////////

module

 and_out(a,b,c,d,out);

    input wire

 a;   //声明wire型输入端口a

    input wire b;   //声明wire型输入端口b

    input wire c;   //声明wire型输入端口c

    input wire d;  //声明wire型输入端口d

    output wire out;  //声明wire型输出端口out   assign out=a&b&c&

d;  //使用赋值语句组成实现逻辑功能

endmodule

////////////////////////////////////////////////

对应的电路模块如下图:

----------------------------------------------------------

参考书籍:【《Verilog数字系统设计教程》夏宇闻 】

----------------------------------------------------------高清HDMI 2.0线】推荐淘宝店铺“电子eStore

"所卖的这款,多种线材规格可供选择。

     【淘宝】https://m.tb.cn/h.gZ7bXRf?tk=rDGhWr2rQ96 MF1643 「绿联hdmi线2.0清线4k视频传输线黄黑头黑色工程HDMI线」点击链接直接打开 或者 淘宝搜索直接打开

----------------------------------------------------------------

----------------------------------------------------------------

关注小编一起学FPGA......


注明:本内容来源网络,不用于商业使用,禁止转载,如有侵权,请来信到邮箱:429562386ⓐqq.com 或联系本站客服处理,感谢配合!

用户登陆

    未注册用户登录后会自动为您创建账号

提交留言