我最近刚刚开始学习VHDL多年后没有触及它。希望用它来开发一个带有各种传感器接口等的控制系统。我在嵌入式C方面非常称职,这是我迄今为止所有嵌入式项目的首选语言,这使得学习VHDL更令人沮丧。
基本上,我现在的问题,我认为是能够推进我的预期项目的最大障碍,是我不知道如何开发和合并一个模块,我可以将变量传递给并调用(就像C中的一个函数)执行一些任务, ie在4位7段显示器上显示0-9999整数。 我知道VHDL中有组件,但这似乎是一种执行一项任务的漫长的方式。有没有更好的方法呢?
在我看来,在完成所有数字教程之后,关于如何在VHDL中实际开发完整系统的信息存在巨大差距。
答案 0 :(得分:5)
编辑:进一步解释:底部的第三条评论。抱歉这个!
VHDL也有函数和程序,就像C一样。(好的,C调用它的程序" void函数"!)而且,就像C一样,你可以使用相同类型的顺序代码调用它们顺序代码构造(变量,循环,if语句,与C& s开关有一些相似之处的case语句),等等。
到目前为止,所有这些都是可以合成的;其他一些VHDL功能仅用于模拟(让您测试可合成代码)。因此,在模拟中,您可以 - 比如C - 打开,读取和写入文件,并使用指针(访问类型)来处理内存。我希望你能看出VHDL的这些部分为什么不可合成!)
但VHDL的不同之处在于,您需要一些额外的行来在流程中包装此顺序代码。在C中,这发生在你身上;一个典型的C程序只是一个过程(如果你想要多个进程,你必须求助于库或操作系统功能,如fork或pthreads)
但VHDL可以做得更多。您可以非常轻松地创建多个流程,将它们与信号互连,将它们包装为可重复使用的组件,使用" for ... generate"创建多个进程,等等。同样,所有可合成的:这会产生一些限制,例如在系统运行时无法更改硬件的大小(进程数)!
KEY:了解信号分配的规则而不是变量赋值。变量与C中的工作非常相似;信号不!他们所做的是提供安全,同步,进程间的通信,而不用大惊小怪。要了解如何,您需要了解"延迟分配",delta周期,等待语句以及进程如何暂停并再次唤醒。
你好像在这里问两个问题:
(1) - 我可以使用C中的功能吗?非常如此;通过在包中包装有用的类型和相关函数,过程并在多个设计中重用包,您可以做得比C更好。它有点像C ++可重用的类,有一些更强的点,有些更弱。
(2)我可以在VHDL中完全避免实体,架构和组件吗?您可以避免组件(搜索" VHDL直接实体实例化")但在某些时候您将需要实体和体系结构。
你可以逃脱的最少的事情是编写一个完成工作的过程,接收信号的输入(clk,计数)并通过其他信号传输到LED。
创建一个包含所有这些信号作为端口的实体,以及包含您的进程的架构,将其信号连接到端口。这很容易 - 它只是样板的东西。在FPGA上,您还需要定义这些端口与LED连接到的实际引脚之间的映射。合成它,你完成了,对吧? ..不太好。
创建另一个" testbench"没有外部端口的实体。这将包含您的实体(直接实例化),连接到其端口的一堆信号,以及驱动实体的输入端口并监视其输出端口的新进程。 (最佳做法是让测试平台自我检查,并在出现问题时断言!)通常" clk"来自它自己的单行程序,并为测试平台和实体提供时钟。
现在,您可以模拟测试平台,并在您想要的任何详细程度上观察您的设计(或不是!)。当它工作 - 合成。
编辑以获取更多信息:re:组件,程序,功能。
实体/组件是主要工具(如果您愿意,可以忽略组件,我稍后会处理实体)。
程序和功能通常在一个过程中协同工作。如果将它们重构为包,则可以在其他类似的进程中重用它们(例如,在相同的数据类型上操作)。一个常见的抽象是一种数据类型,加上在其上运行的所有函数和过程,包装在一个包中 - 这有点类似于C ++类。函数也可用于任何声明区域,如初始化程序(又名"工厂"软件术语模式)
但主要工具是实体。
这是嵌入式C程序员可能不熟悉的级别,因为C基本上停留在进程级别。
如果您已经编写了一个像SPI主站这样的物理块作为一个进程,那么您将把该进程包装在一个实体中。这将通过端口(在实体内部,像信号一样)与世界其他地方进行通信。它可以通过泛型参数化(例如,对于存储器大小,如果它是存储器)。该实体可以包含多个进程,其他实体和其他不适合整个过程的逻辑(例如,非时钟逻辑,其中进程被计时)
要创建系统,您将在"结构HDL代码"中互连实体。 (有用的搜索词!) - 可能是它们的整个层次结构 - 在顶级实体中。您通常会将其合成到FPGA中。
要通过仿真测试系统,您将在顶层实体(= FPGA)中嵌入另一个实体 - 测试平台 - 它没有外部端口。相反,FPGA的端口连接到测试平台内的信号。这些信号连接到......其中一些信号连接到其他实体 - 可能是存储器模型或SPI从属外设,因此您可以模拟SPI事务......其中一些是由测试平台中的一个过程驱动的,它为FPGA激励提供动力并检查其响应,检测并报告错误。
最佳实践涉及您创建的每个实体的测试平台 - 换句话说,单元测试。 SPI主设备可能连接到其他人的SPI从设备和测试过程,以启动SPI事务并检查正确的响应。这样,您可以在实体级别本地化和更正问题,而不是尝试从顶级测试平台进行诊断。
显示了一个基本示例here:
请注意,他通过位置关联和(稍后)命名关联显示端口映射 - 您也可以将这两种形式用于函数参数,如Ada,但不能使用仅允许位置关联的C.
什么" vhdlguru"并不是说命名关联是首选,因为位置关联是混乱和错误的丰富来源。
这开始有用了吗?
答案 1 :(得分:0)
基本上有两种可能性将信息传递给实体:
在运行时
实体使用在端口语句中定义的信号相互通信。为了更好的可读性,我建议在适当的地方使用std_logic_vector,numeric_std甚至更好的记录类型。见下面的链接。
在合成时
如果要在合成时将实体的参数设置为固定值(例如fifo的大小),则可能需要使用泛型语句。另见下面的链接。
我还建议您阅读本文。在应对超过一定复杂度的系统时,它帮助了我很多: A structured VHDL design method
答案 2 :(得分:0)
实体/组件与子程序(函数/过程)的一些简单概括。
当可重用代码块包含触发器(寄存器)时使用实体。
使用函数do进行计算。对于RTL代码,我将函数用于小型,可重用的组合逻辑。
我主要使用测试平台的程序。我使用过程将单个事务(波形或接口操作)应用于我正在测试的设计。对于测试平台,我进一步使用过程来封装常用的事务序列。