网站重新上线,多谢朋友们的关心
Jun
12
微处理器经常要与外部逻辑交互数据 - 可能是ISE里面自己写的逻辑,也可能是Sysgen中的逻辑,当然还可能是片外的逻辑。
交互数据有哪些方法?通常万变不离其宗
- Shared Memory: 双向给地址给数据/取数据
- FIFO:单向顺序给/取数据
- Register:单向选中后给/取数据
最常用的是Shared Memory。
FPGA内部有双口BRAM,两边都可以进行数据的读写,数据交互是双向的。
FIFO在一个模块往另一个模块灌数据时比较有用,优点是不用在意地址的产生。
因为Register无法缓存数据,必须一边给了数据后一边直接取走,所以交换数据时不常用。应用场合更适合控制寄存器。最常用的情况就是EDK系统要控制EDK外部的逻辑,比如给出一个使能信号等。
-----------<方法与操作的分割线>---------
EDK中的操作方法:
Shared Memory使用 XPS_BRAM_IF_CNTLR + BRAM_BLOCK。
XPS_BRAM_IF_CNTLR 接在 PLBv46 Bus 上,在Address页面分配相应的Size和Address。这里设的Size就是使用到的BRAM的大小。
BRAM_BLOCK 的 PORTA 接在 XPS_BRAM_IF_CNTLR 上,PortB Bus 设成 Not Connected,在Port页面将 PortB 所有的IO都 Make External。
FIFO 可以直接使用 FSL Core。
FSL 可以指定使用 BRAM 作为 FIFO,也可以指定使用 Slice 作为 FIFO。根据需求来选择。
Register 可以使用 GPIO Core。
C代码直接寻址然后做数据操作速度会比较快。用Driver中的函数来操作就会比较慢。
交互数据有哪些方法?通常万变不离其宗
- Shared Memory: 双向给地址给数据/取数据
- FIFO:单向顺序给/取数据
- Register:单向选中后给/取数据
最常用的是Shared Memory。
FPGA内部有双口BRAM,两边都可以进行数据的读写,数据交互是双向的。
FIFO在一个模块往另一个模块灌数据时比较有用,优点是不用在意地址的产生。
因为Register无法缓存数据,必须一边给了数据后一边直接取走,所以交换数据时不常用。应用场合更适合控制寄存器。最常用的情况就是EDK系统要控制EDK外部的逻辑,比如给出一个使能信号等。
-----------<方法与操作的分割线>---------
EDK中的操作方法:
Shared Memory使用 XPS_BRAM_IF_CNTLR + BRAM_BLOCK。
XPS_BRAM_IF_CNTLR 接在 PLBv46 Bus 上,在Address页面分配相应的Size和Address。这里设的Size就是使用到的BRAM的大小。
BRAM_BLOCK 的 PORTA 接在 XPS_BRAM_IF_CNTLR 上,PortB Bus 设成 Not Connected,在Port页面将 PortB 所有的IO都 Make External。
FIFO 可以直接使用 FSL Core。
FSL 可以指定使用 BRAM 作为 FIFO,也可以指定使用 Slice 作为 FIFO。根据需求来选择。
Register 可以使用 GPIO Core。
C代码直接寻址然后做数据操作速度会比较快。用Driver中的函数来操作就会比较慢。
Jun
11
XMD的Verify ELF功能在一次调试中帮了大忙。
出问题的情况很奇怪:
- 把Application Initialize to BRAM的时候程序工作不正常
- 用XMD再把程序dow一次,又正常了。
怀疑data2mem出问题,可以BRAM里面又是有值的。
于是怀疑这些值的正确性。用XMD的Verify ELF功能比较BRAM的内容和ELF的内容,结果发现的确有不相符的地方。那就确认是DATA2MEM的过程中出问题了。
此外,Verify ELF还可以用在Flash Writer烧写Flash后检查烧写是否正确:
- 在Bootloader完成,要进行PC指针跳转的最后一步设断点把程序停住,此时Flash中的SREC已经被Bootloader放到了DDR中
- 在XMD中运行Verify ELF检查DDR中的内容是否正确。
出问题的情况很奇怪:
- 把Application Initialize to BRAM的时候程序工作不正常
- 用XMD再把程序dow一次,又正常了。
怀疑data2mem出问题,可以BRAM里面又是有值的。
于是怀疑这些值的正确性。用XMD的Verify ELF功能比较BRAM的内容和ELF的内容,结果发现的确有不相符的地方。那就确认是DATA2MEM的过程中出问题了。
此外,Verify ELF还可以用在Flash Writer烧写Flash后检查烧写是否正确:
- 在Bootloader完成,要进行PC指针跳转的最后一步设断点把程序停住,此时Flash中的SREC已经被Bootloader放到了DDR中
- 在XMD中运行Verify ELF检查DDR中的内容是否正确。
Feb
27
PPC有Instruction Simulator叫做ISS,MicroBlaze其实也有。我将它们统称为EDK Instruction Simulator。以前经常和Virtual Platform的概念混淆起来。
Instruction Simulator: 精确到时钟周期,只能仿真指令,即没有外围设备,只支持64KB的RAM。不能printf,不能点LED。
Virtual Platform: Instruction Simulator + 外围设备模拟器。曾经支持uart等等外设。外设仿真模型是从HDL实现转换成C语言的。
Virtual Platform已经不再开发也不再支持。但是Instruction Simulator还是可以用。在XMD选择连接对象的时候,选择Simulator,然后就能连接到指令仿真器,并且可以用GDB跟踪调试。注意在Simulator中所有对外部访问的语句都将没有响应。
【REF】
est_rm.pdf --> XMD章节
Instruction Simulator: 精确到时钟周期,只能仿真指令,即没有外围设备,只支持64KB的RAM。不能printf,不能点LED。
Virtual Platform: Instruction Simulator + 外围设备模拟器。曾经支持uart等等外设。外设仿真模型是从HDL实现转换成C语言的。
Virtual Platform已经不再开发也不再支持。但是Instruction Simulator还是可以用。在XMD选择连接对象的时候,选择Simulator,然后就能连接到指令仿真器,并且可以用GDB跟踪调试。注意在Simulator中所有对外部访问的语句都将没有响应。
【REF】
est_rm.pdf --> XMD章节
Feb
11
EDK中Custom IP Core如果需要引用网表,那么就需要在BBD文件中中声明需要使用的网表名称。
常用的BBD文件有两种形式:
1. 在所有情况下均使用相同的网表
2. 根据不同请款使用不同的网表
在情况1-使用相同网表时,可以使用CIP Wizard的import功能自动生成BBD文件,并且CIP Wizard还会把网表文件放到相应的文件夹内(pcores//netlists)。
此时BBD文件的内容是
在情况2-需要EDK自动选择相应网表时,就需要手动编写/修改BBD文件了。
常用的BBD文件有两种形式:
1. 在所有情况下均使用相同的网表
2. 根据不同请款使用不同的网表
在情况1-使用相同网表时,可以使用CIP Wizard的import功能自动生成BBD文件,并且CIP Wizard还会把网表文件放到相应的文件夹内(pcores/
此时BBD文件的内容是
FILES
blackbox.ngc
blackbox.ngc
在情况2-需要EDK自动选择相应网表时,就需要手动编写/修改BBD文件了。
Feb
10
背景:在Xilinx EDK系统上如果要使用FPU,现在的选择是MicroBlaze自带的单精度FPU,给PPC405用的单精度FPU和给PPC440用的双精度FPU。也就是说,在PPC405和MicroBlaze上暂时还没有双精度FPU。
于是最近做了一个基于MicroBlaze FSL总线的“伪”双精度FPU。
FAQ:
Q1: 为什么这是一个“伪”FPU?
A1: 因为这不是一个集成的FPU,不能直接使用C语言的加减乘除直接来运算,编译器不直接支持,而是使用自带的driver来传递信息。
Q2: 它能跑多快的速度?
A2: 这不是一个最优化的FPU(速度、资源),而仅仅达到“可用”的程度。在Spartan3E上的测试结果是45MHz左右, 在Virtex4上测试结果是90MHz左右。它调用了CoreGen IP - Floating Point。IP Core已经配置为节省面积且重复使用资源。用户可以使用CoreGen自己设定Floating Point IPCore 的参数并将生成的网表替换netlists目录中的相应文件。
Q3: 我该怎样使用它?
于是最近做了一个基于MicroBlaze FSL总线的“伪”双精度FPU。
FAQ:
Q1: 为什么这是一个“伪”FPU?
A1: 因为这不是一个集成的FPU,不能直接使用C语言的加减乘除直接来运算,编译器不直接支持,而是使用自带的driver来传递信息。
Q2: 它能跑多快的速度?
A2: 这不是一个最优化的FPU(速度、资源),而仅仅达到“可用”的程度。在Spartan3E上的测试结果是45MHz左右, 在Virtex4上测试结果是90MHz左右。它调用了CoreGen IP - Floating Point。IP Core已经配置为节省面积且重复使用资源。用户可以使用CoreGen自己设定Floating Point IPCore 的参数并将生成的网表替换netlists目录中的相应文件。
Q3: 我该怎样使用它?








