华为Verilog入门教程

对于初学者,可大致了解Verolog HDL所提供的能力,掌握Verilog HDL语言的核心子集。

1 Verilog HDL语言具有:设计的行为特性、设计的数据流特性、设计的结构组成以及包括响应监控和设计验证方面的时延和波形产生机制。

2 如何描述自顶向下的设计思想:每个模块实现特定的功能,模块间可进行层次的嵌套,因此可以将大型的数字电路设计分割成大小不一的小模块来实现特定的功能,最后通过由顶层模块调用子模块来实现整体功能。

3 三种建模方式

3.1 结构化描述方式

结构化建模方式就是通过对电路结构的描述来建模,即通过对器件的调用并使用线网来连接各器件的描述方式。这里的器件包括Verilog HDL的内置门,也可以是用户的一个设计。

3.2 数据流描述方式

数据流的建模方式就是通过对数据流在设计中的具体行为的描述来建模。最基本的机制是用连续赋值语句。还需要借助用于HDL提供的一些运算符,如按位逻辑运算符。

3.3 行为描述方式

        行为方式的建模是指采用对信号行为级的描述方式进行建模,在表示方面,类似数据流的建模方式,但一般把initial模块或always块语句描述的归为行为建模方式。行为建模方式通常借助一些行为级的运算符如+-等。

3 总结

在实际设计中,往往是多种设计模型的混合。一般对于顶层设计,采用结构描述方式(功能器件网表方式连接)对低层模块进行例化;对低层模块,可采用数据流(assign)、行为级(initial, always)或者二者的结合。

4 Verilog数据类型

Verilog语言主要包含两种数据类型:线网类型和寄存器类型。

4.1 线网类型

        wire和tri定义

线网类型主要有wire和tri两种。

tri用于定义三态线网。

wire型用于对结构化器件之间的物理连线的建模。如器件管脚,内部器件如与门的输出等。

线网型代表物理连线,不存储逻辑值,必须由器件驱动。通常由assign进行赋值,如assign A=B^C。

当wire型信号没有被驱动时,缺省值为Z高阻态。信号没有定义数据类型时,缺省为wire型。

4.2 寄存器类型

reg用于对存储单元的描述,如D型触发器,ROM等。存储器类型的信号在某种触发机制下分配了一个值,在分配下一个值时保留原值,但reg型变量不一定是存储单元,如always语句中进行描述的必须用reg类型的变量。

附上一些简单的入门级代码以供参考

//3.1 全加器
module adder4(count, sum, ina, inb, cin);
output[3:0]sum;
output count;
input [3:0] ina, inb;
input cin;
assign {count, sum}=ina+inb+cin;
endmodule 

//4位计数器
module count4(out, reset, clk);
output [3:0] out;
input reset, clk;
reg[3:0]out;
always@(posedge clk)
    begin 
        if(reset)out<=0;
        else out<=out+1;
        end
endmodule

//4位全加器的仿真程序
module adder_tp;
reg[3:0]a,b;    //测试输入信号定义为reg型
reg cin;
wire[3:0]sum;    //测试输出信号定义为wire型
wire cout;
integer i,j;

adder4 adder(sum, cout, a, b, cin);    //调用测试对象
always#5 cin=~cin;

initial 
begin 
a=0; b=0; cin=0;
for(i=1;i<16;i=i+1)
#10 a=i;
end

3.1.1.1 加法器
module addr(a,b,count,sum);
    input[2:0]a;
    input[2:0]b;
    input cin;
    output count;
    output [2:0]sum;
    
    assign {count, sum}=a+b+cin;
endmodule

//3.1.1.2 比较器
module compare(equal, a, b);
    input[1:0]a,b;    //declare the input signal;
    output equare;
    
    assign equare=(a==b)?1:0;
    //if a=b,  output 1, otherwise 0;
endmodule

/*三态缓冲器(驱动器,门),输入缓冲器用于将外设送来的数据暂时存放,以便处理器
将其取走;输出缓冲器的作用是用来暂时存放处理器送往外设的数据。
数控缓冲器的作用就是使高速工作的CPU与慢速工作的外设起协调和缓冲作用,实现数据传送的同步。
由于缓冲器用在总线上所以要有三态输出功能。*/
/*三态电路有三种不同的输出值,分别是逻辑0,1和高阻态,高阻态用来将逻辑门同系统的
其他部分加以隔离。*/

//3.1.1.3 三态驱动器
//定义mytri模块
module mytri(din, d_en, d_out);
    input din;
    input d_en;
    output d_out;
    
    assign d_out = d_en ? din:'bz;
endmodule

//调用mytri模块
module trist(din, d_en, d_out);
    input din;
    input d_en;
    output d_out;

    mytri u_mytri(din, d_en, d_out);    //实例化mytri模块
endmodule

