第一次接触嵌入软核是公司一个项目中通信用422串口通信。其他的电路板的控制都是单片机,都好办。可是有一块板的控制虽然不太复杂,但必须用FPGA(并行处理能力单片机没法比啊),在通信上处理起来就有点麻烦。
毕竟FPGA是硬件,没有单片机的C语言程序的那种灵活性,而且单片机的串口是固定的,只要配置下寄存器就可以很容易的来进行通信。FPGA功能强大,肯定是可以写出来串口程序,但无疑会是很麻烦的。网上的FPGA的通信例程多数都是基于单字节收发的,可是项目里面的通信是10几个字节的(先发数据帧头,板选地址,中间几个字节的数据,最后一个校验字节),要想弄出来肯定要花不少时间。以前公司遇到这种情况采用过单片机+FPGA的组合,也就是单片机负责串口,然后再与FPGA进行通信,FPGA进行控制操作。这样电路板要复杂很多,很麻烦。51单片机+CPLD还好说,都是5V的高电平,要是FPGA就得电平转换下,或者换高级点的3.3V单片机。后来决定试试nios软核来尝试下FPAG的串口通信。
在网上找了些资料,感觉nios软核也没什么,就是在FPGA里面划出一部分资源来弄出了一个32位的单片机模块。单片机的串口我是再熟悉不过啦。于是在网上找资料,一步步在SOPC builder配置这个单片机,然后在NIOS EDS上面建立了一个工程来试一下。之前一切都还比较顺利,可是新建立的工程编译一下就提示onchip mem不够。百度了一下,多数人都说要+sdram才行,后来看到了特权同学的nios教程里面有关于缩减代码量的文章。然后一步步尝试了下,果然代码缩减到4.7k左右。不幸的是特权同学用的是cyclone II器件,分配了12k的onchip ram,我用的cyclone器件EP1C6Q240,貌似最多能分配4k的onchip ram,再多就报错了。无奈还是提示内存不足,何况代码还没写呢,写完了肯定更大。这个折腾我好长时间,我总觉得为了这么一个串口添加sdram或者换高级FPGA不值得。关键是altera官方的datasheet里面写了cyclone器件是支持nios软核的,上面没有说一定要外加sdram才能用啊,何况EP1C6Q240也不是cyclone里面最低端的。于是我各种百度,google,同时啃datasheet,各种尝试,终于找出了可以缩减代码量的方法。成功的将Hello World例程的代码缩减到1K出头,写完了所需要的代码编译也不到3K。这样就可以不用外接其他存储器,仅利用fpga的内部资源(实际上flash存储用了epcs4,但也是FPGA必须的部分)就成功在EP1C6Q240实现了NIOS软核进行串口通信。
下面是具体的设置方法。在SOPC builder里面添加 处理器,onchip memory,epcs controller,jtag uart systemid 等。Onchip memory 设置为4k。处理器选择占资源最少的那个(最左边的),Reset Vector 选epcs 那个,Exception Vector选onchip mem,debug level选择1(左边第二个).然后打开nios ii eds,新建工程,模板选Hello World那个就成(用alt main的模板貌似可以把代码缩减到更小)。然后右键工程名称(不带bsp的那个),nios II –>BSP Editor。具体设置看图吧。
把模板的程序改成我以前写过的串口程序,编译,没问题。结果如下:
这样设置可以让编译出来的代码比较小。我尝试用特权同学的fpga开发板,就是EP1C3T144的那个,做了一个简单的串口发送机,没用sdram就可以跑。Onchip mem设置为2k,flash 为epcs1,逻辑资源占用了70%多,Onchip mem将近2k。datasheet上面说的没错,果然cyclone器件是可以跑nios软核的,起码最小系统不用额外添加其他的存储器件。
用户377235 2012-8-27 09:33
看完大神的博文很有收获,博主很强悍啊,才工作了一年,就有这么多收获,这几篇看着不过瘾啊,期待看你更多博文,让哥们儿们也学点哈。
wxg1988 2012-8-10 21:32
用户1629256 2012-8-9 10:13
用户306090 2012-8-4 14:38
用户421471 2012-6-26 08:25