许多 FPGA 设计使用嵌入式处理器进行控制。一个典型的解决方案涉及使用 Nios 等软处理器,尽管带有内置硬处理器的 FPGA SoC 也变得很流行。图 1显示了一个典型的 Altera FPGA 系统,它包含处理器和通过 Altera 的Avalon内存映射 (MM) 总线连接的混合外设 。这些处理器大大简化了终应用程序,但需要强大的编程背景和复杂工具链的知识。这会阻碍调试,特别是如果硬件工程师需要一种简单的方法来读取和写入外围设备而无需纠缠软件工程师。
图 1 使用 Avalon 内存映射总线连接的典型 Altera FPGA 系统
该设计理念使用 Altera 的SPI 从器件到 Avalon MM 桥接器来提供跳到 Avalon 总线上的简单方法。这种技术有两个优点:它不损害原来的系统设计,桥可以与嵌入式处理器共存。对于图 1所示的系统,SPI 桥允许工程师直接控制 LTC6948 小数 N PLL 的频率,设置 LTC1668 DAC 电压,从 LTC2498 ADC 读取电压,或从 LTC2983 读取温度,就像处理器可以。
Altera 为 SPI-Avalon MM 桥接器提供参考设计。不幸的是,文档充其量是稀疏的,并且使用 Nios 处理器作为 SPI 主机。这实际上违背了 SPI 桥的目的,因为 Nios 可以直接连接到 Avalon MM 总线。一个实用的 SPI 主控制器是凌力尔特的Linduino 微控制器,它是一个 Arduino 克隆,具有连接到 LT 演示板的额外功能。一项额外功能是电平转换 SPI 端口。当连接到电压低至 1.2V 的 FPGA I/O bank 时,这种电平转换功能特别有用。Linduino 固件可用于通过虚拟 COM 端口接受命令并将命令转换为 SPI 事务。
在对 Altera 示例设计(图 2的左侧)进行逆向工程后,开发了一个 Python 库来创建网桥可以接受的数据包。然后将这些数据包翻译成 Linduino 命令。然后,Python 脚本允许硬件工程师完全控制项目,而无需重新发明接口协议。LinearLabTools Python 文件夹中提供了一个示例 Python 脚本,用于控制 LTC1668 DAC 的数字模式发生器的频率。图 3显示了演示设置。
图 4显示了系统框图。请注意,数控振荡器 (NCO) 可由移位寄存器或 PIO 内核控制。包含移位寄存器用于调试,因为它允许直接控制 NCO。将 GPIO 线设置为高电平可启用 SPI-Avalon 桥接器,它进而控制 Avalon 总线上的 32 位 PIO 端口。然后 PIO 输出控制 NCO 频率。
图4 FPGA系统框图
在基本系统运行的情况下,可以将额外的外围内核连接到总线。为了设计系统,Altera 提供了一种名为 Qsys 的工具,它提供了一个 GUI 来将 IP 相互连接。Qsys 将 GUI 设计的系统(图 5)转换为 HDL。外设地址是完全可配置的。在这种情况下,PIO 设置为基址 0x0。
图 5 Qsys GUI
在 FPGA 中实现设计后,LinearLabTools 中提供的 Python 库包含两个与设计接口的函数:
transaction_write (dc2026, base, write_size, data)
transaction_read (dc2026, base, read_size)
这些函数的个参数是 Linduino 串行端口实例。第二个参数是外设在 Avalon 总线上的地址。这些函数分别接受和返回字节列表。这两个函数的编写是为了在写入和读取 IP 时提供灵活性。要为提供的示例设置 NCO,只需要transaction_write 函数。公式 1 用于确定调谐字。
要以 50MSPS 采样率将 NCO 设置为 1kHz,调整值为 85899 或 0x00014F8B,它作为四个字节的列表传递。因此,将 DAC 设置为 1kHz 的 python 代码是:
transaction_write (linduino_serial_instance, 0, 0, [0x0, 0x01, 0x4F, 0x8B])
图 6 Python Avalon 总线示例
图 6中的 Python 脚本说明了配置 NCO 的简单文本界面。重要提示:桥接器使用 SPI 模式 3。这被痛苦地确定为正确的 通过反复试验模式,并通过分析 Altera 示例中的 Nios 处理器的 SPI 接口进行验证。
该设计理念提供了在不接触嵌入式处理器的情况下控制系统的能力,允许硬件工程师在不打扰软件工程师的情况下推进项目,并且对硬件设计的影响。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !