我是靠谱客的博主 激动蓝天,这篇文章主要介绍Verilog HDL 学习笔记 ——— (1)Verilog HDL基本框架,现在分享给大家,希望可以做个参考。

Verilog HDL基本框架


1. 基本概述

常用模板如下

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
model 模块名 (端口1, 端口2, 端口3, ..., 端口n); // 声明部分 端口类型说明 (input, output, inout); 参数定义; 数据类型定义 (wire, reg等); // 逻辑功能描述部分 示例引用低层次模块和基本门元件; 连续赋值语句; 过程结构模块; 行为描述语句; 任务和函数; endmodule

以下是对各个部分的详细解释:

定义与名称相关解释
模块名模块的唯一标识符
端口类型说明类型:输入(input)、输出(output)、双向口(inout)
***** 所有被定义的端口一定要有类型说明 *****
数据类型定义常见的有:reg(寄存器类型),wire(连线类型)
编程风格实例化低层次模块:结构风格描述
连续赋值语句(assign):数据流描述方式
过程块语句结构(initial 和 always 两种):功能(行为)风格描述方式

2. 简单的例子(代码文件均为example1.v)

以下面的式子为例

Y = S ‾ D 0 + S ‾ D 1 Y = overline{S}D_0 + overline{S}D_1 Y=SD0+SD1

2.1 . 结构风格描述法

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
module example1 (D0, D1, S, Y); input D0, D1, S; output Y; wire Snot, A, B; not U1 (Snot, S); and U2 (A, Snot, D0); and U3 (B, S, D1); or U4 (Y, A, B); endmodule

2.2. 数据流描述方式

复制代码
1
2
3
4
5
6
7
8
9
10
11
module example1 (D0, D1, S, Y); input D0, D1, S; output Y; wire Y; assign Y = S? D1 : D0; // C语言写习惯了 // 或者写成 assign Y = (~S & D0) | (S & D1) endmodule

2.3. 功能风格描述方式

模块中一定要使用变量类型 —— reg

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
module example1 (D0, D1, S, Y); input D0, D1, S; output Y; reg Y; always @ (D0, D1, S) case (S) // 1'b 表示长度为1的二进制串,0和1表示两种情况 1'b 0: Y = D0; 1'b 1: Y = D1; endcase endmodule

3. 代码仿真

对于写好的代码需要Verilog HDL编译器。测试的具体方法如下:

  1. 对输入端口添加激励信号(尽可能包含所有种类的输入)
  2. 用过相应的代码运行后,将得到的结果与实际的结果进行比对,看是否准确。

3.1. 以文件example1.v文件为例(运行代码为test1.v)

仿真的输出一定是wire,输入看实际情况了

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// 单位时间1ns,精准度1ns time 1ns / 1ns module test1 (PS, PD0, PD1); reg PS, PD0, PD1; wire PY; example1 t_Mux(PD0, PD1, PS, PY); initial begin PS = 0; PD0 = 0; PD1 = 0; #1 PS = 0; PD0 = 0; PD1 = 1; #1 PS = 0; PD0 = 1; PD1 = 0; #1 PS = 0; PD0 = 1; PD1 = 1; #1 PS = 1; PD0 = 0; PD1 = 0; #1 PS = 1; PD0 = 0; PD1 = 1; #1 PS = 1; PD0 = 1; PD1 = 0; #1 PS = 1; PD0 = 1; PD1 = 1; #1 $stop; end initial begin // monitor和C语言的printf相似,$ time表示单位时间上的系统任务,%b 表示二进制输出,t 表示tap输出 $monitor ($ time, "tS=%btD1=%btD0=%dtY=%d", PS, PD1, PD0, PY); // dumpfile和dumpvars用于保存仿真数据文件 $dumpfile ("text1.vcd"); $dumpvars; end endmodule

4. 实际操作

(自己动手玩吧)

最后

以上就是激动蓝天最近收集整理的关于Verilog HDL 学习笔记 ——— (1)Verilog HDL基本框架的全部内容,更多相关Verilog内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(85)

评论列表共有 0 条评论

立即
投稿
返回
顶部