Chapter 17:国产FPGA之8051内核流水灯工程
0赞第十七章
国产FPGA之8051内核流水灯工程
经过前篇8051内核的介绍,想必你应该知道这个国产FPGA 8051是什么个东西了吧。但是你还不会用哈哈哈。。其实我也是从小白开始的。。多看看手册 多尝试尝试就知道了。。其实fpga内的8051内核,我在国产FPGA开篇就讲过了。那个Oregano 8051ipcore,我已开始就讲过。他花掉了我们2000多个打样,每次编译速度还死慢死慢,要10多分钟,真的很不爽。
这次国产FPGA吧51内核直接放进去,让我来试试爽不爽O(∩_∩)O哈哈~
前面,我讲过了这几个部分:
(1)新建工程,编译调试
(2)简单的外部时钟+流水灯
(3)全局时钟网络与PLL的使用
(4)无源晶振+PLL,避免有源晶振的使用
相信如果你真的想学,到这里,简单的逻辑设计肯定没问题了,当然软件的使用也应该是没有问题了。。接下里,应该是你真正想学的东西了。看看这内部的8051内核+logic怎么个使用,怎么个性能?据说Astro II 8051内核能跑到150MHz(你们信不信,我反正无奈了)。。
总之50MHz是没问题了。。。。
预知8051内核怎么使用,且听如下Bingo一一道来:
一、准备工作
这次我们仍然使用无源晶振,暂且给8051内核11.0592MHz的时钟,这必须通过PLL设置MSS时钟。
(1)可以偷懒,将以前的工程目录下的src文件直接复制过来,建立新工程,并且导入这些线程的文件,那样myOscilator和myPLL就直接可以现成用了
(2)myPLL设置输出clkcpu为11.0592MHz,屏蔽其他时钟输出(等下我们在测试这个内核能活到多高的频率)
二、mySystem 8051内核配置
(1)Wizard Manage 配置mySystem ip
(2)Next
如下所所示:这个8051内核即mySystem 包含了32KB的SRAM,用来跑程序;以及4KB DPRAM,用来与logic数据交换。32KB的SRAM弱小的话,前面我们介绍过了,我们的ASOC板子上有一块256KB的8位的SRAM,他就是用来扩展8051的SRAM的。这个8051内核没有flash,不能保存hex。国产FPGA设计中,将hex保存到了fpga的内部的spi flash上面,之后通过映射配置8051的SRAM来实现内核的启动。(说白了,跟平时的8051单片机,大相径庭)
(3)选择8051内核的外设。。
看到I2C,眼睛一亮,可以用来初始化摄像头,然后用FPGA来采样摄像头数据,一块IC搞定,一举两得,这个敬请期待哈哈。
Program file就是Keil生成的hex,这个hex必须放在工程目录src文件下面。文件名我们可以先输入“8051test.hex”,不管Keil生成什么,可以修改的嘛。
(4)什么写保护,初始化文件,先不管
其实这个初始化文件就是8051初始化hex,这根fpga设计中ram的初始化hex 雷同
(5)Finish,如下:
(6)打开mySystem,复试引脚列表,例化mySytem,clkcpu为pll输出的MSS即8051内核的时钟,reset时钟有效,p0输出为流水灯,我按照数据手册重新进行了整理,如下:
//--------------------------------
//8051内核例化
mySystem u_mySystem
(
//8051 MSS时钟
.clkcpu (clkcpu), //8051内核时钟
//Fabric总结结构接口
.reset (1'b1), //始终有效
.clkcpuen (),
.clkperen (),
.ro (),
.swd (),
//通用IO口
.port0i (),
.port1i (),
.port2i (),
.port3i (),
.port0o (led_data), //P0端口为流水灯
.port1o (),
.port2o (),
.port3o (),
//SPI总线接口
.scki (),
.scko (),
.scktri (),
.ssn (),
.misoi (),
.misoo (),
.misotri (),
.mosii (),
.mosio (),
.mositri (),
.spssn (),
//emif外部存储接口
.clkemif (),
.memack (),
.memdatai (),
.memdatao (),
.memaddr (),
.memwr (),
.memrd (),
//4K的DPRAM 接口
.clkb (),
.cenb (),
.wenb (),
.db (),
.ab (),
.qb ()
);
(7)所有代码如下所示,下一步去Keil干活。。。
module logic_8051_led
(
//input clk, //10MHz 外部晶振
output [7:0] led_data //8位LED灯
);
//-----------------------------
//振荡器例化
wire clk_1106; //11.06MHz
myOscillator u_myOscillator
(
.clkout (clk_1106)
);
//-----------------------------
//PLL例化
wire clkcpu; //8051内核全局时钟
myPll u_myPll
(
.clkin (clk_1106), // Reference clock input.
.clkcpu (clkcpu) // Main clock output.
);
//--------------------------------
//8051内核例化
mySystem u_mySystem
(
//8051 MSS时钟
.clkcpu (clkcpu), //8051内核时钟
//Fabric总结结构接口
.reset (1'b1), //始终有效
.clkcpuen (),
.clkperen (),
.ro (),
.swd (),
//通用IO口
.port0i (),
.port1i (),
.port2i (),
.port3i (),
.port0o (led_data), //P0端口为流水灯
.port1o (),
.port2o (),
.port3o (),
//SPI总线接口
.scki (),
.scko (),
.scktri (),
.ssn (),
.misoi (),
.misoo (),
.misotri (),
.mosii (),
.mosio (),
.mositri (),
.spssn (),
//emif外部存储接口
.clkemif (),
.memack (),
.memdatai (),
.memdatao (),
.memaddr (),
.memwr (),
.memrd (),
//4K的DPRAM 接口
.clkb (),
.cenb (),
.wenb (),
.db (),
.ab (),
.qb ()
);
////------------------------------
////流水灯例化
//water_led u_water_led
//(
// .clk (clkout0),
// .led_data (led_data)
//);
endmodule
三、Keil下的工程设计
(1)新建工程,选择,如下
a) 打开Keil uVision4 ,但若干3,2,也可以。。他同时支持的
b) 选择Capital Micro Device(所以说让你先安装好这个库嘛)
c) 选择AS1E5(没有AS2E,没办法,京微雅格没更新,但是内核都一样,放心用吧)
d) 复试启动代码--那是必须的
(2)新建文件,复制如下代码,保存在目录下,并且加入到work中,如下:
#include
void Delay_ms(unsigned int cnt);
void main()
{
unsigned char i;
unsigned char led_data;
P0 = 0x00;
while(1)
{
for(i=0; i<8; i++)
{
led_data ++;
P0 = ~led_data; //低电平亮
Delay_ms(200); //延时200ms
}
}
}
//ms延时函数
void Delay_ms(unsigned int cnt)
{
unsigned int i;
while(cnt--)
{
for(i=0; i<255; i++);
}
}
(3)设置相关选项
a) 设置目标板时钟为11.0592MHz
b) 设置输出生成HEX 文件,如下所示(这个在Primance mySystem中要用到的HEX)
c) 设置调试信息,如果你想要调试的话(这会在后面讲到)
d) 设置include路径,不然就出错,如下:
这不是我们的错,这绝对他软件bug,没有设置默认的include路径),指定到D:\Program Files\Keil\C51\INC\CapitalMicro下即可!(当然你也可以直接吧ASxE5.h拷贝到你的工程目录下,如果你想白费力的话)
可见,里面包含了AS1E5.h,AS2E5.h等,你自己看着办哈哈!具体下
(4)全编译---在工程目录下会生成hex,copy到primance的src下
四、Primance最后设置
正如前面“二”中,如果你的mySystem中没设置好hex,这时候可以进行了。我当时直接设置好了,所以run project就可以了。
如上图,看到没有,没有使用一个LE,因为我只是用了8051内核和一个PLL,最后一步,Download!
Jtag仅供调试,而spi 可以下载到flash中去,可以配置fpga和MSS,你随意,哈哈搞定O(∩_∩)O哈哈~
五、最后的加速测试
手册说MSS 8051内核可以跑到150MHz,不过这是理论值还是实际值谁知道呢??我还是想试试看!!接下来我们配置PLL→run→Download→看流水灯死不死吧
11.0592MHz:废话,这个时候要死久没面子了
44.2400MHz:活着的。。。
88.4800MHz:活着的。。。
176.9600MHz:怎么还是活着的啊。。。
200.0000MHz:你怎么还没死啊
不测了。。。小逻辑高速测试没意义了。。。
看来这个51内核的确比FPGA逻辑块要霸气了。。。
国产FPGA,51内核还算可以,FPGA逻辑有待增强诶。。。