网站重新上线,多谢朋友们的关心
Jul
14
xbd文件的理解
psf_rm.pdf阅读摘要
1. XBD MHS MPD文件很多内容是相关的
2. XBD里的三种模块 - IO_INTERFACE, IO_ADAPTER, FPGA
其中IO_INTERFACE是平时最常用的接口,指类似UART等和FPGA外界有联系的接口
IO_ADAPTER指类似util_reduced_logic等用来在FPGA和IO_INTERFACE之间转接信号的模块
3. XBD参数传递
XBD文件可以生成MHS文件。在XBD文件中指定的数值可以传递到MHS中。指定PARAMETER,和IO_IS这个参数关系很大。IO_IS可以理解为一个用来传递参数的变量。在XBD中定义这个变量,在MPD中引用这个变量,以生成MHS中PATAMETER所对应的值。
IO_TYPE - 如果xps_gpio和opb_gpio都有同样的IO_TYPE,那么xbd怎么决定用哪个?
4. 添加自己的IP
在XBD中添加一个IO_INTERFACE,指定IO_TYPE为CustIP的MPD文件中定义的IO_TYPE,于是自己的IP就能在BSB Wizard中看见了。在这之前,需要把CustIP放到edk_user_repositoyr或者EDK/hw下的目录,但是要删掉__MpdDataBase.txt,否则XPS就不去扫描这个文件夹中新添加的Core了。
一个问题:BSB会列举IO_TYPE相同的所有IP Core,但是9.2以后的BSB就不认OPB和PLB34的Bus拉。
psf_rm.pdf阅读摘要
1. XBD MHS MPD文件很多内容是相关的
2. XBD里的三种模块 - IO_INTERFACE, IO_ADAPTER, FPGA
其中IO_INTERFACE是平时最常用的接口,指类似UART等和FPGA外界有联系的接口
IO_ADAPTER指类似util_reduced_logic等用来在FPGA和IO_INTERFACE之间转接信号的模块
3. XBD参数传递
XBD文件可以生成MHS文件。在XBD文件中指定的数值可以传递到MHS中。指定PARAMETER,和IO_IS这个参数关系很大。IO_IS可以理解为一个用来传递参数的变量。在XBD中定义这个变量,在MPD中引用这个变量,以生成MHS中PATAMETER所对应的值。
IO_TYPE - 如果xps_gpio和opb_gpio都有同样的IO_TYPE,那么xbd怎么决定用哪个?
4. 添加自己的IP
在XBD中添加一个IO_INTERFACE,指定IO_TYPE为CustIP的MPD文件中定义的IO_TYPE,于是自己的IP就能在BSB Wizard中看见了。在这之前,需要把CustIP放到edk_user_repositoyr或者EDK/hw下的目录,但是要删掉__MpdDataBase.txt,否则XPS就不去扫描这个文件夹中新添加的Core了。
一个问题:BSB会列举IO_TYPE相同的所有IP Core,但是9.2以后的BSB就不认OPB和PLB34的Bus拉。
Jul
11
Linker Script在Embedded系统中很常用,也很重要,主要用来指定哪些数据到底存在哪里,在哪里执行。因为嵌入式系统有各种不同的Memory,不像桌面系统,基本都是从硬盘Load,从内存运行。
网上没有找到非常权威又易读的中文教材,于是就只好东拉西扯东拼西凑出一个对Linker Script大概的印象。
资料一:
英文版 - http://www.bilmuh.gyte.edu.tr/gokturk/introcpp/gcc/ld_toc.html
部分中文版 - http://hi.baidu.com/sohunini/blog/item/60fa1f0f60b200286159f361.html
内容是很好,只是例子分析不够详细,很多地方还需要多看几遍或者结合实例。
资料二:Xilinx Xapp 642
讲到的问题都分析清晰,知其然知其所以然。当然这篇文档不是专门讲LD的,因此不全面也是理所应当。
一些主要的概念:
1. 输入输出
SECTIONS
{
.text : { *(.text)}
}
第一个.text代表输出段,大括号里的内容表示输入内容。星表示所有的目标文件,需要的话可以指定.o文件。括号中的.text表示前面指定的输入文件中的.text段。这样,整句话的意思就是把所有目标文件中的.text集合起来,组成输出文件的.text段。
2. 位置计数器
3. Symbol
4. LMA和VMA
LMA - Load Memory Address - 一个段应该从哪里加载
VMA - Virtual/Logical/Run-time Memory Address - 一个段在什么地址运行
一般情况下是一样的。如果需要把一个段从Flash中Copy到RAM中,然后再在RAM中使用,那么LMA应该是Flash地址,VMA是RAM中的地址。
5. 指定LMA
AT命令
6. 指定VMA
用LinkerScript来解决问题
问题1:让程序从Flash中运行,需要RW的段拷贝到RAM中
- Xapp983和Xapp642-Example1就做了这样的功课
问题2:把某个函数放在BRAM中运行以加快运行速度(比如有实时要求的中断程序),别的仍然在DDR RAM中运行
- 像Xapp642-Example2中给函数加__attribute (( section(".bram"))) 属性,或者在LinkerScript中指定一个中断程序的.oe文件输出到一个单独的段——反正目的就是把需要加速的程序独立出来,然后用bootloader把这个段放在BRAM中运行。
例子:
extern void foobar (void) __attribute__ ((section ("bar")));
.bar : { *(.bar)} > bram
附段名
.text - Program Code (RO)
.bss - Uninitialized Data (RW)
.data - Initialized Data (RW)
.rodata - Constants (RO)
网上没有找到非常权威又易读的中文教材,于是就只好东拉西扯东拼西凑出一个对Linker Script大概的印象。
资料一:
英文版 - http://www.bilmuh.gyte.edu.tr/gokturk/introcpp/gcc/ld_toc.html
部分中文版 - http://hi.baidu.com/sohunini/blog/item/60fa1f0f60b200286159f361.html
内容是很好,只是例子分析不够详细,很多地方还需要多看几遍或者结合实例。
资料二:Xilinx Xapp 642
讲到的问题都分析清晰,知其然知其所以然。当然这篇文档不是专门讲LD的,因此不全面也是理所应当。
一些主要的概念:
1. 输入输出
SECTIONS
{
.text : { *(.text)}
}
第一个.text代表输出段,大括号里的内容表示输入内容。星表示所有的目标文件,需要的话可以指定.o文件。括号中的.text表示前面指定的输入文件中的.text段。这样,整句话的意思就是把所有目标文件中的.text集合起来,组成输出文件的.text段。
2. 位置计数器
3. Symbol
4. LMA和VMA
LMA - Load Memory Address - 一个段应该从哪里加载
VMA - Virtual/Logical/Run-time Memory Address - 一个段在什么地址运行
一般情况下是一样的。如果需要把一个段从Flash中Copy到RAM中,然后再在RAM中使用,那么LMA应该是Flash地址,VMA是RAM中的地址。
5. 指定LMA
AT命令
6. 指定VMA
用LinkerScript来解决问题
问题1:让程序从Flash中运行,需要RW的段拷贝到RAM中
- Xapp983和Xapp642-Example1就做了这样的功课
问题2:把某个函数放在BRAM中运行以加快运行速度(比如有实时要求的中断程序),别的仍然在DDR RAM中运行
- 像Xapp642-Example2中给函数加__attribute (( section(".bram"))) 属性,或者在LinkerScript中指定一个中断程序的.oe文件输出到一个单独的段——反正目的就是把需要加速的程序独立出来,然后用bootloader把这个段放在BRAM中运行。
例子:
extern void foobar (void) __attribute__ ((section ("bar")));
.bar : { *(.bar)} > bram
附段名
.text - Program Code (RO)
.bss - Uninitialized Data (RW)
.data - Initialized Data (RW)
.rodata - Constants (RO)
Jul
11
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中了。很麻烦吧:)
Jul
11
原来还有这么个小工具,可以把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
Jul
8
Xilinx TFT/VGA controller core (not official release)
plb_tft_cntlr_v1_00_c -- PLB34, use it for EDK 9.1 or below
http://www.xilinx.com/products/boards/ml405/files/ml405_emb_ref_ppc_81.zip
plbv46_tft_cntlr_v1_00_a -- PLB46, use it for EDK 9.2 or higher
- Xapp738
https://secure.xilinx.com/webreg/clickthrough.do?cid=103956
注意:
1. 提供的时钟tftClk频率应该是25MHz
2. Memory控制器
EDK9.1中使用PLB DDR需要开启Burst和Cacheline操作,否则会有两行内容相同的情况。MPMC不需要。
如果使用MPMC,最好给这个Core单独占用一个MPMC端口,因为数据流量较大。不过在简单的情况下也可以只使用一条PLB Bus。
MPMC需要将Native Width设置为64,因为TFT Core的Native Width是64。
3. DCR
DCR控制需要新建DCR bus和PLB2DCR bridge,地址范围4k,[20-29]位将映射为DCR Address。
连接PLB2DCR的输出sys_dcrclk到tft core的plb_dcr_clk端口
通过PLB2DCR桥来读写DCR就跟操作普通Memory一样方便,不需要用特殊的指令。
通过DCR写入Base Address可以快速切换需要显示的地址。
EDK 9.2中 Spartan系列的IP Catalog不会显示出PLB46_DCR Bridge。需要将这个Core复制到工程pcores目录并修改mpd文件的ARCH_SUPPORT_MAP属性,以支持Spartan3,比如:
4. ODDR
由于这个Core是为Virtex4设计的,使用了Spartan系列不支持的ODDR。在Port到Spartan3ADSP的过程中,将plbv46_tft_cntlr_v1_00_a\hdl\verilog\tft_if.v中158行的ODDR改为
这只是根据原文件改动最小的一种改法。其实对于VGA来说,由于不需要这个信号,完全可以将它去掉。
5. 该Core的Datasheet在UG082中。
plb_tft_cntlr_v1_00_c -- PLB34, use it for EDK 9.1 or below
http://www.xilinx.com/products/boards/ml405/files/ml405_emb_ref_ppc_81.zip
plbv46_tft_cntlr_v1_00_a -- PLB46, use it for EDK 9.2 or higher
- Xapp738
https://secure.xilinx.com/webreg/clickthrough.do?cid=103956
注意:
1. 提供的时钟tftClk频率应该是25MHz
2. Memory控制器
EDK9.1中使用PLB DDR需要开启Burst和Cacheline操作,否则会有两行内容相同的情况。MPMC不需要。
如果使用MPMC,最好给这个Core单独占用一个MPMC端口,因为数据流量较大。不过在简单的情况下也可以只使用一条PLB Bus。
MPMC需要将Native Width设置为64,因为TFT Core的Native Width是64。
3. DCR
DCR控制需要新建DCR bus和PLB2DCR bridge,地址范围4k,[20-29]位将映射为DCR Address。
连接PLB2DCR的输出sys_dcrclk到tft core的plb_dcr_clk端口
通过PLB2DCR桥来读写DCR就跟操作普通Memory一样方便,不需要用特殊的指令。
通过DCR写入Base Address可以快速切换需要显示的地址。
EDK 9.2中 Spartan系列的IP Catalog不会显示出PLB46_DCR Bridge。需要将这个Core复制到工程pcores目录并修改mpd文件的ARCH_SUPPORT_MAP属性,以支持Spartan3,比如:
引用
OPTION ARCH_SUPPORT_MAP = (virtex2p=PREFERRED, virtex4lx=PREFERRED, virtex4sx=PREFERRED, virtex4fx=PREFERRED, virtex5lx=PREFERRED, virtex5sx=PREFERRED, virtex5fx=PREFERRED, spartan3=PREFERRED, spartan3a=PREFERRED, spartan3adsp=PREFERRED, spartan3e=PREFERRED)
4. ODDR
由于这个Core是为Virtex4设计的,使用了Spartan系列不支持的ODDR。在Port到Spartan3ADSP的过程中,将plbv46_tft_cntlr_v1_00_a\hdl\verilog\tft_if.v中158行的ODDR改为
引用
ODDR2 TFT_CLK_ODDR (.Q(TFT_LCD_CLK), .C0(clk), .C1(~clk), .CE(1'b1), .R(1'b0), .D0(1'b0), .D1(1'b1), .S(1'b0));
这只是根据原文件改动最小的一种改法。其实对于VGA来说,由于不需要这个信号,完全可以将它去掉。
5. 该Core的Datasheet在UG082中。









