cpld与8051的总线接口vhdl设计源码
cpld 与8051的总线接口VHDL源码
关于cpldbus51.VHD的说明:
很久之前我也想在网上找一份cpld与8051的总线方式接口的VHD源码,可是没有找到,只好自己写咯,
若是只用cpld做51系统的地址译码,会用cpld的都能写出代码来,可是cpld与51的总线接口由于涉及到
时序就没有那么容易了,我也是郁闷了近3天才把接口
威廉希尔官方网站
K掉的,它现在工作得很好。
----------------------------
cpldbus51.sch 系统连接图
cpldbus51.awf AC
tive HDL的波形文件
cpldbus51.VHD 接口VHLD源码
cpldbus51_TB.VHD接口的测试文件
MOVX_WR.gif
MOVC.gif
MOVX_RD.gif 我
仿真时使用的MOVX指令的时序图
-------------------------------------------------------------------------------------------
关于我的系统的说明:
8051工作于11.0592MHZ,RAM扩展为128KB的628128,FlashRom扩展为128KB的AT29C010A
128KB的RAM分成4个区(Bank) 地址分配为0x0000-0x7FFF
128KB的FlashRom分成8个区(Bank) 地址分配为0x8000-0xBFFF
为了使8051能访问整个128KB的RAM空间和128KB的FlashRom空间,在CPLD内建两个寄存器
RamBankReg和FlashRomBankReg用于存放高位地址
RamBankReg-->A15 A16
FlashRomBankReg-->A14 A15 A16
nCsFlashRam--> FlashRom的片选
CPLD使用EPM7128 时钟为16MHZ有源晶振
地址0xC000--0xC003为8255
8051的P0 P2 WR RD ALE 于CPLD连接
--------------------------------------------------------------------------------------------
要点:
A. 使用同步复位.
也许你也习惯于如下这样异步复位的描述:
.....
if Clr='1' then
FlashRomBankReg<="000"; --异步复位
elsif Clk'event and Clk='1' then
........
........
end if;
这样的描述是很好的,但前提是你的复位信号Reset没有毛刺干扰等,我一开始也是这样写我的威廉希尔官方网站
的,可是我写入CPLD做实际测试时,发现寄存器FlashRomBankReg老是会异常复位,我一开始以为是地址锁存
的问题,可是不是这样的,等我郁闷了近一个上午后我想到了使用同步复位试试.
首先使用Clk对复位信号采样,我估算了一下,8051的复位信号要求是高电平维持2个机器周期,2个机
器周期就是2*12=24个振荡周期,我对复位信号连续采样10次,若是一直为高电平,就产生片内复位使能信号.
其它片内寄存器以这个复位信号做同步复位.代码如下写:
.....
if Clk'event and Clk='1' then
if Clr_en='1' then --Clr_en为片内复位信号
FlashRomBankReg<="000"; --同步复位
elsif
........
........
end if;
end if;
这样之后经实际测试它工作得很好.
B.一切以时钟为基准,对其它输入信号做采样处理.
对WR RD ALE我做了采样,避免毛刺干扰.
C.8051对cpld写数据是在WR的低电平的中间写入cpld的内建寄存器.
对WR信号采样后,经过数次延时后产生使能信号WR_en