3.3.2.1 数据流描述方式
module FA_flow(A,B,Cin,Sum,Count)
    input A,B,Cin;
    output Sum, Count;
    
    wire S1,T1,T2,T3;
    
    //各个assign语句是并行执行的,即各语句的执行与语句之间的顺序无关。
    //下面的代码说明,在数据流描述方式中,除连续赋值语句之外还需要借助HDL提供的一些逻辑运算符来实现。
    assign #2 S1=A^B;    
    assign #2 Sum=S1^Cin;
    assign #2 T3=A&B;
    assign #2 T1=A&Cin;
    assign #2 T2=B&Cin;
endmodule

3.3.3 行为建模方式
//3.3.3.1 一位全加器的行为建模
module FA_behav1(A,B,Cin,Sum,Cout);
    input A,B,Cin;
    output Sum, Cout;
    reg Sum, Cout;
    reg T1,T2,T3;
    
    always@(A or B or Cin)
    begin 
        Sum(A^B)^Cin;    //相异为1相同为0
        T1=A&Cin;
        T2=B&Cin;
        T3=A&B;
        Cout=(T1|T2)|T3;
    end
endmodule

//1只有寄存器类型的信号才可以在always和initial语句中进行赋值,类型定义通过reg语句
实现;
2 always语句是一直重复执行,由敏感表中的变量触发;
3 always语句从0时刻开始;
4 在begin和end之间的语句是顺序执行,输出串行语句。
        
3.3.3.2一位全加器的行为建模
module FA_behav2(A,B,Cin,Sum,Cout);
    input A,B,Cin;
    output Sum, Cout;
    
    reg Sum, Cout;
    
    always@(A or B or Cin)
    begin 
        {Count, Sum}=A+B+Cin;
        //{Count, Sum}表示对位数的扩展,两个1bit相加,和有2位,低位放在Sum变量中,进位放在Count中;
        //相当于位数的拼接,从左到右由高到低
    end
