首先,我应该承认我已经在altera 论坛(http://www.alteraforum.com/forum/showthread.php?t=40494)上提交了这个问题。我也在这里问,因为我认为它可能是完全不同的观众。如果这个重复的帖子违反任何堆栈溢出规则或礼仪,请告诉我,我会删除它。如果不是,我会用我在这里收到的任何答案更新论坛提交,反之亦然。
我正在尝试将来自 opencores 的 I2C 内核集成到我的 Cyclone IV 设备中。显然,我正在使用的版本应该只是放入 SOPC 并在连接到某些输出(alterawiki.com/wiki/I2C_(OpenCores))后工作。核心编译时没有错误或警告。
带有内核的 I2C 文档显示了 6 个相关寄存器依次寻址(PRERlo、PRERhi、CTR、TXR、RXR、CR、SR)。但是,当我尝试写入这些寄存器时,无论是从我的代码中还是在调试内存窗口中手动写入,都会被放入错误的地址。
为了调查这一点,我将寄存器设置为 VHDL 中的初始值,以在调试窗口中查看结果。这表明 TXR 和 CR 的寄存器地址不是文档中建议的。
Address 0 1 2 3
09866160 AA 00 00 00 -- PRERlo
09866164 00 00 00 00 -- PRERhi
09866168 BB 00 00 00 -- CTR
0986616C DD 00 00 00 -- RXR
09866170 FA 00 00 00 -- SR
09866174 CC 00 00 00 -- TX
09866174 EE 00 00 00 -- CR
但是,这很好,当我尝试写入地址 09866174 (TXR) 时,值将插入到 09866164 (PRERhi)。同样,当我写入 09866178 (CR) 时,该值将插入 09866168(CTR)。无论写入来自代码还是手动来自调试窗口,都会发生这种情况。这尤其令人困惑,因为在 VHDL 中写入这些寄存器可以正常工作。
#define IOWR(base,offset,value) __builtin_stwio ((unsigned int*)BASE + OFFSET, (DATA));
IOWR(I2C_MASTER_BASE, 5, 0x1D);
我也试图从信号抽头调试这个。但是,从未实现任何寄存器上的触发器。
如果有人能在这里指出正确的方向,我将不胜感激。
谢谢!
-update:我一直在使用 VHDL 版本的内核。但是,我决定暂时放弃并使用 Verilog 版本,当我连接它时,它几乎可以立即工作。我打算在我的应用程序完成后回到 VHDL 核心,然后再更新它。