我来补下DIMM内存条的知识吧,如果不想了解那么细,直接看最后的答案吧。
首先DIMM条是用来连接CPU的,而这个总线的连接通道叫channel,一个channel实际上就有一个DDR RAM的控制器,比如下面这个图的I7就有两个channel即两个DDR RAM控制器, 而一个channel的位宽按x86 CPU的历史发展,目前是64。
既然一个channel上的位宽是固定的64,那么如何支持更大容量的DIMM条呢,主板上会从每个channel上分出两个DIMM条的插槽来(由DDR RAM控制器通过片选来区分,本质上是地址映射),那这个主板共计有4个DIMM条插槽。
主板的内存条DIMM插槽数量一般只有那么多,那要支持更大容量就只能到DMII条上想办法,而具体到DIMM条,为了扩容量,那么就再通过片选(实际上这里的片选是对过地址位来映射的)来扩,这个时候的位宽也只能是64,而这一个片选就是一个rank, 你内存条上的2Rx8 中的R就表示这根内存条上有根片选,有两组64位宽的内存颗粒(DDR4 DRAM IC),x8表示每颗内存颗粒的位宽是8bit.
那么最后来说说为什么你的内存条是72bit,而不是64bit 的。因为前面讲的是PC上的DIMM条,服务器上的DIMM条会多出8bt的ECC来,所以是72bit的。
更进一步,我们来看看你这颗DIMM条的datasheet中的原理图,你就明白了。
你在IPCORE的配置界面设置为100m,然后实际用90m的时钟没有问题。
我看了pyznq的代码,你用spi_open_device这上函数打开应该就可以实现slave,
spi spi_open_device(unsigned int device) {
int status;
u16 dev_id;
unsigned int base_address;
u32 control;
if (device < XPAR_XSPI_NUM_INSTANCES) {
dev_id = (u16) device;
}
else {
int found = 0;
for (u16 i = 0; i < XPAR_XSPI_NUM_INSTANCES; ++i) {
if (XSpi_ConfigTable[i].BaseAddress == device) {
found = 1;
dev_id = i;
break;
}
}
if (!found)
return -1;
}
status = XSpi_Initialize(&xspi[dev_id], dev_id);
if (status != XST_SUCCESS) {
return -1;
}
base_address = xspi[dev_id].BaseAddr;
// Soft reset SPI
XSpi_WriteReg(base_address, XSP_SRR_OFFSET, 0xA);
// Master mode
control = XSpi_ReadReg(base_address, XSP_CR_OFFSET);
// Master Mode
control |= XSP_CR_MASTER_MODE_MASK;
// Enable SPI
control |= XSP_CR_ENABLE_MASK;
// Slave select manually
control |= XSP_INTR_SLAVE_MODE_MASK;
// Enable Transmitter
control &= ~XSP_CR_TRANS_INHIBIT_MASK;
// Write configuration word
XSpi_WriteReg(base_address, XSP_CR_OFFSET, control);
return (spi) dev_id;
}
首先目录下的inst1_eval.do文件
注意下面的路径以及diamond的版本改为你自己的
然后启动modelsim键入以下命令进入仿真所在目录,注意替换成你对应的目录
然后键入以下命令运行仿真
可以看到仿真波形以及输出的调试信息