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

概述

Verilog HDL基本框架


1. 基本概述

常用模板如下

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 . 结构风格描述法

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. 数据流描述方式

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

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,输入看实际情况了

// 单位时间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 HDL 学习笔记 ——— (1)Verilog HDL基本框架所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部