首页 > 其他分享 >理解 Verilog HDL 的抽象层次

理解 Verilog HDL 的抽象层次

时间:2024-10-12 23:17:37浏览次数:3  
标签:逻辑 抽象层次 电路 Verilog 描述 HDL 输入 out

VerilogHDL组合逻辑的编码可以从三个不同抽象层实现,这些抽象层是描述同一种硬件的不同方式。从具体到抽象的程度,可以分为gate、dataflow、behavior三种,其中gate级描述了硬件实际搭建的过程,dataflow级描述实际的逻辑门控数据的流动方式,behavior描述的是电路实际行为方式。可以根据用户实际喜好实现三种方式用于描述您的设计,下面我们还将看看这三种抽象层次所实现代码的差异。

抽象层

Verilog HDL 允许我们在三个不同的抽象层次上描述硬件。这些抽象层分别是:

门级建模 gate

在这一层次,HDL(Hardware Description Language,HDL)描述实际的逻辑门及其连接方式。这种建模方式适合简单的电路,但在设计复杂电路时不够实用。

数据流级建模 dataflow

在这一层,描述电路中的数据流动。数据流建模通过使用逻辑运算符将电路转化为布尔逻辑句子。这种方法更加高效,但仍然是对电路行为的具体描述。

行为级建模 behavior

这是一个更高的抽象层次,通过过程块(如 always 块)来描述电路的行为。这种方式使得设计复杂电路变得更加简单,因为我们只需描述电路的功能,而不需要具体的逻辑门。

具体实例

下面我们将通过一个具体的实例来说明这三种抽象层次各种的风格。
选用的实例是一个简单的2选1mux组合电路作为说明。
2 选 1 多路复用器( M U X )是一个选择器, 2选1多路复用器(MUX)是一个选择器, 2选1多路复用器(MUX)是一个选择器,
它根据选择输入( X )从两个输入( A 和 B )中选择一个输出( C ) 它根据选择输入(X)从两个输入(A和 B)中选择一个输出(C) 它根据选择输入(X)从两个输入(A和B)中选择一个输出(C)
其电路图如图:

在这里插入图片描述
逻辑表达式为:
C = X ⋅ A + X ‾ ⋅ B C= X\cdot A+ \overline{X} \cdot B C=X⋅A+X⋅B
这里的逻辑意义是:

当 X为 1 时,输出 C等于输入 A的值。
当 X为 0 时,输出 C等于输入 B的值。

真值表:

选择信号 X输入 A输入 B输出 C
0000
0011
0100
0111
1000
1010
1101
1111
// Gate Level MUX 2-to-1
module mux2to1_gatelevel(input a, b, x, output c);
    wire not_x;
    wire out_and_a, out_and_b;

    not not1(not_x, x);
    and and1(out_and_a, a, x);
    and and2(out_and_b, b, not_x);
    or or1(c, out_and_a, out_and_b);
endmodule

使用基础逻辑门(NOT、AND、OR)实现了多路复用器。
not_x 是 x 的反相,out_and_a 和 out_and_b 是两个 AND 门的输出,分别对应于输入 a 和 b 经过选择信号 x 的与运算。
最后,通过一个 OR 门将两个 AND 门的输出合并,得出最终输出 c

// Dataflow Level MUX 2-to-1
module mux2to1_datalevel(input a, b, x, output c);
    assign c = (a & x) | (b & ~x);
endmodule

c 的值由 a 和 b 根据选择信号 x 通过位与(AND)和位或(OR)运算得到。
这种方式简洁明了,便于理解。

// Behavioral Level MUX 2-to-1
module mux2to1_behavioral(input a, b, x, output reg c);
    always @(*) begin
        if (x)
            c = a;
        else
            c = b;
    end
endmodule

使用 always @(*) 语句时,表示该块中的代码会在任何输入信号发生变化时执行。当x为1时,c取a,当x为0时,c取b。行为级的编码告诉编译器我们想要的结果,让编译器自己去实现对应电路的逻辑。

无论是门级、数据流级还是行为级实现,这三种不同的编程风格或实现方式都能够实现同样的功能。相信编译器的电路实现,我们可以更加专注于电路设计的高层次问题,而不必纠结于具体实现细节。
编译器可以有效地将我们的行为描述转换为适当的逻辑门或数据流级实现。其优化能力通常优于手动设计,这样可以节省时间并减少错误。
所以一般设计的时候都是通过行为级编码实现,当需要压缩编译器电路实现的资源时,也会通过数据流级的编码。这时是需要对实现的电路非常了解。

