设计一种跳转到Avalon总线的简单方法

描述

许多FPGA设计使用嵌入式处理器进行控制。典型的解决方案涉及使用诸如Nios的软处理器,尽管具有内置硬处理器的FPGA SoC也变得流行。图1显示了典型的Altera FPGA系统,其中包含处理器和通过Altera的 Avalon 存储器映射(MM)总线连接的外设组合。这些处理器极大地简化了最终应用程序,但需要强大的编程背景和复杂工具链的知识。这可能会妨碍调试,特别是如果硬件工程师需要一种简单的方法来读取和写入外设而不会影响软件工程师。

图1使用Avalon内存映射总线连接的典型Altera FPGA系统

本设计方案使用Altera的 SPI Slave to Avalon MM Bridge 提供了一种跳转到Avalon总线的简单方法。这种技术有两个优点:它不会损害原始系统设计,并且桥接器可以与嵌入式处理器共存。对于图1中所示的系统,SPI桥允许工程师直接控制LTC6948小数N分频PLL的频率,设置LTC1668 DAC电压,读取LTC2498 ADC的电压或读取来自LTC2983的温度,就像处理器一样。

华强PCB

图2荧光笔+示例代码+反向工程= Python脚本(可缩放图像)

Altera为SPI-Avalon MM桥提供参考设计。不幸的是,文档最多是稀疏的,并使用Nios处理器作为SPI主控制器。这有效地破坏了SPI桥的目的,因为

华强PCB

Nios可以直接连接到Avalon MM总线。实用的SPI主控制器是凌力尔特公司的微控制器,它是一个Arduino克隆,具有与LT演示板接口的额外功能。一个额外的功能是电平转换的SPI端口。当电压低至1.2V的FPGA I/O bank接口时,这种电平转换功能特别有用。 Linduino固件可用于通过虚拟COM端口接受命令,并将命令转换为SPI事务。

对Altera示例设计进行逆向工程后(图2的左侧),开发了一个Python库来创建桥接器可以接受的数据包。然后将这些数据包转换为Linduino命令。然后,Python脚本允许硬件工程师完全控制项目,而无需重新构建接口协议。 LinearLabTools Python文件夹中提供了一个示例Python脚本,用于控制LTC1668 DAC的数字码型发生器的频率。图3显示演示设置。

图3DC2459 DAC演示板(R)插入FPGA板(L)

图4显示系统框图。注意,数控振荡器(NCO)可以由移位寄存器或PIO内核控制。包含移位寄存器用于调试,因为它允许直接控制NCO。将GPIO线设置为高电平可启用SPI-Avalon桥,后者又控制Avalon总线上的32位PIO端口。然后,PIO输出控制NCO频率。

华强PCB

图4FPGA系统框图

在基本系统运行的情况下,可以将额外的外围核心连接到总线。为了设计系统,Altera提供了一个名为Qsys的工具,它提供了一个GUI来连接IP。 Qsys将GUI设计的系统(图5)转换为HDL。外设地址是完全可配置的。在这种情况下,PIO设置为0x0的基数。

华强PCB

图5Qsys GUI

一旦设计在FPGA中实现,LinearLabTools中提供的Python库包含两个与设计接口的函数:

transaction_write(dc2026,base,write_size,data)

transaction_read(dc2026,base,read_size)

这些函数的第一个参数是Linduino串口实例。第二个参数是Avalon总线上的外设地址。函数分别接受和返回字节列表。编写这两个函数是为了在写入和读取IP时具有灵活性。要为所提供的示例设置NCO,需要transaction_write功能。公式1用于确定调谐字。

华强PCB

将NCO设置为1kHz使用50MSPS采样率时,调整值为85899或0x00014F8B,它作为四个字节的列表传递。因此,将DAC设置为1kHz的python代码是:

transaction_write(linduino_serial_instance,0,0,[0x0,0x01,0x4F,0x8B ])

华强PCB

华强PCB

图6Python Avalon总线示例

图6中的Python脚本说明了简单文本配置NCO的接口。一个重要的注意事项:桥接器使用SPI模式3.通过反复试验确定了正确的模式,并通过分析Altera示例中的Nios处理器的SPI接口进行了验证。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分