在 VHDL 中通过 UART 加载的值数组

Array of values loaded through UART in VHDL

我正在使用 VHDL 开发一个包含乘法矩阵的项目。我希望能够使用 UART 将数据从 PC 加载到 FPGA 上的阵列。我只是在 VHDL 中迈出更大的第一步,我不确定我的态度是否正确。

我想声明一个整数信号数组,然后实现 UART 以从 PC 接收数据并将其加载到这些信号中。但是,我不能为此使用 for 循环,因为它将被合成以并行加载数据(这是不可能的,因为值将使用串行端口一个接一个地从 PC 传来。)并且因为矩阵可能有各种大小,为了一个一个地分配信号,我需要编写很多特定的代码(这对我来说似乎是一种不好的做法。)

使用信号数组并通过 UART 将数据加载到这些信号的想法是否可以实现?如果我的方法完全错误,我该如何实现?

你想要的是可行的,但你可能需要设计一种硬件监视器来充当 UART 和存储(你的整数信号数组)之间的中介。此硬件监视器将解释来自 UART 的命令并在您的存储中执行 read/write 操作。它将有一个与存储器的接口,另一个与 UART 的接口。您将必须定义一种协议,其中包含命令的语法和每个命令的操作序列。

示例:监视器等待来自 UART 的命令。第一个接收到的字符表示它是读 (0) 还是写 (1)。接下来的四个字符是目标地址,最低有效字节在前。如果命令是读取,监视器将读取存储中指定地址的数据并将其发送到 UART,一次一个字节,最低有效字节在前。如果命令是写入,则地址后跟要写入存储中指定地址的数据,最低有效字节在前,监视器等待数据接收并将其写入存储。

可选地,监视器可以在每个命令的末尾发送一个退出状态字节以指示潜在的错误(协议错误、未映射的地址、只读区域中的写入尝试...)

当然,根据您应用的特点,您可能会定义完全不同的协议,或更简单或更复杂,但原理是相同的。

所有这些通常都在软件中实现,并在 CPU 上运行,该 CPU 将 UART 作为外围设备并在其内存中存储 space。但是如果你没有 CPU...

警告:这很复杂。 UART 本身非常复杂。如果您是 VHDL 初学者,不确定是否应该从这里开始。

您的方法并非完全错误,但您使用面向软件的方式来表达这一点,这表明您缺少基础知识。具有深厚软件背景的人倾向于从编程语言的角度思考,而不是从他们想要实现的实际 FPGA 特定结构的角度思考。如果你想成功地进行 FPGA 设计,忘掉这一点很重要。

根据我刚才写的内容,您应该考虑在哪种类型的 FPGA 结构中存储数据。速度、资源和功率要求决定了这一选择。一种合适的数据存储方式是在单个块 RAM 或 LUTRAM 的阵列中。这两种结构都可以通过在硬件描述语言中使用数组类型的信号来推断,这就是为什么我说你并没有完全偏离轨道。请查阅您的综合工具手册,找到有关如何推断这些结构的模板。另一种方法是使用供应商 IP 块或直接实例化原语,但我认为这两种方法都比较笨拙。

要考虑的重要参数是需要存储的字总数、字的大小和每个时钟周期的 read/write 操作数。对于每个周期的更多读取次数,必须使用存储器阵列,因为大多数 FPGA 存储器每个周期仅支持两次读取。