我最近刚刚开始学习VHDL多年后没有触及它.希望用它来开发一个带有各种传感器接口等的控制系统.我在嵌入式C方面非常称职,这是我迄今为止所有嵌入式项目的首选语言,这使得学习VHDL更令人沮丧.
基本上,我现在的问题,我认为是能够推进我的预期项目的最大障碍,是我不知道如何开发和合并一个模块,我可以将变量传递给并调用(如C)中的函数执行一些任务,即在4位7段显示器上显示0-9999整数.我知道VHDL中有组件,但这似乎是一种执行一项任务的漫长的方式.有没有更好的方法呢?
在我完成所有数字教程之后,在我看来,如何在VHDL中实际开发完整系统的信息存在巨大差距.
编辑:进一步解释:底部的第三条评论.抱歉这个!
VHDL也有函数和程序,就像C一样.(好吧,C调用它的程序"void functions"!)而且,就像C一样,你可以使用相同类型的顺序代码构造(变量,循环,来自顺序代码)来调用它们. if语句,与C的开关有一些相似之处的case语句,等等.
到目前为止,所有这些都是可以合成的; 其他一些VHDL功能仅用于模拟(让您测试可合成代码).因此,在模拟中,您可以 - 比如C - 打开,读取和写入文件,并使用指针(访问类型)来处理内存.我希望你能看出为什么VHDL的这些部分不可合成!)
但VHDL的不同之处在于,您需要一些额外的行来在流程中包装此顺序代码.在C中,这发生在你身上; 一个典型的C程序只是一个过程(如果你想要多个进程,你必须求助于库或操作系统功能,如fork或pthreads)
但是VHDL可以做得更多.您可以非常轻松地创建多个流程,将它们与信号互连,将它们包装为可重复使用的组件,使用"for ... generate"创建多个流程,等等.同样,所有可合成的:这会产生一些限制,例如在系统运行时无法更改硬件的大小(进程数)!
KEY:理解信号分配的规则而不是变量赋值.变量与C中的工作非常相似; 信号不!他们所做的是提供安全,同步,进程间的通信,而不用大惊小怪.要了解如何,您需要了解"推迟分配",增量循环,等待语句以及进程如何暂停并再次唤醒.
你好像在这里问两个问题:
(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事务并检查正确的响应.这样,您可以在实体级别本地化和更正问题,而不是尝试从顶级测试平台进行诊断.
请注意,他通过位置关联和(稍后)命名关联显示端口映射 - 您也可以将这两种形式用于函数参数,如Ada,但不能使用仅允许位置关联的C.
什么"vhdlguru"没有说的是命名关联是首选,因为位置关联是混乱和错误的丰富来源.
这开始有所帮助吗?