?? 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 + -