📄 cpld 与8051的总线接口vhdl源码.txt
字号:
cpld 与8051的总线接口VHDL源码
关于cpldbus51.VHD的说明:
很久之前我也想在网上找一份cpld与8051的总线方式接口的VHD源码,可是没有找到,
只好自己写咯,
若是只用cpld做51系统的地址译码,会用cpld的都能写出代码来,可是cpld与51的总线接口
由于涉及到
时序就没有那么容易了,我也是郁闷了近3天才把接口电路K掉的,它现在工作得很好。
----------------------------
cpldbus51.sch 系统连接图
cpldbus51.awf ACtive 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
------------------------------------------------------------------------
其它的就没什么的了,自己看代码吧。
--liandao
lycld@163.com
2003.06.02
-----------------------------------------------------------------------
--cpld 与8051的总线接口VHDL源码
--8051工作频率为11.0592MHZ CPLD(EPM7128SLC15)的工作频率为16.0000MHZ(有源晶振)
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity cpldbus51 is
port (
Clk: in STD_LOGIC; --Clock
16MHZ
Clr: in STD_LOGIC; --Clear
high
P0: inout STD_LOGIC_VECTOR (7 downto 0); --8052 Port 0
P2: in STD_LOGIC_VECTOR (7 downto 0); --8052 Port 2
ALE: in STD_LOGIC; --8052 ALE
-- PSEN: in STD_LOGIC; --8052\'Psen
-- INT0:out STD_LOGIC; --8052 INT0
Wr: in STD_LOGIC; --8052\'Wr
Rd: in STD_LOGIC; --8052\'Rd
---------------------------
Pina:out STD_LOGIC; ---output
-----------------------
nCS8255: out STD_LOGIC; --
select 8255
RamBank: out STD_LOGIC_VECTOR (1 downto 0);--Ram68128a
bank switch A15 A16
nCsFlashRam: out STD_LOGIC;
--select Flash Rom CE
FlashRomBank: out STD_LOGIC_VECTOR (2 downto 0) --Flash
Rom switch A14 A15 A16
);
end cpldbus51;
architecture cpldbus51 of cpldbus51 is
------------------------------------------------------------------------------
signal Addr: std_logic_vector(15 downto 0); --16bit address
signal ALE_Sample:STD_LOGIC;
signal RamBankReg: STD_LOGIC_VECTOR (1 downto 0);--Ram bank switch reg, 4
banks, 4*32K=128k bytes
signal FlashRomBankReg: STD_LOGIC_VECTOR (2 downto 0);--Flash Rom bank switch
reg, 8 banks, 8*16K=128k bytes
--Rd Sample
signal RdSample:std_logic; --for Rd Sample
--WR Sample
signal WrSample0:std_logic; --Wr for Sample
signal WrSample1:std_logic;
signal WrSample2:std_logic;
signal WrSample3:std_logic;
signal WrSample4:std_logic;
signal WrSample5:std_logic;
--Wr Sample output
signal Wr_en:std_logic;
--Clr Sample
signal ClrSample0:std_logic; -- for Clr Sample
signal ClrSample1:std_logic;
signal ClrSample2:std_logic;
signal ClrSample3:std_logic;
signal ClrSample4:std_logic;
signal ClrSample5:std_logic;
signal ClrSample6:std_logic;
signal ClrSample7:std_logic;
signal ClrSample8:std_logic;
signal ClrSample9:std_logic;
--Clr Sample output
signal Clr_en:std_logic;
------------------------------------------------------------------------------
--output Reg
signal PinaReg:std_logic;
begin
--------------------------------------------
--Sample Clr signal
ClrSample_p:process(Clk)
begin
if Clk\'event and Clk=\'1\' then
ClrSample0<=Clr;
ClrSample1<=ClrSample0;
ClrSample2<=ClrSample1;
ClrSample3<=ClrSample2;
ClrSample4<=ClrSample3;
ClrSample5<=ClrSample4;
ClrSample6<=ClrSample5;
ClrSample7<=ClrSample6;
ClrSample8<=ClrSample7;
ClrSample9<=ClrSample8;
end if;
end process;
---------------------------------------
--Clr Enable Signal
Clr_en_p:process(Clk)
begin
if Clk\'event and Clk=\'1\' then
if ClrSample0=\'1\' and ClrSample1=\'1\'
and ClrSample2=\'1\' and ClrSample3=\'1\'
and ClrSample4=\'1\' and ClrSample5=\'1\'
and ClrSample6=\'1\' and ClrSample7=\'1\'
and ClrSample8=\'1\' and ClrSample9=\'1\' then
Clr_en<=\'1\';
else
Clr_en<=\'0\';
end if;
end if;
end process;
------------------------------------------------
--sample ALE signal
ALE_p:process(Clk)
begin
if Clk\'event and Clk=\'1\' then
if Clr_en=\'1\' then
ALE_Sample<=\'0\';
else
ALE_Sample<=ALE;
end if;
end if;
end process;
-------------------------------------------------
--Address Latch
Address_p:process(Clk)
begin
if Clk\'event and Clk=\'1\' then
if Clr_en=\'1\' then
Addr<="0000000000000000";
elsif ALE_Sample=\'1\' then
Addr<=P2&P0;
end if;
end if;
end process;
-------------------------------------
--Sample Wr
WrSample_p:process(Clk)
begin
if Clk\'event and Clk=\'1\' then
if Clr_en=\'1\' then
WrSample0<=\'1\';
WrSample1<=\'1\';
WrSample2<=\'1\';
WrSample3<=\'1\';
WrSample4<=\'1\';
WrSample5<=\'1\';
else
WrSample0<=Wr;
WrSample1<=WrSample0;
WrSample2<=WrSample1;
WrSample3<=WrSample2;
WrSample4<=WrSample3;
WrSample5<=WrSample4;
end if;
end if;
end process;
---------------------------------------
--internal Wr enable signal
WrEn_p:process(WrSample0,WrSample1,WrSample2,WrSample3,WrSample4,WrSample5)
begin
if (WrSample0=\'0\' and WrSample1=\'0\'
and WrSample2=\'0\' and WrSample3=\'0\'
and WrSample4=\'1\'and WrSample5=\'1\')then
Wr_en<=\'1\';
else
Wr_en<=\'0\';
end if;
end process;
----------------------------------------
--Rd Sample
RdSample_p:process(Clk)
begin
if Clk\'event and Clk=\'1\' then
if Clr_en=\'1\' then
RdSample<=\'1\';
else
RdSample<=Rd;
end if;
end if;
end process;
-----------------------------------
--Flash Rom Chip select signal
CS_Flash_p:process(Addr)
begin
if Addr(15 downto 14)="10" then --Address:8000h--BFFFh
nCsFlashRam<=\'0\';
else
nCsFlashRam<=\'1\';
end if;
end process;
-----------------------------------
-- 8255 Chip select signal
cs8255_p:process(Addr)
begin
if Addr(15 downto 2)="11000000000000" then --C000h--C003h
nCS8255<=\'0\';
else
nCS8255<=\'1\';
end if;
end process;
-----------------------------------
-----------------------------------
-- Ram Bank Switch Reg
Ram_bank_p:process(Clk)
begin
if Clk\'event and Clk=\'1\' then
if Clr_en=\'1\' then
RamBankReg<="00";
elsif Addr="1100000000000100" and Wr_en=\'1\' then --
Address:C004h
RamBankReg<=P0(1 downto 0);
end if;
end if;
end process;
RamBank<=RamBankReg;
----------------------------------
----------------------------------
--Flash Rom Switch Reg
Flash_bank_p:process(Clk)
begin
if Clk\'event and Clk=\'1\' then
if Clr_en=\'1\' then
FlashRomBankReg<="000";
elsif Addr="1100000000000101" and Wr_en=\'1\' then --
Address:C005h
FlashRomBankReg<=P0(2 downto 0);
end if;
end if;
end process;
FlashRomBank<=FlashRomBankReg;
--------------------------------
--------------------------------
--Rd process
-- now just two in-builde register
Rd_p:process(RdSample,Addr,RamBankReg,FlashRomBankReg)
begin
if Addr="1100000000000100" and RdSample=\'0\' then --C004h
P0<="000000"&RamBankReg;
elsif Addr="1100000000000101" and RdSample=\'0\' then --C005h
P0<="00000"&FlashRomBankReg;
else
P0<="ZZZZZZZZ";
end if;
end process;
-------------------------------
Pina_p:process(Clk)
begin
if Clk\'event and Clk=\'1\' then
if Clr_en=\'1\' then
PinaReg<=\'0\';
elsif Addr="1100000000000110" and Wr_en=\'1\' then --
C006h
PinaReg<=P0(0);
end if;
end if;
end process;
Pina<=PinaReg;
end cpldbus51;
----------------------------------------------
--Pina是一个端口扩展,51中不是有Setb p1.0 Clr p1.0这样的语句吗?Pina就有类似这
样的特性
--置1 类似Setb p1.0
--Mov DPTR,#0C006H
--MovX @DPTR,#00000001B
--清0 类似Clr p1.0
--Mov DPTR,#0C006H
--MovX @DPTR,#00000000B
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -