FPGA中“时间”和“空间”是两个比较重要的概念。所谓时间,多指系统运行速度;空间,大都关乎逻辑门、内存等资源的使用。在FPGA开发中,以时间换空间和以空间换时间是经常用到的。随着FPGA资源越来越丰富,人们似乎不再那么关心空间使用,更关心时间资源。内存空间的使用可以通过牺牲空间来提升系统运行速度,Cyclone V 拥有丰富的存储资源:
■ DDR3 SDRAM
■ Four 128-Mbyte (MB) device with a 16-bit data bus
■ Two 128-MB device with a 8-bit data bus
■ One 18-MB SSRAM
■ One 512-MB synchronous flash
通过向导,建立调用ROM的IP核:
Tools--MegaWizard Plug-In Manager:
FPGA大部分封装好的IP核都可以通过该方式调用,可以看出,可用的IP核还是很丰富的。
可以选择需要的存储类型,
按照向导一步步设置就可以,Cyclone V 新增M10K,比原来的M4K 使用更加便捷。
在设置过程中,需要添加.mif/.hex文件,该文件存储了rom表里面的数据,mif文件的获取可以通过C编程或Matlab编程获得:
以存储正弦波数据为例,可通过C语言编程获取,
#include "stdio.h" #include "conio.h" #include "math.h" main() { int i; float j; int y; FILE *fp; if((fp = fopen("rom.mif", "wa")) == NULL) exit(1); for(i = 0; i < 128; i++) { y = 128 * sin(j) + 128; fprintf(fp, "%d:%d;\n", i, y); j += 2 * 3.1416 / 128; } fclose(fp); printf("Hello, world\n"); getch(); }
Matlab编程参考如下:
width=10; %宽度是10,指数据位数
depth=1024; %深度是1024,指地址位数
index = linspace(0,pi/2,depth);
sin_a=sin(index); %归一化
sin_d=fix(sin_a*(2^width-1)); %量化
plot(sin_d);
axis([0,depth-1,0,2^width-1]);
%===============================
%¿ªÊ¼Ð´mifÎļþ
%===============================
addr=0:depth-1;
str_width=strcat('WIDTH=',num2str(width));
str_depth=strcat('DEPTH=',num2str(depth));
fid=fopen('d:\sin.mif','w'); %新建mif文件,存放任意位置和文件名任意
%如果只写文件名,则在当前目录下建立此文件
fprintf(fid,str_width);
fprintf(fid,';\n');
fprintf(fid,str_depth);
fprintf(fid,';\n\n');
fprintf(fid,'ADDRESS_RADIX=HEX;\n'); %%%下面的数据输入选择16进制,可根据情况改写
fprintf(fid,'DATA_RADIX=HEX;\n\n');
fprintf(fid,'CONTENT BEGIN\n');
fprintf(fid,'\t%X : %X;\n',[addr;sin_d]) %开始写数据
fprintf(fid,'END;\n');
fclose(fid);
在设置完之后,会看到向导生成的文件:
可以直接调用rom_inst.v里面的子模块:
sin_test rom_test_inst (
.address ( address_sig ),
.clock ( clock_sig ),
.q ( q_sig )
);
直接在主模块里面调用即可。
[ 本帖最后由 buer1209 于 2012-12-9 10:47 编辑 ]
|