May 14
Situation: 用 EDK BSB Wizard 建 Spartan3A 的工程, NOR Flash 控制器的地址线接到了一个 Bus Split Utility 上。乍一眼看很正常,因为 Flash 的地址线就二十多根,而 XPS_MCH_EMC 的地址线定死了是32位,由于 MHS 的语法不支持分片功能,所以就要加个 Bus Split。但后来又发现不对劲了:一共32位地址线,为啥选出来第10到第30位呢?

Answer: 仔细看了 XPS_MCH_EMC 的 Datasheet,才发现关于地址、数据线的接法在 Datasheet 的17页到22页有详细讲解。

下面做个简单的解释:

1. EDK使用Big Endian,而Memory是Little Endian,所以连接时的映射顺序需要颠倒一下,所以你会看到MEM_A[10:30] = Flash_A[21:1]

2. 因为NorFlash可以是x8模式也可以是x16模式,这里使用了x16模式,因此Flash_A的最地位就不需要了,它此时用作了DQ[15]

3. EMC Core Datasheet的第18页上面的连接表格显示,我们连接Address总线时,应该把EMC的MEM_A(HAW-MAW-AS:HAW-AS-1) 连接到Flash的A(MAW-1 : 0)

4. Datasheet 第17页有对上面HAW MAW等数字的说明

引用
BN = bank number 我们的设计中只有一个bank
DN = device number within a bank.  我们一共只使用了一片Flash,所以 DN = 1
MW = Memory Subsystem Width。因为我们只用了一片Flash并没有拼宽度,所以MW和DW一样都是16
DW = Data Width。 Flash数据宽度16
MAW = Memory Address Width. Flash使用21位地址线
AU = Address Unit. 给一个地址得到的数据就是16位
AS = Address Shift =  log2((MW*AU/DW)/8) = log2(16*16/16/8)= 1
HAW = IP Address Width = 32


5. 根据以上数字,在第3点提到的地址线映射就应该是
MEM_A(HAW-MAW-AS:HAW-AS-1) = MEM_A((32 - 21 - 1):(32 - 1 - 1)) = MEM_A(20:30)
A(MAW-1 : 0) = A((21 - 1):0) = A(20:0)
Apr 15
如果你还没有注意到这些新工具,或许可以去看一下:

Xilinx Troubleshoot Center
Troubleshoot Content Portal列举了一些碰到疑难问题是需要检查的方面,比如Clocking Debug Guide等,还罗列了软件工具的Known issue list。
Configuration Problem Solver通过一系列问题检查Configuration过程中可能遇到的问题。

FPGA Design Best Practices
通过一系列视频教程告诉大家怎样才是一个好的设计,设计的时候需要考虑什么,改怎样利用时钟资源等等。
Tags:
Apr 9
在Xilinx Forum上有一则关于Bootloader的讨论,人们说为什么用了Bootloader以后interrupt就不起作用了呢?

很久之前回了贴,回头一看竟变成了热贴。跟人讨论了之后才发现我原来把EDK自带的bootloader和Xapp1053中的Bootloader搞混淆了。

还记得我在《跟着Xapp1053继续做》一文中种种Customize吗?在那时我就提过Xapp1053中的Bootloader是不能处理中断的,于是忙乎了老半天把中断的相关内容复制到BRAM中。

忙乎了老半天,发现标准的Bootloader其实并没有这个缺陷。

关键在于标准bootloader使用SREC保存ELF信息。而Xapp1053的实现则使用了二进制bin的方式。
SREC中同时包含地址信息和数据;
BIN文件中只有数据没有地址。

因此用标准bootloader解析SREC后复制到目标地址,就跟直接用XMD下载ELF是一样的结果;
而用Xapp1053 Bootloader时,目标地址是手动指定的,并不是ELF中原生的地址,这样就有可能产生错误了。

【参考资料】
SREC: http://en.wikipedia.org/wiki/SREC_(file_format)
Tags:
Apr 1
问题:通常我们设置breakpoint只能设置在某个函数或者某条指令上,那么我能不能在某个变量变化的时候让程序停下并让GDB指示现在停在哪里?

解决:通过XMD的Watch功能。

怎样使用watch功能?
- EDK --> MicroBlaze --> Configure IP --> Debug --> Number of Write/Read Address Watchpoints 设置为需要的数目,因为watch功能需要硬件支持
- 在使用GDB连接XMD并下载程序之后,在XMD输入相应的watch命令:
watch {r | w} <address> [<data>]

引用
Example Usage:
watch r 0x400 0x1234
watch r 0x40X 0x12X4
watch r 0b01000000XXXX 0b00010010XXXX0100
watch r 0x40X

说明:
Sets a read or write watchpoint at address. If the value compares to data, stop the processor.
•  Address and Data can be specified in hex “0x” format or binary “0b” format.
•  Don’t care values are specified using X.
•  Addresses can be only of contiguous range.
•  Default value of data is 0xXXXXXXXX. That is, it matches any value.

- 在GDB中Continue,程序就会在相应的地方停下,并在XMD窗口显示如下内容:
引用
XMD% watch w 0xbe4
XMD% Write Watchpoint 1 Hit, Processor Stopped at 0x000002e4


后续问题1: 这个watch和GDB图形程序中的Watch Expression有什么区别?
Watch Expression只能看到Expression的内容,不会在内容改变时将停下。

后续问题2: 怎样找到某个variable的地址?
方法1: 定义一个指针,把指针指向这个variable,就能得到地址了
方法2: 在GDB的Watch Experession中使用取地址符将这个variable的地址取出来。
方法3: 把这个变量定义为全局变量,那么地址在objdump的结果中就能直接找到。

【参考资料】
est_rm.pdf --> XMD章节
Mar 19
研究了一下Xapp925和EPC Core。一些笔记和问题。
分页: 4/28 第一页 上页 1 2 3 4 5 6 7 下页 最后页 [ 显示模式: 摘要 | 列表 ]