分享经验 分享快乐
ModelSim技巧一则
[
2008/08/19 11:02 | by RickySu ]
2008/08/19 11:02 | by RickySu ]
在vsim后,run之前,输入命令
可以将所有信号的翻转情况记录下来,如果需要在Wave窗口再添加信号,就不用restart,添加信号,然后再重新run了。
引用
log -r /*
可以将所有信号的翻转情况记录下来,如果需要在Wave窗口再添加信号,就不用restart,添加信号,然后再重新run了。
EDK works with Sysgen
[
2008/08/04 17:08 | by RickySu ]
2008/08/04 17:08 | by RickySu ]
同时使用EDK和Sysgen,有两种流程:
1、在Sysgen中做hw co-sim;
2、用Sysgen生成pcore然后手动添加到EDK工程中。
参考文档:
- Sysgen User Guide --> Hardware/Software Co-Design --> Design with Embedded Processors and Microcontrollers
- API Documents (在生成PCORE的src目录中)
数据交互方法:
- From/To Registers
- From/To FIFO
- Shared Memory
使用Shared Memory时,记得TestBench中的Shared Memory要设置成 "owned and initialized elsewhere",否则等于两处地方都放置了同样名字的Shared Memory,会产生冲突。
API使用方法
参考API文档,下面有例子。基本流程是:
1、在Sysgen中做hw co-sim;
2、用Sysgen生成pcore然后手动添加到EDK工程中。
参考文档:
- Sysgen User Guide --> Hardware/Software Co-Design --> Design with Embedded Processors and Microcontrollers
- API Documents (在生成PCORE的src目录中)
数据交互方法:
- From/To Registers
- From/To FIFO
- Shared Memory
使用Shared Memory时,记得TestBench中的Shared Memory要设置成 "owned and initialized elsewhere",否则等于两处地方都放置了同样名字的Shared Memory,会产生冲突。
API使用方法
参考API文档,下面有例子。基本流程是:
引用
xc_iface_t *iface; //初始化interface
xc_from_reg_t *fromreg_gray; //初始化register
xc_to_reg_t *toreg_red, *toreg_green, *toreg_blue; //初始化register
xc_shram_t *shram; //初始化shared memory
xc_to_fifo_t *tofifo; //初始化fifo
// initialize the software driver
xc_create(&iface, &RGB2GRAY_PLBW_ConfigTable[0]);
// obtain the memory locations
xc_get_shmem(iface, "result", (void **) &fromreg_gray); //Register 中间引号中的字符串是Sysgen中起的名字
xc_get_shmem(iface, "red", (void **) &toreg_red);
xc_get_shmem(iface, "green", (void **) &toreg_green);
xc_get_shmem(iface, "blue", (void **) &toreg_blue);
xc_get_shmem(iface, "cap_ram0", (void **) &shram); //Shared Memory
xc_get_shmem(iface, "fifo", (void **) &tofifo); //Shared Memory
//写Shared Memory
for (i=0;i<10;i++) {
xc_write(iface, xc_get_addr(shram->addr, i), (const unsigned) i+60);
}
//写Register
xc_write(iface, toreg_red->din, 2);
//读 Register
xc_read(iface, fromreg_result->dout, &result);
xc_from_reg_t *fromreg_gray; //初始化register
xc_to_reg_t *toreg_red, *toreg_green, *toreg_blue; //初始化register
xc_shram_t *shram; //初始化shared memory
xc_to_fifo_t *tofifo; //初始化fifo
// initialize the software driver
xc_create(&iface, &RGB2GRAY_PLBW_ConfigTable[0]);
// obtain the memory locations
xc_get_shmem(iface, "result", (void **) &fromreg_gray); //Register 中间引号中的字符串是Sysgen中起的名字
xc_get_shmem(iface, "red", (void **) &toreg_red);
xc_get_shmem(iface, "green", (void **) &toreg_green);
xc_get_shmem(iface, "blue", (void **) &toreg_blue);
xc_get_shmem(iface, "cap_ram0", (void **) &shram); //Shared Memory
xc_get_shmem(iface, "fifo", (void **) &tofifo); //Shared Memory
//写Shared Memory
for (i=0;i<10;i++) {
xc_write(iface, xc_get_addr(shram->addr, i), (const unsigned) i+60);
}
//写Register
xc_write(iface, toreg_red->din, 2);
//读 Register
xc_read(iface, fromreg_result->dout, &result);
1. 在EDK里怎么用malloc?要不要include什么头文件?
- 不需要include。直接用就可以了。malloc是包含在lib里的。
2. malloc格式?
double *p = malloc( sizeof *p ); /* 不推荐用 sizeof( double ) */
free(p);
//according to http://cpp.ga-la.com/html/3/3/0510/7.htm
3. 潜在问题?
Xilinx AR30878 - reset后malloc返回null
其实如果malloc后,如果已经free了,那么再怎么reset也无妨。问题只是malloc后没有free,导致.bss内容变化,但reset cpu不重写BRAM/DDR RAM中的.bss,因此需要一段代码在启动时重新加载.bss - 这样.bss就需要先存储到non-volatile中了。很麻烦吧:)
- 不需要include。直接用就可以了。malloc是包含在lib里的。
2. malloc格式?
double *p = malloc( sizeof *p ); /* 不推荐用 sizeof( double ) */
free(p);
//according to http://cpp.ga-la.com/html/3/3/0510/7.htm
3. 潜在问题?
Xilinx AR30878 - reset后malloc返回null
其实如果malloc后,如果已经free了,那么再怎么reset也无妨。问题只是malloc后没有free,导致.bss内容变化,但reset cpu不重写BRAM/DDR RAM中的.bss,因此需要一段代码在启动时重新加载.bss - 这样.bss就需要先存储到non-volatile中了。很麻烦吧:)
Ricky版Tips of Xilinx v0.06
[
2008/07/11 09:37 | by RickySu ]
2008/07/11 09:37 | by RickySu ]
此篇宗旨:因为还写了一篇文章叫《Ricky版FPGA常见问题(FAQ)》,内容相近却不同,难免混淆。此篇仅写一些Xilinx提供的一些不引人注意却又有用的小工具和某个工具的属性。
1、coe文件模板
经常会不知道coe文件怎么写,怎么生成,语法怎么回事。原来在%Xilinx%/coregen/data目录下,有coe文件模板,各种作用下的模板,比如DA FIR, BlockRAM等等
2、控制XST插入buffer的方法
1、用buffer_type约束。具体使用方法在XST User Guide
2、手动插入BUFG,然后设置允许使用BUFG的数量,那么手动插入的将拥有高优先级而先占用了BUFG。
3、同时更改所有IO管脚的电平标准
要更改所有IO Pin的IO Standard,可以打开PACE,选择所有管脚(通过shift或ctrl键多选),按右键,Create Constraints,然后自己选需要的吧:)
4、子模块的网表分别存在多个目录怎么办
当子模块以网表形式提供时,NgdBuilder (Translate)会搜索工程目录下的edn, ngc等网表文件。
如果存在子目录中,在Translate属性中的Macro Search Path填写目录名。
如果有多个子目录,不是在Macro Search Path中填写多个目录名,而要在下面一条填写其他Translate option的地方写上 -sd -sd 。每个-sd后只能写一个目录名。这一点在dev.pdf中提到。
5、Timing Analyzer中的Tioop之类的delay type的图形解释?
Tioop之类的延时信息首先是在Datasheet中有详细定义。一般在DC and Switching Characteristics章节中。Datasheet会列出定义以及各个速度等级的延时。
另外在ISE的安装目录doc\usenglish\help\delay_types中还有图形化的解释,只不过不是所有器件都有。
6、xps_archiver 打包用于重建工程的文件
http://www.rickysu.com/bo/post/202/
1、coe文件模板
经常会不知道coe文件怎么写,怎么生成,语法怎么回事。原来在%Xilinx%/coregen/data目录下,有coe文件模板,各种作用下的模板,比如DA FIR, BlockRAM等等
2、控制XST插入buffer的方法
1、用buffer_type约束。具体使用方法在XST User Guide
2、手动插入BUFG,然后设置允许使用BUFG的数量,那么手动插入的将拥有高优先级而先占用了BUFG。
3、同时更改所有IO管脚的电平标准
要更改所有IO Pin的IO Standard,可以打开PACE,选择所有管脚(通过shift或ctrl键多选),按右键,Create Constraints,然后自己选需要的吧:)
4、子模块的网表分别存在多个目录怎么办
当子模块以网表形式提供时,NgdBuilder (Translate)会搜索工程目录下的edn, ngc等网表文件。
如果存在子目录中,在Translate属性中的Macro Search Path填写目录名。
如果有多个子目录,不是在Macro Search Path中填写多个目录名,而要在下面一条填写其他Translate option的地方写上 -sd
5、Timing Analyzer中的Tioop之类的delay type的图形解释?
Tioop之类的延时信息首先是在Datasheet中有详细定义。一般在DC and Switching Characteristics章节中。Datasheet会列出定义以及各个速度等级的延时。
另外在ISE的安装目录doc\usenglish\help\delay_types中还有图形化的解释,只不过不是所有器件都有。
6、xps_archiver 打包用于重建工程的文件
http://www.rickysu.com/bo/post/202/
xps_archiver
[
2008/07/11 09:28 | by RickySu ]
2008/07/11 09:28 | by RickySu ]
原来还有这么个小工具,可以把XPS所管理的文件备份并压缩成zip文件,包含重建一个EDK工程所需要的最少量的文件,方便重建工程、版本管理、工程分享。
叫啥名 - xps_archiver
在哪里 - EDK安装目录下bin/nt/
都谁有 - 我看到9.1 9.2 10.1都有,8不知道
怎么用 - 打开cmd,cd到工程目录,xps_archiver -o xx.zip xx.xmp
产生啥 - archiver目录下产生xx.zip
叫啥名 - xps_archiver
在哪里 - EDK安装目录下bin/nt/
都谁有 - 我看到9.1 9.2 10.1都有,8不知道
怎么用 - 打开cmd,cd到工程目录,xps_archiver -o xx.zip xx.xmp
产生啥 - archiver目录下产生xx.zip