endmodule

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
目 录 译者序 前言 第1章 简介 1 1.1 什么是Verilog HDL? 1 1.2 历史 1 1.3 主要能力 1 第2章 HDL指南 4 2.1 模块 4 2.2 时延 5 2.3 数据流描述方式 5 2.4 行为描述方式 6 2.5 结构化描述形式 8 2.6 混合设计描述方式 9 2.7 设计模拟 10 第3章 Verilog语言要素 14 3.1 标识符 14 3.2 注释 14 3.3 格式 14 3.4 系统任务和函数 15 3.5 编译指令 15 3.5.1 `define和`undef 15 3.5.2 `ifdef、`else 和`endif 16 3.5.3 `default_nettype 16 3.5.4 `include 16 3.5.5 `resetall 16 3.5.6 `timescale 16 3.5.7 `unconnected_drive和 `nounconnected_drive 18 3.5.8 `celldefine 和 `endcelldefine 18 3.6 值集合 18 3.6.1 整型数 18 3.6.2 实数 19 3.6.3 字符串 20 3.7 数据类型 20 3.7.1 线网类型 20 3.7.2 未说明的线网 23 3.7.3 向量和标量线网 23 3.7.4 寄存器类型 23 3.8 参数 26 第4章 表达式 28 4.1 操作数 28 4.1.1 常数 28 4.1.2 参数 29 4.1.3 线网 29 4.1.4 寄存器 29 4.1.5 位选择 29 4.1.6 部分选择 29 4.1.7 存储器单元 30 4.1.8 函数调用 30 4.2 操作符 30 4.2.1 算术操作符 31 4.2.2 关系操作符 33 4.2.3 相等关系操作符 33 4.2.4 逻辑操作符 34 4.2.5 按位操作符 35 4.2.6 归约操作符 36 4.2.7 移位操作符 36 4.2.8 条件操作符 37 4.2.9 连接和复制操作 37 4.3 表达式种类 38 第5章 门电平模型化 39 5.1 内置基本门 39 5.2 多输入门 39 5.3 多输出门 41 5.4 三态门 41 5.5 上拉、下拉电阻 42 5.6 MOS开关 42 5.7 双向开关 44 5.8 门时延 44 5.9 实例数组 45 5.10 隐式线网 45 5.11 简单示例 46 5.12 2-4解码器举例 46 5.13 主从触发器举例 47 5.14 奇偶电路 47 第6章 用户定义的原语 49 6.1 UDP的定义 49 6.2 组合电路UDP 49 6.3 时序电路UDP 50 6.3.1 初始化状态寄存器 50 6.3.2 电平触发的时序电路UDP 50 6.3.3 边沿触发的时序电路UDP 51 6.3.4 边沿触发和电平触发的混合行为 51 6.4 另一实例 52 6.5 表项汇总 52 第7章 数据流模型化 54 7.1 连续赋值语句 54 7.2 举例 55 7.3 线网说明赋值 55 7.4 时延 55 7.5 线网时延 57 7.6 举例 57 7.6.1 主从触发器 57 7.6.2 数值比较器 58 第8章 行为建模 59 8.1 过程结构 59 8.1.1 initial 语句 59 8.1.2 always语句 61 8.1.3 两类语句在模块中的使用 62 8.2 时序控制 63 8.2.1 时延控制 63 8.2.2 事件控制 64 8.3 语句块 65 8.3.1 顺序语句块 66 8.3.2 并行语句块 67 8.4 过程性赋值 68 8.4.1 语句内部时延 69 8.4.2 阻塞性过程赋值 70 8.4.3 非阻塞性过程赋值 71 8.4.4 连续赋值与过程赋值的比较 72 8.5 if 语句 73 8.6 case语句 74 8.7 循环语句 76 8.7.1 forever 循环语句 76 8.7.2 repeat 循环语句 76 8.7.3 while 循环语句 77 8.7.4 for 循环语句 77 8.8 过程性连续赋值 78 8.8.1 赋值—重新赋值 78 8.8.2 force与release 79 8.9 握手协议实例 80 第9章 结构建模 83 9.1 模块 83 9.2 端口 83 9.3 模块实例语句 83 9.3.1 悬空端口 84 9.3.2 不同的端口长度 85 9.3.3 模块参数值 85 9.4 外部端口 87 9.5 举例 89 第10章 其他论题 91 10.1 任务 91 10.1.1 任务定义 91 10.1.2 任务调用 92 10.2 函数 93 10.2.1 函数说明部分 93 10.2.2 函数调用 94 10.3 系统任务和系统函数 95 10.3.1 显示任务 95 10.3.2 文件输入/输出任务 97 10.3.3 时间标度任务 99 10.3.4 模拟控制任务 99 10.3.5 定时校验任务 100 10.3.6 模拟时间函数 101 10.3.7 变换函数 102 10.3.8 概率分布函数 102 10.4 禁止语句 103 10.5 命名事件 104 10.6 结构描述方式和行为描述方式的 混合使用 106 10.7 层次路径名 107 10.8 共享任务和函数 108 10.9 值变转储文件 110 10.9.1 举例 111 10.9.2 VCD文件格式 112 10.10 指定程序块 113 10.11 强度 114 10.11.1 驱动强度 114 10.11.2 电荷强度 115 10.12 竞争状态 116 第11章 验证 118 11.1 编写测试验证程序 118 11.2 波形产生 118 11.2.1 值序列 118 11.2.2 重复模式 119 11.3 测试验证程序实例 123 11.3.1 解码器 123 11.3.2 触发器 124 11.4 从文本文件中读取向量 126 11.5 向文本文件中写入向量 127 11.6 其他实例 128 11.6.1 时钟分频器 128 11.6.2 阶乘设计 130 11.6.3 时序检测器 132 第12章 建模实例 136 12.1 简单元件建模 136 12.2 建模的不同方式 138 12.3 时延建模 139 12.4 条件操作建模 141 12.5 同步时序逻辑建模 142 12.6 通用移位寄存器 145 12.7 状态机建模 145 12.8 交互状态机 147 12.9 Moore有限状态机建模 150 12.10 Mealy型有限状态机建模 151 12.11 简化的21点程序 153 附录 语法参考 157 参考文献 172
### 回答1: 对于华为Verilog HDL入门教程的下载,您可以按照以下步骤进行操作: 1. 打开您的网络浏览器,并访问华为官方网站。 2. 在网站的搜索框中输入“华为Verilog HDL入门教程”。 3. 单击搜索按钮,系统会显示与您搜索相关的结果。 4. 从搜索结果中选择与您需求最符合的教程链接,并单击进入。 5. 在页面上找到下载链接或指示,可能是以PDF或文本文件的形式提供。 6. 单击下载链接,并等待下载完成。 请注意,华为官方网站是最可靠和安全的资源来源,确保您从该网站下载教程。此外,您可能需要通过华为账户进行登录或注册,然后才能下载教程。 如果以上步骤不适用或无法找到相关教程,请您尝试通过其他渠道获取帮助。您可以到华为官方论坛、技术社区或与华为客服联系,以获取更多关于Verilog HDL入门教程的信息和支持。 ### 回答2: 华为Verilog HDL入门教程可以在华为官方网站上进行下载。以下是下载教程的步骤: 1. 打开浏览器,访问华为官方网站(www.huawei.com)。 2. 在网站首页的搜索栏中输入“华为Verilog HDL入门教程”。 3. 在搜索结果中找到与入门教程相关的链接。 4. 点击链接进入教程页面。 5. 浏览页面,找到下载按钮或链接。 6. 点击下载按钮或链接,选择下载到您的计算机或设备上的位置。 7. 根据提示完成下载过程。 请注意,华为官方网站通常提供多种语言的下载选项,您可以选择适合您的语言版本进行下载。 通过下载华为Verilog HDL入门教程,您将有机会学习到使用Verilog HDL进行硬件设计的基本知识和技巧。这个教程将引导您了解Verilog HDL的基本语法、模块化设计、时序和组合逻辑等概念。同时,教程还提供了一些示例代码和案例,帮助您更好地理解和应用所学内容。 通过学习华为Verilog HDL入门教程,您将能够掌握Verilog HDL的基础,从而能够进行更复杂的硬件设计和开发。无论您是从事硬件设计的工程师,还是对硬件设计有兴趣的初学者,这个教程都会为您提供一个很好的起点。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小菜鸡变形记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值