简而言之,VHDL是一种用于设计数字电路的计算机语言。 我使用术语“计算机语言”来区分 VHDL 与其他更常见的编程语言,如 Java 或 C++。但是 VHDL 是一种编程语言吗?是的。这是一种编程语言,在创建计算机程序时毫无用处! VHDL 是一种事件驱动的并行编程语言。虽然它不适合创建可由计算机上的 CPU 运行的程序,但它非常适合创建实际的 CPU。它是一种硬件描述语言,这意味着它可以用于设计数字逻辑。 在此处访问基本 VHDL 教程系列! 考虑上图。在 CPU 芯片内部,有很多主要是数字电子电路(中间)。可以使用示意图(右)显示这些数字电路。在制作集成电路芯片
尽管 VHDL 和 FPGA 工具通常非常昂贵,但如果您是学生,则可以轻松免费访问最先进的软件。有多种仿真器、编辑器和 IDE 可用于处理 VHDL。本文将向您展示如何安装 VHDL 工程师使用的两个最流行的程序。 VHDL 模拟器 Siemens EDA(前身为 Mentor Graphics)的 ModelSim 是最常见的 VHDL 仿真器,很有可能您必须在第一个 VHDL 工作中使用 ModelSim 或程序的 QuestaSim 风格。使您的代码尽可能具有可移植性是一种很好的设计实践,本博客中的代码也不例外。如果您可以访问另一个 VHDL 模拟器,请继续使用它;它应该类似地工作。
在学习一门新的编程语言时,我总是喜欢从学习如何打印开始。当您掌握输出“Hello World!”时,您就知道环境已经正常工作了。它还向您展示了该语言的基本框架,即生成任何输出所需的最少代码。 你可能会想:但是 VHDL 是一种硬件描述语言,它怎么能输出任何文本呢?你需要一个连接到 FPGA 或其他东西的屏幕以及介于两者之间的各种逻辑,这一点都不简单。虽然这一切都是真的,但让我们暂时忘记 FPGA 和 ASIC,将注意力集中在 VHDL 语言上。 这篇博文是基本 VHDL 教程系列的一部分。 VHDL 可以被认为是一种并行编程语言,因此我们可以使用这个程序员的方法来学习它。由于我们使用该
在之前的教程中,我们了解到可以将进程视为程序线程。我们还了解到wait; 语句导致程序无限期暂停。但是有没有办法让程序等待任何其他时间值而不是永远? 如果我们去掉 wait; 一起尝试编译程序,编译器会抱怨无限循环。编译器所指的循环是进程循环 . VHDL 中的进程线程永远不会终止,它会在 begin 之间不断循环 和结束进程; 声明。必须有一个等待 流程循环内某处的语句。 这篇博文是基本 VHDL 教程系列的一部分。 而 wait; 会导致程序永远暂停,wait for 语句可用于将程序延迟任意时间。 wait for 的语法 语句是:wait for ; 其中 是数字和 是以
在之前的教程中,我们学习了如何使用 wait for 来延迟时间 陈述。我们还了解了流程循环。我们现在知道,如果我们放任不管,进程“线程”将永远在进程内循环。 但是,如果我们只想在流程开始时做某事怎么办?然后在最后循环一些其他代码?可以使用 loop 创建 VHDL 中最简单的一种循环 声明。 这篇博文是基本 VHDL 教程系列的一部分。 简单循环的语法是: loopend loop; 这样的循环将无限期地持续下去,或者直到 exit; 遇到了。 出口 语句可用于跳出任何循环。 锻炼 这个视频教程教你如何创建一个简单的循环,以及如何打破它: 我们在本教程中创建的最终代码:
在之前的教程中,我们学习了使用 loop 创建一个无限循环 陈述。我们还学习了如何使用 exit 跳出循环 陈述。但是如果我们希望循环迭代一定次数怎么办? For-Loop 是实现此目的的最简单方法。 For-Loop 允许您迭代固定范围的整数或枚举项。属于当前迭代的项目将通过隐式声明的常量在循环中可用。 这篇博文是基本 VHDL 教程系列的一部分。 For循环的语法是: for in loopend loop; 是将在循环内可用的常量的任意名称。 是循环将迭代的整数或枚举值的范围。整数范围可以递增也可以递减。 包含从 0 到 9 的所有 10 个数字的递增范围的 VH
在之前的教程中,我们学习了如何使用 For-Loop 迭代整数范围。但是,如果我们想要对循环进行更详细的控制,而不仅仅是固定的整数范围呢?我们可以为此使用 While 循环。 只要它测试的表达式计算结果为 true,While 循环就会继续迭代封闭的代码 .因此,While-Loop 适用于您事先不确切知道需要多少次迭代的情况。 这篇博文是基本 VHDL 教程系列的一部分。 While-Loop 的语法是: while loopend loop; 是一个布尔值 true 或 false .它也可以是计算结果为 true 的表达式 或 false .在循环的每次迭代之前评估条件,
您已经完成了基本 VHDL 教程系列的第一部分。恭喜!您距离成为真正的 VHDL 高手只有数小时、数小时和数小时的时间。但是你已经完成了第一步,这是现在最重要的部分! 在我们继续之前,您应该通过此测验测试您的技能: 这个过程有什么问题? 包含没有等待声明 缺少分号在“过程是”之后 过程没有输入 正确的!错误的! - “i”的值会被打印多少次? 无限数次数 零 一次 正确的!错误的! - 这个过程会打印多少次“哈哈!”? 总是 10次 总是 11次 取决于我们模拟多长时间 正确的!错误的! - 是用“退出”吗?在这个过程中合
在之前的教程中,我们学习了如何在流程中声明变量。变量有利于在流程中创建算法,但外部世界无法访问它们。如果变量的作用域仅在单个进程内,它如何与任何其他逻辑交互?对此的解决方案是信号 . 在的架构之间声明信号是 行和 begin VHDL 文件中的语句。这称为架构的声明部分。 这篇博文是基本 VHDL 教程系列的一部分。 声明信号的语法是:signal :; 可以选择使用初始值声明信号:signal : :=; 锻炼 在本视频教程中,我们学习如何声明信号。我们还将了解变量和信号之间的主要区别: 我们在本教程中创建的最终代码: entity T06_SignalTb is
在之前的教程中,我们了解了信号和变量之间的主要区别。我们了解到信号比变量具有更广泛的范围,变量只能在一个进程中访问。那么我们如何使用信号进行多个进程之间的通信呢? 我们已经学会了使用 wait; 无限等待,wait for 等待特定的时间。 VHDL 中还有两种类型的等待语句。 这篇博文是基本 VHDL 教程系列的一部分。 Wait On 语句将暂停进程,直到指定的信号之一发生变化:wait on , ...; 等待直到语句将暂停,直到事件导致条件变为真:wait until ; 实际上,Wait On、Wait Within和Wait For是可以组合的:wait on
在之前的教程中,我们使用了条件表达式和 Wait until 语句。该表达式确保仅当两个计数器信号相等时才触发该过程。但是,如果我们希望进程中的程序根据不同的输入采取不同的操作呢? If-Then-Elsif-Else 语句可用于在我们的程序中创建分支。根据变量的值或表达式的结果,程序可以采用不同的路径。 这篇博文是基本 VHDL 教程系列的一部分。 基本语法是: if thenelsif thenelseend if; elsif 和 else 是可选的,elsif 可以多次使用。 可以是布尔值 true 或 false ,或者它可以是一个计算结果为 true 的表达式
您应该始终使用敏感度列表 触发生产模块中的流程。敏感度列表是一个过程的参数,它列出了该过程敏感的所有信号。如果任何信号发生变化,进程将被唤醒,并执行其中的代码。 我们已经学会了使用 wait on 和等到 用于在信号改变时唤醒进程的语句。然而,老实说,这不是我编写大部分流程的方式。 这篇博文是基本 VHDL 教程系列的一部分。 编写 VHDL 代码时,编写风格取决于代码是否仅打算在模拟器中运行。如果我正在编写模拟代码,就像我们在本教程系列中所做的那样,我总是 使用等待 语句来控制进程。如果我正在编写打算创建物理实现的代码,我从不 使用等待 声明。 带有敏感列表的进程的语法是:proc
VHDL 中最常用的类型是 std_logic .将此类型视为单个位,即由单条物理线路承载的数字信息。 std_logic 与 integer 相比,我们可以对设计中的资源进行更细粒度的控制 类型,我们在之前的教程中一直使用。 通常,我们希望数字接口中的电线具有值 1 或 0 .这两个值是位(二进制数字)可以具有的唯一值。但实际上,一个物理数字信号可以处于多种状态,std_logic type 在模拟方面做得很好。因此它是VHDL中最常用的类型。 这篇博文是基本 VHDL 教程系列的一部分。 std_logic type 可以有以下值: ‘1’ 逻辑1 ‘0’ 逻辑0 ‘Z’
std_logic_vector type 可用于在 VHDL 中创建信号总线。 std_logic 是 VHDL 中最常用的类型,std_logic_vector 是它的数组版本。 而 std_logic 非常适合模拟单根电线可以承载的值,但对于实现进出组件的电线集合来说不太实用。 std_logic_vector 是一个复合类型,这意味着它是一个子元素的集合。 std_logic_vector 的信号或变量 类型可以包含任意数量的std_logic 元素。 这篇博文是基本 VHDL 教程系列的一部分。 声明 std_logic_vector 的语法 信号是:signal :std
完成基本 VHDL 教程系列中的教程 6-11 后,通过此 VHDL 测验测试您的编码技能! 如果您阅读了博客文章、观看了视频并进行了练习,那么您应该有资格回答测验中的大部分问题。测验是故意使有点具有挑战性。如果您不知道答案,请尝试使用您的推理技巧找出最可能的答案。 阅读每个答案后面的解释,里面有一些微学习。 这段代码会打印出什么? MySignal=-2147483648 MySignal=0 MySignal=10 正确的!错误的! - 这段代码会打印出什么? MySignal=0 MySignal=1 MySignal=10 正确的!错
VHDL 中的有符号和无符号类型是位向量,就像 std_logic_vector 类型一样。不同之处在于,虽然 std_logic_vector 非常适合实现数据总线,但它对于执行算术运算却毫无用处。 如果您尝试向 std_logic_vector 类型添加任何数字,ModelSim 将产生编译错误:中缀运算符“+”没有可行的条目。这是因为编译器不知道如何解释向量所在的这个位集合。 这篇博文是基本 VHDL 教程系列的一部分。 我们必须将向量声明为有符号或无符号,以便编译器将其视为数字。 声明有符号和无符号信号的语法是:signal :signed( downto 0) :=;si
VHDL 中的并发语句是体系结构内的信号分配,但在正常进程构造之外。并发语句也称为并发赋值或并发进程。 创建并发语句时,实际上是在创建具有某些明确定义的特征的流程。并发语句总是等价于一个使用敏感性列表的进程,其中信号赋值运算符右侧的所有信号都在敏感性列表中。 当您想要创建导致分配单个信号的简单逻辑时,这些速记符号过程非常有用。您可以直接在架构中直接分配给目标信号,而不是输入带有敏感度列表和所有这些的完整过程构造。 这篇博文是基本 VHDL 教程系列的一部分。 如果使用得当,代码的意图仍然非常清晰。无需为要翻转的每一位都创建一个过程。 锻炼 在本视频中,我们将学习如何创建并发语句:
Case-When 语句将使程序从多个不同路径中选择一个,具体取决于信号、变量或表达式的值。它是具有多个 Elsif 的 If-Then-Elsif-Else 语句的更优雅的替代方案。 其他编程语言也有类似的结构,使用关键字如 switch , case , 或 选择 .除此之外,Case-When 语句通常用于在 VHDL 中实现多路复用器。继续阅读,或观看视频了解如何操作! 这篇博文是基本 VHDL 教程系列的一部分。 Case-When 语句的基本语法是:case is when code for this branch when 这个分支的代码 ...end case;
模块是一个独立的 VHDL 代码单元。模块通过实体与外界通信 . 港口地图 是模块实例化的一部分,您可以在其中声明模块的输入和输出应连接到哪些本地信号。 在本系列之前的教程中,我们一直在主 VHDL 文件中编写所有代码,但通常我们不会这样做。我们创建逻辑的目的是在 FPGA 或 ASIC 设计中使用它,而不是用于模拟器。 为在模拟器中运行而创建的 VHDL 模块通常没有输入或输出信号。它是完全独立的。这就是为什么我们设计的实体是空的。 实体之间没有任何东西 标签和结束实体; 标签。 这篇博文是基本 VHDL 教程系列的一部分。 没有任何输入或输出信号的模块不能用于实际设计中。它的唯一
创建模块是重用代码的好方法,但通常您需要在整个设计中使用具有较小变化的相同模块。这就是泛型和泛型映射的用途。它允许您在编译时使模块的某些部分可配置。 当我们想要避免一遍又一遍地输入相同的值时,可以使用常量。它们可用于在编译时定义信号向量的位宽,它们甚至还可以映射到通用常量。在代码中的任何地方都可以使用常量代替信号和变量,但它们的值在编译后不能更改。 这篇博文是基本 VHDL 教程系列的一部分。 在之前的教程中,我们创建了一个总线宽度为 8 位的 4 输入多路复用器模块。但是,如果我们还需要一个具有不同总线宽度的类似 MUX 呢?将代码复制粘贴到新模块中并更改数字是唯一的解决方案吗?
VHDL