【Verilog HDL】门级描述 / 数据流描述 / 行为级描述

您所在的位置:网站首页 基本的逻辑门电路有哪5种组成方式 【Verilog HDL】门级描述 / 数据流描述 / 行为级描述

【Verilog HDL】门级描述 / 数据流描述 / 行为级描述

2024-07-07 13:38| 来源: 网络整理| 查看: 265

目录 0 前言1 输出端口的设计1.1 门级描述和数据流描述1.2 行为级描述 2 三种描述方式的整体架构2.1 门级描述2.2 数据流描述2.3 行为级描述2.4 补充:独立的语句2.5 小结 3 理解三种描述方式的本质3.1 门级描述3.2 数据流描述3.3 行为级描述 4 理解不同抽象层级描述方式与功能设计之间的联系4.1 需求分析 & 行为级描述4.2 求逻辑表达式 & 数据流描述4.3 画逻辑电路图 & 门级描述4.4 小结 5 激励块的特殊设置6 善用科技黑箱:利用行为级描述和集成器件快速完成设计

0 前言

本文从整体上带你完成Verilog HDL语言的三种不同描述方式,让你从宏观上有所把握。

最核心的原则:一切设计实际需求而定,需要存储变量就用reg,需要有符号数就用integer/real/reg signed……

1 输出端口的设计

端口的设计,区别主要在于输出端口是默认的wire还是自定义的reg,本篇将以1位四选一数据选择器为例进行说明。

1.1 门级描述和数据流描述

这两种描述的时候,使用默认的wire即可。

这两种描述方式,本质上都是直接使用逻辑门

门级描述是显式地使用了门级原语数据流描述其实是隐式地使用门级原语,因为他是直接描述数据在寄存器直接的流动关系,本质上,还是在阐述逻辑门的使用

门级描述与数据流描述,就好比结绳记事和使用符号记事的区别,用一连串的符号标志,代替了绳子,减少了许多麻烦。

门级描述是以门级原语为基石的描述方式,必须使用线网类型数据流描述是以连续赋值语句为基石的描述方式,其左值必须是线网类型,右值无要求。

以下是四选一数据选择器的端口声明,关注output out语句

module choose_4to1( input d0,d1,d2,d3, input add1,add0, output out // 注意输出端口的设定 ); endmodule

你需要记住Verilog描述形式 需要记住,门级描述的输出和数据流描述的连续赋值语句的左值,必须是线网类型,所以必须使用默认的输出端口

1.2 行为级描述

行为级描述,输出端口类型应该使用output reg OUT,使用reg类型。

因为过程赋值语句的左值必须是寄存器类型

ANSI C风格的描述如下

module choose_4to1( input d0,d1,d2,d3, input add1,add0, output reg out // 注意输出端口的设定 ); endmodule

你也可以将输出端口初始化output reg out = 0

另外一种端口风格,但是不推荐

module choose_4to1(d0,d1,d2,d3,add1,add0,out); input d0,d1,d2,d3; input add1,add0; // 以下两条语句才能将out声明为reg类型的输出端口 output out; reg out; endmodule 2 三种描述方式的整体架构

就像盖房子那样,同样是楼房,使用不同的材料,建造的方式不同,速度也不同。

下面我对这几种描述进行一个近似比喻:

门级描述:手里只有基本材料,需要先烧制砖头再盖房子数据流描述:已经有了现成的砖头,只需要将其以合理的方式组合起来行为级描述:已经有了集成的房子,只需要拼接起来,就像火神山医院那样 2.1 门级描述

门级原语:and、or……

门级描述与门级原语为基本单元

2.2 数据流描述

连续赋值语句:assign

数据流描述以连续赋值语句为基本单元

2.3 行为级描述

结构化过程语句:initial和always

行为级描述以结构化过程语句为基本单元

2.4 补充:独立的语句

独立的语句指的是

输入输出端口的声明,特别的,reg类型输出端口可以定义的时候初始化,但是输入端口不允许 module Example ( input a,b, output reg OUT = 0 //【这里是关键点!】 ); endmodule 内部线网的设定,可以在定义的时候初始化:wire a = 1;内部变量的声明,可以在定义的时候初始化:reg b = 0; 2.5 小结 门级描述:输出部分必须是net类型,门级原语本质是模块实例调用,符合端口连接规则数据流描述:左值必须是net类型,右值无要求行为级描述:左值必须是reg类型,右值无要求,这里的重点是过程赋值语句的要求,因为它是行为描述的基本单元,就像C语言的变量那样。 3 理解三种描述方式的本质 3.1 门级描述

门级描述,使用门级原语对硬件设计进行描述,它直接反应了逻辑门直接的关系,更加接近底层,接近硬件。

3.2 数据流描述

数据流描述,描述了输出数据与输入数据之间的逻辑关系,通过逻辑表达式来建立输入输出数据的联系。

逻辑表达式可以理解为对硬件设计功能的数学表达形式。

3.3 行为级描述

行为级描述,直接描述硬件设计所能实现的功能,相当于:设计者告诉软件需要实现怎样的功能,由软件自动生成其门机描述。当然,没有那么智能。

4 理解不同抽象层级描述方式与功能设计之间的联系

此处,我将会以1位四选一数据选择器的设计为例

4.1 需求分析 & 行为级描述 输入四个数据,从四个里面选择一个:d0,d1,d2,d3通过地址控制选择哪个:s1,s0

其行为描述是:

对于输入的数据如果地址是00,则输出d0否则,如果地址是01,则输出d1否则,如果地址是10,则输出d2否则,如果地址是11,则输出d3否则,输出x

设计块如下: if语句版本的设计块

module mux_4to1 ( input d0,d1,d2,d3, input s1,s0, output reg out = 0 ); always @(*) begin if ({s1,s0} == 2'b_00) out = d0; else if ({s1,s0} == 2'b_01) out = d1; else if ({s1,s0} == 2'b_10) out = d2; else if ({s1,s0} == 2'b_11) out = d3; else out = 1'bx; end endmodule

case语句版本的设计块

module mux_4to1 ( input d0,d1,d2,d3, input s1,s0, output reg out = 0 ); always @(*) begin case({s1,s0}) 2'b00: out = d0; // 也可写成【2'd0】 2'b01: out = d1; // 【2'd1】 2'b10: out = d2; // 甚至于你可以直接写【2】 2'b11: out = d3; // 【3】 default: $display("错误!\n"); // 千万别忘记这个 endcase end endmodule

激励块如下:

module test4; reg d0 = 0,d1 = 1,d2 = 0,d3 = 1; reg s1,s0; wire out; mux_4to1 MT0 (d0,d1,d2,d3,s1,s0,out); initial $monitor("s1 = %b, s0 = %b, out = %b\n",s1,s0,out); initial begin #1 s1


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3