标签:逻辑,抽象层次,电路,Verilog,描述,HDL,输入,out
From: https://blog.csdn.net/qq_45041298/article/details/142887109

相关文章

  • SpinalHDL之错误集(一)
    本文作为SpinalHDL学习笔记第七十六篇,作为错误集使用,类似高中生的错题集,几率使用SpinalHDL过程中遇到的问题,小到语法错误、版本兼容问题,大到SpinalHDL库函数错误等等,持续更新。SpinalHDL学习笔记总纲:SpinalHDL学习笔记_blackboxspinalhdl-CSDN博客目录:1.Stream库函数......
  • SpinalHDL之设计错误(Design Errors)(二)
    本文作为SpinalHDL学习笔记第七十五篇,介绍SpinalHDL的设计错误。目录:6.锁存器检测(Latchdetected)7.⽆驱动检测(nodriveron)8.排除空指针(NullPointerException)9.定义为组件输入的寄存器(Registerdefinedascomponentinput)10.作⽤域违例(Scopeviolation)六.......
  • FPGA Verilog HDL代码如何debug?
    Q:Verilog代码如何debug?最近学习fpga,写了不少verilog,开始思考如何debug的问题!c语言是顺序执行,而verilog是并行执行,想请教如何debug自己的verilog代码,我以前一直都是对照着modelsim上的方针波形来看看哪里有逻辑错误!A:以下是一些常见的Verilog代码调试方法:1.仿真工具:正如......
  • 怎么样提高verilog代码编写水平?
    Q:怎么样提高verilog代码编写水平?Cpu从事DFT工作。目前仅限于写一些简单模块。自学的话如何提高verilog编写水平?A:以下是一些提高Verilog代码编写水平的自学方法:1.深入学习基础知识:重新巩固数字电路的基本概念,如逻辑门、组合逻辑、时序逻辑、状态机等,这是编写高质量Veri......
  • 写 Verilog HDL 如何做到心中有电路?
    Q:写Verilog如何做到心中有电路?老师说没电路就不要写代码,但我写个乘法器在综合前都想不出它电路啥样,全加器还行。A:要在写Verilog代码时做到心中有电路,可以尝试以下方法:1.深入学习数字电路基础知识:包括各种逻辑门、组合逻辑电路、时序逻辑电路的原理和结构,理解它们的工......
  • verilog文件到tb的简单python脚本
    使用python3verilog_to_tb.pytest.v需要注意的是,例化时并没有去掉最后的逗号,手动去除下。verilog_to_tb.pyimportsysimportredefread_file(file):withopen(file,'r')asf:lines=f.readlines()returnlinesdefmain():lines=read_file('......
  • 关于QEI(增量编码器)的verilog程序
    关于QEI的Verilog程序其实比较简单的,但是opencores上没有现成的程序,FPGA4FUN上有一个4倍频计数程序[1],但是没有一个详细原理分析过程,[2]描述了一个编码器的VHDL代码,但是觉得很复杂,为此我分析了一下增量编码器的旋转过程和AB相的电平变化规律,在这个基础上开发了QEI的Verilog程序,首......
  • Bluespec SystemVerilog(BSV) 及 MIT 体系结构公开课 笔记
    前言早年MIT有三门用bsv作为硬件描述语言的体系结构课程,代号分别为6.004,6.175和6.375.根据MITCScourselist,现在这三门课分别改名为了6.1910、6.1920和6.5900.本文是自学这三门课所需的bsv时记录的笔记,内容主要来源于这三门课目前公开的资料(6.17516fall,6.375......
  • systemverilog笔记
    变量类型变量名状态数是否带符号比特数logic4无1bit2无1byte2有8shortint2有16int2有32longint2有64integer4有32time4无64$isunknown(表达式):在表达式任意位出现X或者Z时返回1。数组数组初始化使用单引号加大括......
  • HDLBits中文版,标准参考答案 |3.1.1 Basic Gates | 基本门电路
    关注 望森FPGA 查看更多FPGA资讯这是望森的第8期分享作者|望森来源|望森FPGA目录1Wire|连线2GND|地线3NOR|或非门4Anothergate|另外的门电路5Twogates|两个门电路6Morelogicgates|更多逻辑门电路77420chip|7420芯片8Trutht......