CrazyBingo

Chapter 17:国产FPGA之8051内核流水灯工程

0
阅读(5183)

第十七章

国产FPGA之8051内核流水灯工程

wps_clip_image-18394

经过前篇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就直接可以现成用了

wps_clip_image-20323

wps_clip_image-25673

(2)myPLL设置输出clkcpu为11.0592MHz,屏蔽其他时钟输出(等下我们在测试这个内核能活到多高的频率)

wps_clip_image-27718

二、mySystem 8051内核配置

(1)Wizard Manage 配置mySystem ip

wps_clip_image-25780

(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单片机,大相径庭)

wps_clip_image-23788

(3)选择8051内核的外设。。

wps_clip_image-22447

看到I2C,眼睛一亮,可以用来初始化摄像头,然后用FPGA来采样摄像头数据,一块IC搞定,一举两得,这个敬请期待哈哈。

Program file就是Keil生成的hex,这个hex必须放在工程目录src文件下面。文件名我们可以先输入“8051test.hex”,不管Keil生成什么,可以修改的嘛。

(4)什么写保护,初始化文件,先不管

其实这个初始化文件就是8051初始化hex,这根fpga设计中ram的初始化hex 雷同

wps_clip_image-25937

(5)Finish,如下:

wps_clip_image-2585

(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下的工程设计

在安装好Keil和京微雅格提供的库wps_clip_image-7270的前提下,进行下一步:

(1)新建工程,选择,如下

a) 打开Keil uVision4 ,但若干3,2,也可以。。他同时支持的

wps_clip_image-26242

wps_clip_image-15443

b) 选择Capital Micro Device(所以说让你先安装好这个库嘛)

wps_clip_image-14564

c) 选择AS1E5(没有AS2E,没办法,京微雅格没更新,但是内核都一样,放心用吧)

wps_clip_image-14803

d) 复试启动代码--那是必须的

wps_clip_image-16655

(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++);

}

}

wps_clip_image-882

wps_clip_image-4464

(3)设置相关选项

a) 设置目标板时钟为11.0592MHz

wps_clip_image-4021

b) 设置输出生成HEX 文件,如下所示(这个在Primance mySystem中要用到的HEX)

wps_clip_image-25886

c) 设置调试信息,如果你想要调试的话(这会在后面讲到)

wps_clip_image-22891

d) 设置include路径,不然就出错,如下:

wps_clip_image-12120

这不是我们的错,这绝对他软件bug,没有设置默认的include路径),指定到D:\Program Files\Keil\C51\INC\CapitalMicro下即可!(当然你也可以直接吧ASxE5.h拷贝到你的工程目录下,如果你想白费力的话)

wps_clip_image-9157

可见,里面包含了AS1E5.h,AS2E5.h等,你自己看着办哈哈!具体下

wps_clip_image-30674wps_clip_image-27617

wps_clip_image-29313

(4)全编译---在工程目录下会生成hex,copy到primance的src下

wps_clip_image-23527

wps_clip_image-30416

四、Primance最后设置

正如前面“二”中,如果你的mySystem中没设置好hex,这时候可以进行了。我当时直接设置好了,所以run project就可以了。

wps_clip_image-29685

wps_clip_image-22875

如上图,看到没有,没有使用一个LE,因为我只是用了8051内核和一个PLL,最后一步,Download!

wps_clip_image-32606

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逻辑有待增强诶。。。

Baidu
map