总之,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 模拟器,请继续使用它;它应该类似地工作。 VH
在学习一门新的编程语言时,我总是喜欢从学习如何打印开始。当你掌握输出“Hello World!”时,你就知道你已经让环境工作了。它还向您展示了该语言的基本框架,即产生任何输出所需的最少代码。 你可能会想:但 VHDL 是一种硬件描述语言,它怎么能输出任何文本呢?你需要一个连接到 FPGA 或其他东西的屏幕,以及介于两者之间的各种逻辑,这一点都不简单。虽然这一切都是真的,但让我们暂时忘掉 FPGA 和 ASIC,把注意力集中在 VHDL 语言上。 这篇博文是基本 VHDL 教程系列的一部分。 VHDL可以被认为是一种并行编程语言,因此我们可以使用这种程序员的方法来学习它。由于我们使用该语
在前面的教程中,我们了解到可以将进程视为程序线程。我们还了解到 wait; 语句导致程序无限期暂停。但是有没有办法让程序等待任何其他时间值而不是永远? 如果我们删除 wait; 完全并尝试编译程序,编译器会抱怨无限循环。编译器所指的循环是进程循环 . VHDL 中的进程线程永远不会终止,它会在 begin 之间不断循环 和 end process; 陈述。必须有一个 wait 在进程循环内的某处声明。 这篇博文是基本 VHDL 教程系列的一部分。 而 wait; 将导致程序永远暂停,wait for 语句可用于将程序延迟任意时间。 wait for 的语法 语句为:wait for
在上一个教程中,我们学习了如何使用 wait for 来延迟时间 陈述。我们还了解了流程循环。我们现在知道,如果我们让它,进程“线程”将永远在进程中循环。 但是,如果我们只想在流程开始时做一次事情怎么办?然后在最后循环一些其他代码? VHDL 中最简单的循环可以使用 loop 创建 声明。 这篇博文是基本 VHDL 教程系列的一部分。 简单循环的语法是: loopend loop; 这样的循环将无限期地继续,或者直到 exit; 遇到。 exit 语句可用于跳出任何循环。 运动 这个视频教程教你如何创建一个简单的循环,以及如何打破它: 我们在本教程中创建的最终代码: ent
在上一个教程中,我们学习了使用 loop 创建无限循环 陈述。我们还学习了如何使用 exit 跳出循环 陈述。但是,如果我们希望循环迭代一定次数怎么办? For-Loop 是完成此任务的最简单方法。 For-Loop 允许您迭代固定范围的整数或枚举项。属于当前迭代的项目将通过隐式声明的常量在循环内可用。 这篇博文是基本 VHDL 教程系列的一部分。 For-Loop的语法是: for <c> in <r> loopend loop; <c> 是在循环内可用的常量的任意名称。 <r> 是循环将迭代的整数范围或枚举值。整数范围可以递增也可
在之前的教程中,我们学习了如何使用 For 循环遍历整数范围。但是,如果我们想要对循环进行更详细的控制而不仅仅是一个固定的整数范围呢?我们可以为此使用 While-Loop。 只要它测试的表达式计算结果为 true,While 循环就会继续迭代封闭的代码 .因此,While-Loop 适用于事先不知道具体需要多少次迭代的情况。 这篇博文是基本 VHDL 教程系列的一部分。 While-Loop 的语法是: while <condition> loopend loop; <condition> 是一个布尔值 true 或 false .它也可以是计算结果为 tr
至此,您已经完成了 Basic VHDL Tutorial 系列的第一部分。恭喜!您距离成为真正的 VHDL 高手只有几个小时和几个小时的时间。但是你已经完成了第一步,这是现在最重要的部分! 在我们继续之前,您应该通过这个测验来测试您的技能: 这个过程有什么问题? 它包含没有等待语句 缺少分号在“过程是”之后 流程没有输入 正确的!错误的! - “i”的值将被打印多少次? 无限数次数 零 一次 正确的!错误的! - 这个过程会打印多少次“哈哈!”? 总是 10次 总是 11次 取决于我们模拟了多长时间 正确的!错误的!
在之前的教程中,我们学习了如何在进程中声明变量。变量有利于在流程中创建算法,但外部世界无法访问它们。如果变量的范围仅在单个进程内,它如何与任何其他逻辑交互?解决方案是信号 . 信号在 architecture <architecture_name> of <entity_name> is 之间声明 行和 begin VHDL 文件中的语句。这被称为架构的声明部分。 这篇博文是基本 VHDL 教程系列的一部分。 声明信号的语法是:signal <name> : <type>; 可以选择使用初始值声明信号:signal <name&
在上一教程中,我们了解了信号和变量之间的主要区别。我们了解到,信号比变量具有更广泛的范围,变量只能在一个进程中访问。那么我们如何使用信号在多个进程之间进行通信呢? 我们已经学会使用wait; 无限等待,wait for 等待特定的时间。 VHDL中还有两种等待语句。 这篇博文是基本 VHDL 教程系列的一部分。 Wait On 语句将暂停进程,直到指定信号之一发生变化:wait on <signal_name1>, <signal_name2> ...; Wait Until 语句将暂停,直到某个事件导致条件变为真:wait until <condit
在之前的教程中,我们使用了带有 Wait Until 语句的条件表达式。该表达式确保仅当两个计数器信号相等时才触发该过程。但是如果我们希望进程中的程序根据不同的输入采取不同的动作呢? If-Then-Elsif-Else 语句可用于在我们的程序中创建分支。根据变量的值或表达式的结果,程序可以采用不同的路径。 这篇博文是基本 VHDL 教程系列的一部分。 基本语法是: if <condition> then elsif <condition> then else end if; elsif 和 else 是可选的,elsif 可以多次使用。 <cond
您应该始终使用敏感度列表 触发生产模块中的流程。敏感度列表是一个进程的参数,它列出了该进程对其敏感的所有信号。如果任何一个信号发生变化,进程就会被唤醒,并执行其中的代码。 我们已经学会使用 wait on 和 wait until 用于在信号更改时唤醒进程的语句。但是,说实话,这不是我编写大部分流程的方式。 这篇博文是基本 VHDL 教程系列的一部分。 编写 VHDL 代码时,编写方式取决于代码是否仅打算在模拟器中运行。如果我正在编写模拟代码,就像我们在本教程系列中所做的那样,我总是 使用 wait 用于控制进程的语句。如果我正在编写我打算创建物理实现的代码,我从不 使用 wait 声
VHDL 中最常用的类型是 std_logic .将此类型视为单个位,即由单个物理线路承载的数字信息。 std_logic 比 integer 让我们对设计中的资源进行更细粒度的控制 type,我们在之前的教程中一直在使用。 通常,我们希望数字接口中的线具有值 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 的信号或变量 type 可以包含任意数量的 std_logic 元素。 这篇博文是基本 VHDL 教程系列的一部分。 声明 std_logic_vector 的语法 信号是:signal <
完成基本 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 <name> : signed(<N
VHDL 中的并发语句是架构内的信号分配,但在正常流程构造之外。并发语句也称为并发赋值或并发进程。 当您创建并发语句时,您实际上是在创建一个具有某些明确定义的特征的流程。并发语句总是等价于使用敏感度列表的过程,其中信号赋值运算符右侧的所有信号都在敏感度列表中。 当您想要创建导致分配单个信号的简单逻辑时,这些速记符号过程很有用。您可以直接在架构中简单地分配给目标信号,而不是输入带有灵敏度列表的完整过程结构和所有这些。 这篇博文是基本 VHDL 教程系列的一部分。 如果使用得当,代码的意图仍然很清楚。无需为您想要翻转的每一位创建一个流程。 运动 在本视频中,我们将学习如何创建并发语句
Case-When 语句将导致程序根据信号、变量或表达式的值从多个不同路径中取一个。它是具有多个 Elsif 的 If-Then-Elsif-Else 语句的更优雅的替代方案。 其他编程语言也有类似的结构,使用诸如 switch 之类的关键字 , 案例 ,或选择 .除此之外,Case-When 语句通常用于在 VHDL 中实现多路复用器。继续阅读,或观看视频了解如何操作! 这篇博文是基本 VHDL 教程系列的一部分。 Case-When 语句的基本语法是:case <expression> is when <choice
模块是 VHDL 代码的独立单元。模块通过 entity 与外界通信 . 港口地图 是模块实例化的一部分,您可以在其中声明模块的输入和输出应连接到哪些本地信号。 在本系列之前的教程中,我们一直在主 VHDL 文件中编写所有代码,但通常我们不会这样做。我们创建逻辑的目的是在 FPGA 或 ASIC 设计中使用它,而不是用于模拟器。 为在模拟器中运行而创建的 VHDL 模块通常没有输入或输出信号。它是完全独立的。这就是为什么我们设计的实体是空的。 entity之间一直没有任何东西 标签和 end entity; 标记。 这篇博文是基本 VHDL 教程系列的一部分。 没有任何输入或输出信号
创建模块是重用代码的好方法,但您通常需要在整个设计中具有较小变化的相同模块。这就是泛型和泛型映射的用途。它允许您在编译时使模块的某些部分可配置。 当我们想避免一遍又一遍地输入相同的值时,就会使用常量。它们可用于在编译时定义信号向量的位宽,甚至还可以映射到通用常量。常量可以在代码中的任何地方代替信号和变量,但是它们的值在编译后不能改变。 这篇博文是基本 VHDL 教程系列的一部分。 在上一教程中,我们创建了一个总线宽度为 8 位的 4 输入多路复用器模块。但是,如果我们还需要具有不同总线宽度的类似 MUX 怎么办?将代码复制粘贴到新模块中并更改数字的唯一解决方案是吗? 幸好没有。 可
VHDL