FPGA配置MC8051IP软核

最近整理东西,发现了这块吃灰已久的Altera FPGA开发板,恰好在网上看到FPGA搭建ARMx系列软核的文章,也想动手往这块板子配置ARMx软核,无奈的是针对Altera的FPGA配置ARM软核没有太多大佬跟进(有哪位dalao实现了请分享下…),Xilinx 系列的FPGA倒是有不少现成的方案来实现ARM软核。实际上进行ARM开发可以买正式的ARM芯片开发板的,而且ARM硬核性能比软核性能也强上不少,干嘛耗这功夫去配置ARM软核?只是觉得FPGA内部丰富的硬件资源不应该太浪费了, 能开发FPGA也能开发ARM,先前的文章称其为‘双剑合璧’。FPGA本就是为ASIC(专用集成电路)半定制电路而生,也广泛用于通信,军事,卫星行业。因其巨大的灵活性和可编程性越来越受到专用集成电路开发者的欢迎,以往的ASIC一旦设计成型便无法修改,这意味着后期ASIC几乎不可能升级和改善,毕竟是硬件成型怎么改。。而通过FPGA开发的ASIC就不一样了,后期可以任意对完成的ASIC进行二次,三次修改和更新,加入新的功能或删去不需要的模块。
想着既然我没法配置ARM软核了,那能不能配置其他的IP软核呢,我想到了DSP软核,NIOS软核(Altera官方软核),还有MC8051软核等等,最后我选择了51软核。
配置51软核成功后,fpga就可以当作51单片机来开发了。

一、
准备工具有:
1.Altera FPGA开发板 型号:EP4CE6F17C8
配置51软核过程中我发现配置成功与否和Altera FPGA型号关系不大,可以根据不同的AlteraFPGA型号来选定本工程的Device
FPGA配置MC8051IP软核_第1张图片
2.两根Mini USB接口的数据线
一根用于供电和串口通信,另一根用于配置程序。
3.USB Blaster下载器
4.Quartus II开发工具(13版本)
其他的Quartus II版本没有尝试过
5.MDK开发工具
用来开发51,keil4和keil5皆可
6.此FPGA的用户手册
用于为配置好的51软核连接好必要的外围线路,如时钟信号,复位信号,外设连线等。
FPGA配置MC8051IP软核_第2张图片
二、
接下来是配置51软核的网页教程和MC8051核的源文件。
网页教程
MC8051核源文件下载网址:
https://www.oreganosystems.at/products/ip-cores/8051-ip-core
FPGA配置MC8051IP软核_第3张图片
选中Source Files并下载。由于是国外站点,下载速度会稍慢些,文件大小约200KB+。

三、简单总结
FPGA配置51软核就是利用片内资源直接构建成51系统,这得益于FPGA实现了51系统内各个模块的构建,这才能将它们组合起来成为51系统。

因为下载的MC8051核源文件中片内ROM和RAM存储模块不符合我们的使用要求,因此Quartus II新建一个空白工程后需要利用Quartus II自带的MegaWizard Plug-In Manager工具构建符合要求的ROM和RAM存储模块,还有一个RAMX外置存储模块。
新建PLL锁相环模块用于给MC8051提供时钟信号,其中ROM、RAM和RAMX在一定范围内可以任意调整,PLL锁相环模块输出频率也可调,但是不能超出MC8051的规定最大容量和运行频率。其他的寄存器根据需要也可以增加,增加端口和引脚等,是不是越来越体现出FPGA硬件资源灵活的调整性?
原文的构建工程篇幅非常长,如果不想按部就班来构建工程,可以直接使用我完成好的工程文件。
只需要更改FPGA型号和更改引脚关联并重新编译综合就行。但FPGA型号最好是和我FPGA同一时代的系列产品,拿年代久远的型号不一定成功。
原文中没有给出完成的工程文件,我这边就打包在百度网盘了,方便有需要的人下载,附带有PL2303串口驱动程序。
百度网盘链接:
https://pan.baidu.com/s/1jb97JOUb1tUOoJdh_aIFbQ 提取码: shr1
四、成品
FPGA配置MC8051IP软核_第4张图片

FPGA配置MC8051IP软核_第5张图片
点亮LED、串口通信、数码管显示。这里51系统的外设是关联FPGA板载的LED,数码管。
FPGA配置MC8051IP软核_第6张图片
FPGA配置MC8051IP软核_第7张图片
51c程序代码:

#include
#include
#define uchar unsigned char
#define uint unsigned int
char xdata Xcount _at_ 0x500; //定义外部 RAM 变量
uchar led=0xff;  //LED 初化值
uchar counter; //500ms 计数器
//*************************** 延时程序
sbit p20=P2^0;
sbit p21=P2^1;
void delay(uint n)
{
	uint k;
	while(n--);
	{
		for (k=0;k<40000;k++)
		{;}
	}
}
//*************************** 定时器中断 0 程序
void timer0(void) interrupt 1
{
	ET0=0;  //关定时器 0 中断
	TR0=0;  //不允许定时器 0 计数
	TH0=0x8a; //重装定时初值(18MHz)
	TL0=0xd0;
	TR0=1;  //允许时器 0 计数
	if(++counter==35) //500ms 计数
	{
		/*counter=0;
		if(led==0xf0)
			led=0xff;
		else
			led<<=1; //左移 1 位	  */
	}
		//P1=led; //输出到 P0 口	
	ET0=1;
}
//*************************** UART 程序
char putchar(char c)
{
	SBUF = c;
	if (c == 'n') SBUF = 0x0d;
	while (!TI);
	TI = 0;
	return (c);
}
//*************************** 主程序
main()
{
	SCON = 0x50; //选择模式 1, 8 位数据格式,使能 UART
	PCON |= 0x80; //波特率加倍
	TMOD = 0x21; //定时器 0:模式 1;定时器 1:模式 2
	TH0=0x8a; //20ms 定时初值(18MHz)
	TL0=0xd0;
	TH1 = 0xF6; //定时器 1 自动装载初值, 时钟频率 18MHz, 0xF6(9600bps)
	TL1 = 0xF6;
	TR0=1; //允许定时器 0 计数
	TR1 = 1; //定时器 1 计数使能
	ET0=1; //允许定时器 0 中断
	EA=1; //开总中断
	Xcount=0;
	while(1)
	{

		P1=0xf1;
		p20=0;
		p21=1;
		P0=0xf0;

		printf("Xcount = %02bXn",Xcount++);

		printf("Hello World.n");
		delay(300000);
		delay(300000);
		delay(300000);
		delay(300000);

		p20=1;
		p21=0;
		P0=0xf0;

		delay(300000);
		delay(300000);		
		delay(300000);
		//P1=0xf0;
	}
}

五、
关于FPGA配置51软核,我只粗略介绍了一些内容,或许有不正确或不全面的地方,建议想专业学习FPGA开发的读者寻找更专业的书籍和教程资源来学习。

你可能感兴趣的:(FPGA,MC8051)