?? cpldbus51說明.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 + -