本帖最后由 不爱说话 于 2019-9-26 14:40 编辑
很久以前就想尝试国产FPGA了,但是一直没有动力去做,毕竟Xilinx、Altera都很好,价格也不贵(仅限低端型号)。但是贸易战升级美国断供芯片,让人们意识到了这种关系的不可靠。于是这促使我产生了做一块全国产芯片的FPGA实验板的想法,说干就干,经过前期的选型对比,最终选了以下这些国产芯片
1. FPGA: AG16KDDF256, 有16k逻辑单元兼容Altera Cyclone IV(EP4CE15),另外内置一颗Cortex-M3 MCU(最高频率200MHz),还有128Mb DDR SDRAM(最高频率200MHz);
2. DCDC电源:EA3036, 3路Buck Converter每路最大输出电流2A,转换效率大于85%,QFN20小尺寸封装;
3. USB转串口:CH340E,广泛使用的CH340的最新型号,小封装MSOP-10,内置晶振;
4. SPI Flash:Pm25L32,32Mb SPI NOR Flash;
然后就是画板,我使用的是KiCAD,这是一个开源EDA软件,在很多时候都可以代替Altium Designer。
板子打板回来,经过焊接调试目前电源,USB都OK。今天先写到这里。
------------------------------------------------ 分割线 --------------------------------------------------
板子焊好后,下一步就是验证FPGA了,我准备分三步走,首先写Verilog代码测试FPGA的逻辑功能,然后测试内置的Cortex-M3 MCU,最后写一个DDR控制器测试片内的16MB DDR内存。
这两天开始写简单的Verilog代码,测试一下FPGA的逻辑单元。最简单的当然是LED点灯了,我的程序功能大致是这样的:在FPGA内建立一个32位计数器,通过50MHz有源晶振提供计数时钟,两个LED连接计数器的某两位(bit14,bit16),LED会根据计数器值的变化而闪烁。
前面已经说了这个芯片兼容EP4CE15,开发工具自然是用Quartus II了,在QuartusII里面建立上述led测试工程,编译通过后需要使用AGM的Supra工具转换一下生成AG16K的烧写文件,接下来就可以使用USB-Blaster(没错就是Altera的下载线)连接JTAG就可以烧到板子上的SPI Flash或者直接下载到AG16K直接执行了。
下载成功后,我等待着LED的变化,但是一直没有亮,又试了几次下载成功(config pin接的LED亮了)但是就是没变化好像FPGA没有工作。最后没办法在线问了AGM的技术支持,发现可能是pin脚指定的问题,又反复改了几次,最后LED终于闪了。AGM FPGA点灯成功!
------------------------------------------------ 分割线 --------------------------------------------------
最近测试了AG16K的PLL和ROM功能,用Quartus II建立工程例化这些module全部可以工作。应该说AGM和Altera的兼容性还是很好的。
下面准备试试AG16K内置的MCU和DDR,这两部分就没有参考了,估计会花一些时间。
------------------------------------------------ 分割线 --------------------------------------------------
好久没更新状态了,因为我被卡住了。一直在测试这个FPGA的MCU,按照官方的文档和例程在FPGA工程里例化了Cortex-M3硬核,MCU点灯程序也编译成功,最后把程序烧到板子上,但是LED没亮,说明MCU没有运行。在这种状态下卡了2-3周,一度我都怀疑买来的芯片没有内置MCU。前两天仔细检查配置文件,发现一个管脚配置有问题,修改之后再测试,久违的led又闪起来了,MCU工作了!
下面我准备在MCU程序方面做点东西。我准备先做一个串口控制台功能,先试着在串口中断里对一个全局变量n自加1,每进一次串口中断就加1,可是打印出来确是n=0。这可是我在STM32上用了7年的code啊!刚有点进展,又搞的我很郁闷。
----------------------------------------------- 2019-9-26 -----------------------------------------------
现在我的MCU程序在这个FPGA上调好了,是一个串口命令行控制台,可以执行预先设置好的命令(比如控制LED,读写AHB总线寄存器,读写SPI Flash等等)。
下一步准备用Verilog写一个简单的AHB Slave register模块,用MCU命令读写试试。
一周热门 更多>