上述VHDL程序经MAX+PLUS II仿真器进行仿真,结果如图四:

如图,仿真中共有两次读操作。第一次操作时四次输入的地址值(十六进制)分别为:2C,4D,93,FD, 也即二进制的“00101100”;“01001101”;“10010011”;“11111101”,如前所述,此时希望得到的地址应该是“010011001101101100”,换算成16进制即为1336C,与仿真结果一致,同时,在地址线(flash_add)得到地址值一段时间(时间值由程序中counter值判断条件控制)之后,OE产生下降沿,与FLASH芯片读写时续的要求一致。可以验证,第二次结果也和预期一致。值得注意的是,在仿真中,方便起见CPLD的时钟输入并没有和实际硬件一致,故在实际应用中,程序里面“counter”后一次判断条件中的数值应该保证能够满足FLASH芯片的时值要求。此外,针对本试验,程序中只给出了OE的下降沿,实际应用中,需要根据需要给出WE的下降沿。
4.2单片机程序
void Readflash (unsigned int add)
{char temp1,temp2,temp3; //定义三个变量缓存分三次输入的地址
temp1=add; //低六位地址
temp1 &= 0x3f; //将高两位清零,作为第一次写P0口的值
temp2=add>>6; //中六位地址
temp2 &= 0x3f;
temp2 |= 0x40; //将高两位置为01,作为第二次写P0口的值
temp3=add>>12; //高六位地址
temp3 &= 0x3f;
temp3 |= 0x80; //将高两位置为11,作为第三次写P0口的值
P0=temp1; P0=temp2; P0=temp3; P2=0xc0; }
//写P0口四次,写完之后,AT29C020的数据端口即输出有效数据。
可见,函数Readflash的入口地址为FLASH芯片的18位地址,调用该函数后,FLASH芯片的输出为该地址对应的数据,即可进行下一步的操作。
5.实验结果
本例中,用单片机的P1口读出该数据,并用P2口输出到8个LED,以判断数据是否正确。经过多次试验,证明所读出的数据正确无误。(FLASH中已经在实验前写入数据)
6.小结
本文提出了一种用CPLD器件扩展51单片机寻址范围的思路,并通过实际验证可行。在实际应用中,可以考虑用CPLD通过单片机固定的操作时间来判断单片机的地址信号是所需地址空间中的哪一个部分,从而替代本例中所采用的标志位,在不损失时间的情况下进一步扩大寻址范围和应用的灵活性。
顶一下 0
踩一下
相关文章
用户评论
已有0位网友发表了看法



发表评论