Verilog hdl

首先是学习这门语言的软硬件基础问题,现在回忆当初学习的时候,其实很多有关软硬件我在现在看来很常见的知识,我是真不知道。而如今在我看来,学习这们语言之前,对于计算机专业的学生,数电和计算机组成原理的学习是很有必要,真的很重要,在学习这两门课程后,才能对计算机有一个总体的架构。同样,还需要学习一些单片机方面的知识。\n\n一、模块介绍\n        模块(module)是 Verilog 的基本描述单位,是用于描述某个设计的功能或结构及与其他模块 通信的外部端口。\n\n        模块在概念上可等同一个器件,就如调用通用器件(与门、三态门等)或通用宏单元(计数器、 ALU、CPU)等。因此,一个模块可在另一个模块中调用,一个电路设计可由多个模块组合而成。一 个模块的设计只是一个系统设计中的某个层次设计,模块设计可采用多种建模方式。 Verilog 的基本设计单元是“模块”。采用模块化的设计使系统看起来更有条理也便于仿真和测试, 因此整个项目的设计思想就是模块套模块,自顶向下依次展开。在一个工程的设计里,每个模块实现 特定的功能,模块间可进行层次的嵌套。对大型的数字电路进行设计时,可以将其分割成大小不一的 小模块,每个小模块实现特定的功能,最后通过由顶层模块调用子模块的方式来实现整体功能,这就 是 Top-Down 的设计思想。模块是 Verilog 的基本描述单位, 用于描述每个设计的功能和结构,以及其他模块通信的外部接口。\n\n        模块有五个主要部分:端口定义、参数定义(可选)、 I/O 说明、内部信号声明、功能定义。 模块总是以关键词 module 开始,以关键词 endmodule 结尾。\n\n//端口定义\nmodule module_name\n( clk , //端口 1,时钟 \n rst_n , //端口 2,复位 \n dout //其他信号,如 dout \n);\n \n//参数定义(可选)\nparameter DATA_W = 8; \n \n//I/O说明\ninput clk ; //输入信号定义 \ninput rst_n ; //输入信号定义 \noutput[DATA_W-1:0] dout; //输出信号定义 \n \n//信号说明\nreg [DATA_W-1:0] dout; //信号类型 (reg、wire)定义 \nreg signal1;//信号类型 (reg、wire)定义 \n \n//功能定义\n//……………以下为描述功能部分…………// \n//组合逻辑写法\nalways@(*)begin \n end \n//时序逻辑写法 \nalways@(posedge clk or negedge rst_n)begin \n if(rst_n==1'b0)begin \n end \n else begin \n end \n end \nendmodule\n        下面详细分析一下这段代码:\n\n二、模块名和端口定义\n        第 2 至 6 行声明了模块的名字和输入输出口。其格式如下:\n\n        module 模块名(端口 1,端口 2,端口 3,……);\n\n        其中模块是以 module 开始,以 endmodule 结束。模块名是模块唯一的标识符,一般建议模块名 尽量用能够描述其功能的名字来命名,并且模块名和文件名相同。\n\n        模块的端口表示的是模块的输入和输出口名,也是其与其他模块联系端口的标识。\n\n三、参数定义\n        第 9 行参数定义是将常量用符号代替以增加代码可读性和可修改性。这是一个可选择的语句, 用不到的情况下可以省略,参数定义一般格式如下:\n\n        parameter DATA_W = x;\n\n四、接口定义\n        第 12 至 14 行是 I/O(输入/输出)说明,模块的端口可以是输入端口、输出端口或双向端口。其说明格式如下。\n\n        输入端口:         input [信号位宽-1 : 0] 端口名 1;\n\n                                  input [信号位宽-1 : 0] 端口名 2;\n\n                                   ……;\n\n        输出端口:          output [信号位宽-1 : 0] 端口名 1;\n\n                                   output [信号位宽-1 : 0] 端口名 2;\n\n                                    ……;\n\n        双向端口:           inout [信号位宽-1 : 0] 端口名 1;\n\n                                    inout [信号位宽-1 : 0] 端口名 2;\n\n                                     ……;\n\n五、信号类型\n        第 17 至 18 行定义了信号的类型。这些信号是在模块内使用到的信号,并且与端口有关的 wire 和 reg 类型变量。其声明方式如下:\n\n        reg [width-1 : 0] R 变量 1, R 变量 2 ……;\n\n        wire [width-1 : 0] W 变量 1,W 变量 2……;\n\n        如果没有定义信号类型,默认是 wire 型,并且信号位宽为 1。\n\n六、功能描述\n        第 23 至 32 行是功能描述部分。模块中最重要的部分是逻辑功能定义部分,有三种方法可在模块中产生逻辑。\n\n        1. 用“assign”声明语句,如描述一个两输入与门:assign a = b & c。下次仔细写一下。\n\n         2. 用“always”块。即前面介绍的时序逻辑和组合逻辑。\n\n        3. 模块例化。详细功能见下文“模块例化”。\n\n七、模块例化\n         对数字系统的设计一般采用的是自顶向下的设计方式,可将系统划分成几个功能模块,每个功能 模块再划分成下一层的子模块。每个模块的设计对应一个 module ,每个 module 设计成一个 Verilo g HDL 程序文件。因此,对一个系统的顶层模块采用结构化设计,即顶层模块分别调用了各个功能 模块。\n\n        一个模块能够在另外一个模块中被引用,这样就建立了描述的层次。模块实例化语句形式如下:\n\nmodule_nameinstance_name(port_associations);\n        信号端口可以通过位置或名称关联,但是关联方式不能够混合使用。端口关联形式如下:        \n\n        port_expr / /通过位置。 \n        .PortName (port_expr) / /通过名称。\n\nmodule and (C, A, B);\ninput A,B; \noutput C; \n//省略 \nendmodule \n//在下面的“and_2”块中对上一模块“and”进行例化,可以有两种方式: \nmodule and_2(xxxxx) \n... \n//方式一:实例化时采用位置关联,T3 对应输出端口 C,A 对应 A,B 对应 B。 \nand A1 (T3, A, B ); \n//方式二:实例化时采用名字关联,.C 是 and 器件的端口,其与信号 T3 相连 \nand A2(\n.C(T3),\n.A(A), \n.B(B)); \n…\nendmodule;\n        建议:在例化的端口映射中请采用名字关联,这样,当被调用的模块管脚改变时不易出错。 在实例化中,可能有些管脚没用到,可在映射中采用空白处理,如:\n\nDFF d1 (\n .Q(QS), \n .Qbar (), // 该管脚悬空 \n .Data (D ), \n .Preset (), // 该管脚悬空 \n .Clock (CK)); //名称对应方式。\n         输入管脚悬空端口的输入为高阻 Z,由于输出管脚是被悬空的,该输出管脚废弃不用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值