library IEEE;
7 n3 j' P5 j7 h. @; L- A8 o$ U9 a# Juse IEEE.std_logic_1164.all;
! k6 W# V8 N* r2 U
use IEEE.std_logic_unsigned.all;
5 |! ^. ^5 h" }& E7 b- xentity cpldbus51 is
0 i' n' _! [1 iport (
`, @! ?) c9 R* u& F: z Clk: in STD_LOGIC; --Clock 16MHZ
* q. M" }+ m- a. \. Y Clr: in STD_LOGIC; --Clear high
; V7 Y4 q$ P7 \7 }( {8 i0 `, N2 y, K1 _ P0: inout STD_LOGIC_VECTOR (7 downto 0); --8052 Port 0
7 N2 F5 t8 z& G' }
P2: in STD_LOGIC_VECTOR (7 downto 0); --8052 Port 2
9 |. N6 ]& x: x3 U9 Q z8 i- V/ H9 t ALE: in STD_LOGIC; --8052 ALE
6 J# n+ T! C! w# s7 l" @* ^) G-- PSEN: in STD_LOGIC; --8052'Psen
2 [- C' y# ]- a: X3 A% [
-- INT0

ut STD_LOGIC; --8052 INT0
5 t T. J/ v/ M Wr: in STD_LOGIC; --8052'Wr
0 T% G6 F" S0 \: }* U; ~% C0 F
Rd: in STD_LOGIC; --8052'Rd
- y# E0 s9 l) W. j- {
---------------------------
" F1 b1 l: u* f3 t
Pina

ut STD_LOGIC; ---output
% s9 ~9 D5 {) {7 Z9 w' Y1 g+ s-----------------------
& V$ n4 e$ H7 w
nCS8255: out STD_LOGIC; --select 8255
6 [: X/ e8 d0 K; M" Y8 K
RamBank: out STD_LOGIC_VECTOR (1 downto 0);--Ram68128a bank switch A15 A16
2 V, i5 g% p4 L* t
nCsFlashRam: out STD_LOGIC; --select Flash Rom CE
/ }4 \0 ?- [0 o# r! i7 w* E
FlashRomBank: out STD_LOGIC_VECTOR (2 downto 0) --Flash Rom switch A14 A15 A16
9 _( B: O, j: m9 d, x' L# p6 ?; o5 j0 U' Y
);
6 I! ^% d: c" Mend cpldbus51;
* [1 }% X1 v' [9 i# |3 z8 o& M) r* A
architecture cpldbus51 of cpldbus51 is
0 y+ A3 E5 \9 v7 [2 t% M( v------------------------------------------------------------------------------
/ d' v8 Z/ ~; r/ d7 `+ N6 y3 qsignal Addr: std_logic_vector(15 downto 0); --16bit address
o7 }6 @5 v! H8 e# x; w, w
signal ALE_Sample:STD_LOGIC;
9 p* c. |% m- @) y" T
signal RamBankReg: STD_LOGIC_VECTOR (1 downto 0);--Ram bank switch reg, 4 banks, 4*32K=128k bytes
8 L( R7 T7 n" U; E
signal FlashRomBankReg: STD_LOGIC_VECTOR (2 downto 0);--Flash Rom bank switch reg, 8 banks, 8*16K=128k bytes
0 Y# F; T5 C8 D/ Q$ M--Rd Sample
" O, H: t+ e' G! a: Jsignal RdSample:std_logic; --for Rd Sample
4 M; O/ N5 _2 F$ }1 m1 x% I. \# o0 Y+ i9 V
--WR Sample
5 [8 N( v+ K7 K+ K1 m* Wsignal WrSample0:std_logic; --Wr for Sample
& q4 k5 `: F0 _, H5 v# R! t Dsignal WrSample1:std_logic;
+ L& g6 c2 A; `% ]- i5 ~9 t# N7 o6 O0 R
signal WrSample2:std_logic;
" t$ j, W6 o0 S. L
signal WrSample3:std_logic;
: Z" j- j- h Rsignal WrSample4:std_logic;
: [0 j5 q. ^, D
signal WrSample5:std_logic;
; F# C3 D, C) m; _3 H7 r% p1 P--Wr Sample output
4 }/ X, n8 }" n& |9 l
signal Wr_en:std_logic;
: A; O/ U3 y% z( d" i/ U# e
--Clr Sample
- W9 _% s& f( F) n$ \2 csignal ClrSample0:std_logic; -- for Clr Sample
0 o# {: V! n1 y8 _, T
signal ClrSample1:std_logic;
5 P' B" G6 W5 f B
signal ClrSample2:std_logic;
8 z, i n! N" ^% Y+ m+ J7 R) ~signal ClrSample3:std_logic;
2 t0 ]: ?8 j7 X8 L5 G% P! t0 k
signal ClrSample4:std_logic;
0 p; {6 u C' w: Rsignal ClrSample5:std_logic;
/ [: q. t# G& ]0 G) U
signal ClrSample6:std_logic;
- v% @9 E+ x( Y/ |9 |/ j
signal ClrSample7:std_logic;
6 N% e9 c* M6 |1 l- Q$ m8 u3 K
signal ClrSample8:std_logic;
5 |4 O- |2 g' L7 o
signal ClrSample9:std_logic;
, M; P7 v& M: f5 `+ ~
--Clr Sample output
' G8 A' J4 m2 }& X" `( n5 E0 Csignal Clr_en:std_logic;
' A, J5 @, H* p7 P/ J; F------------------------------------------------------------------------------
# h/ ?4 |) x$ I4 ?7 M N
--output Reg
1 s, d. f* ~ l! r& g, Bsignal PinaReg:std_logic;
2 h2 ^, r) D% x# }/ S# ~2 i4 P4 obegin
6 X+ F9 ~) u% b `3 K# g--------------------------------------------
2 u* J+ e5 B$ ^& Y/ o# u( P1 _) p8 w--Sample Clr signal
0 h- n$ [% I3 [$ nClrSample_p:process(Clk)
! L. \5 ?* C- Z
begin
2 q( f9 ~6 C8 n9 ]if Clk'event and Clk='1' then
, T1 o% s i% n5 q
ClrSample0<=Clr;
5 M Z, Z4 Q& T& F3 r4 Z/ J$ D
ClrSample1<=ClrSample0;
+ Q9 E& K+ {' s. U. Z ClrSample2<=ClrSample1;
. c' M. j! \( L# c! j$ d% Q( q5 Q" g" X- U
ClrSample3<=ClrSample2;
1 ^8 Z5 W3 _ v* ?
ClrSample4<=ClrSample3;
; ]( K+ i! P$ E1 r& P: {; T ClrSample5<=ClrSample4;
% M# r% r! {2 `$ t6 u: | ClrSample6<=ClrSample5;
4 \( v1 ~8 \4 R4 ~# { ClrSample7<=ClrSample6;
" C+ M9 @9 V5 k) Q( _, x: P
ClrSample8<=ClrSample7;
( e4 @5 Y6 S" S* F- I/ ]+ q/ h
ClrSample9<=ClrSample8;
2 N# v0 [" c/ Q" ~! n2 n! ]
end if;
% R& v) F/ B+ J: k8 Z
end process;
: a) h8 N) I _/ Y) n" v- C% [---------------------------------------
H6 S3 z6 B+ O--Clr Enable Signal
/ Q3 a# C9 P* X2 d9 b9 g# d: OClr_en_p:process(Clk)
( ]5 I) g+ w# {begin
5 f+ U0 O3 A# K: g1 p; X! r! Z. ?
if Clk'event and Clk='1' then
4 E( R" ~+ z, w. N$ M2 d" h
if ClrSample0='1' and ClrSample1='1'
' ]0 Z5 G3 @9 l# \- F8 Y
and ClrSample2='1' and ClrSample3='1'
: i; w: j6 [- }: R. _0 V, o9 l
and ClrSample4='1' and ClrSample5='1'
~7 n o+ B4 x4 G6 Q and ClrSample6='1' and ClrSample7='1'
8 B" Q! ]. `2 n; p
and ClrSample8='1' and ClrSample9='1' then
$ a' X8 L% [" G: p V Clr_en<='1';
* j4 z: Y* J5 n! _
else
4 B8 g! e2 n( W Z$ M, I
Clr_en<='0';
q) d( {$ r, Y
end if;
z E* h! j3 v6 h! t0 E
end if;
9 {7 {; R5 H! b5 Lend process;
) }, e* t. j" B. P! x, T1 K------------------------------------------------
) {/ A% Z: W% _) T
--sample ALE signal
e! S5 f# a) D8 U0 v# Z( v
ALE_p:process(Clk)
6 n5 X& x6 g: O1 s' i
begin
6 I( T( o: Z! e$ a' Z K
if Clk'event and Clk='1' then
# x- c* {9 `& G# z if Clr_en='1' then
% j B! D* c* V' C ALE_Sample<='0';
4 p/ ~, z1 T4 u9 w3 @) G5 g
else
; K6 E; s# B( G$ q ALE_Sample<=ALE;
6 Z- W) G1 ?# M: d end if;
$ J1 ]/ P3 d3 b" E4 K9 q& q o
end if;
8 o' A. p) ?9 D$ S! g
end process;
0 C) J- K! N. h P( P: g: V9 ?" ? W-------------------------------------------------
+ l' L& i8 f& r: b2 o8 ~: P--Address Latch
" E4 }4 e1 \0 \
Address_p:process(Clk)
( |) I5 q8 |2 v% g$ W' Obegin
; C2 r2 u" V O3 Z if Clk'event and Clk='1' then
/ U9 x2 \ ^8 Z% l s& h, v if Clr_en='1' then
- j- E5 \9 I7 ]
Addr<="0000000000000000";
7 ]# d$ ?$ J/ \4 o/ [
elsif ALE_Sample='1' then
4 x! b- a/ w' {) d8 u& Y Addr<=P2&

0;
& v2 h" G" l8 N' Z
end if;
+ e1 w9 o# _1 u+ [: I
end if;
. u8 `5 N P: g2 H, S5 p+ N- A% H; N
end process;
' _ m" d" l# p/ [3 i3 D; @
-------------------------------------
4 G' z; h9 l8 i
--Sample Wr
; [, ?, X& O% ~8 M3 JWrSample_p:process(Clk)
3 a }# S* Y0 V jbegin
% `$ _; G5 m1 b9 |3 uif Clk'event and Clk='1' then
& z! W) A3 _0 A1 e8 D; n: y& x! e if Clr_en='1' then
1 f* L% L. c/ W% y9 F; u' \% j5 j WrSample0<='1';
& e% D; h' H/ E8 ?/ j( D6 V' o
WrSample1<='1';
4 I9 z5 @ `8 l5 Z4 G, Z
WrSample2<='1';
& w, c0 s$ }8 e, p; d5 _$ [7 b3 n5 L
WrSample3<='1';
3 |8 H! }$ _3 y4 B; Z& ~* p9 M WrSample4<='1';
: E& Y9 i2 H: q2 q& ] WrSample5<='1';
, Q* K0 |0 ~2 B# s$ ~
else
& z3 B. P4 s6 X0 N' k9 D
WrSample0<=Wr;
) b2 T3 m7 k% n8 c& Z7 C
WrSample1<=WrSample0;
, ]4 Y, x3 E& `9 j
WrSample2<=WrSample1;
8 ~/ n5 u. B1 e3 E' @
WrSample3<=WrSample2;
/ S" P5 [9 E+ S# q% r
WrSample4<=WrSample3;
' Q3 o8 H0 Y- f* X8 a. h4 r
WrSample5<=WrSample4;
2 G7 {) H9 K7 f. O6 y end if;
3 l0 m. P) b9 y- E: H( f+ }2 A
end if;
$ M# ~; p* Y4 q% gend process;
; V+ @- W! u2 V4 C6 L% f---------------------------------------
; \ Z2 B; p" s0 I" L
--internal Wr enable signal
( k% M' ^! Q1 Q y) ], Y% b3 E
WrEn_p:process(WrSample0,WrSample1,WrSample2,WrSample3,WrSample4,WrSample5)
' N) n4 o- f9 i0 X! \
begin
& G6 A6 v0 g; E0 G' P% H, [if (WrSample0='0' and WrSample1='0'
( M4 `5 h- i, b9 L( P
and WrSample2='0' and WrSample3='0'
# E9 P* g3 j; y
and WrSample4='1'and WrSample5='1')then
8 W* X' b2 n4 c, q! _
Wr_en<='1';
! u! n2 j4 `1 I* j7 o9 C9 s
else
* `8 m1 C6 I+ C8 x9 V& @% u Wr_en<='0';
* W) a7 w( I( S8 J1 M: i$ `4 v
end if;
7 l' t, N; R) f7 g! |end process;
}5 D: a. t3 ?0 p----------------------------------------
$ e' p M* d8 r/ R
--Rd Sample
4 H5 w9 R' I( o& C
RdSample_p:process(Clk)
, o- N/ v1 m# ?1 F+ d% _% r
begin
. E7 n+ M9 q/ c; E& U/ s" Z; O* S! Iif Clk'event and Clk='1' then
5 R9 {. @9 `6 Y. [& a if Clr_en='1' then
/ n! M' D! n+ ]& ]
RdSample<='1';
$ w7 j* V# o5 ~% [, O7 C( u
else
' j e K! b$ q2 t RdSample<=Rd;
1 C, t. G# Z& R2 | end if;
* {4 c) s7 A3 ?! `end if;
8 B1 \. d* ?. z+ D4 ]. R8 }2 ?, Eend process;
1 l; ^. |. d ^/ F2 d4 u
7 H' Z8 w+ p# O6 \
-----------------------------------
: D# U) z1 C3 z {2 e: ?; ~. d
--Flash Rom Chip select signal
; J! U9 [; \) B# s
CS_Flash_p:process(Addr)
/ i$ S$ i- P( g2 _2 ~
begin
4 e8 S; r7 A( q V) p
if Addr(15 downto 14)="10" then --Address:8000h--BFFFh
6 ^3 |- }$ t6 N$ n j
nCsFlashRam<='0';
0 K$ W4 U8 M Z* h& v: [
else
6 C) x) c3 u1 {' j$ q nCsFlashRam<='1';
5 C4 P: ~3 v$ B
end if;
9 v9 `' V3 X/ I: L" J4 cend process;
. X* [9 B4 y$ m" ]9 v. A
-----------------------------------
) B; `5 c/ W* v-- 8255 Chip select signal
3 g% X# Z' e) W/ vcs8255_p:process(Addr)
/ Y$ N. Z M8 g/ e( O7 [begin
5 ]: M4 Y; A5 U& D
if Addr(15 downto 2)="11000000000000" then --C000h--C003h
" T m( R+ _5 \9 c1 X nCS8255<='0';
- }9 F; G% y; X" F5 {0 c0 e7 @
else
" |9 i! J5 a3 x
nCS8255<='1';
+ ?8 u9 K0 m0 H1 z% e1 X end if;
9 @& A2 _) j# J$ W: Tend process;
' w, T9 A- F+ A7 f+ R& @
-----------------------------------
1 X8 H' O6 {4 \* A! m- b4 u-----------------------------------
$ g; ^3 S! z: D7 r/ l- @
-- Ram Bank Switch Reg
8 u; M7 \1 R5 r4 x9 S; n( d
Ram_bank_p:process(Clk)
% T2 G6 o& G0 G$ R3 V' Ubegin
) K7 E6 a# n+ U5 b
if Clk'event and Clk='1' then
! ]5 n; k4 o# o7 I8 t7 ]$ N/ a if Clr_en='1' then
. z7 `$ I6 x2 T" G) h. i) X1 o RamBankReg<="00";
+ ]+ H3 w4 v$ V8 |* j; w elsif Addr="1100000000000100" and Wr_en='1' then --Address:C004h
$ l( `3 U6 H3 N. W$ i
RamBankReg<=P0(1 downto 0);
% w! N* \; X/ C4 `* m end if;
6 e; s7 ~; v0 t. ?7 v- g, l
end if;
0 o+ s2 e. S/ i* s" l
end process;
# }$ Q; L6 D) x- D6 C. c! B$ @4 `RamBank<=RamBankReg;
6 N! Y* ?# D( S }- F. u----------------------------------
3 n8 I- B8 I& z; `3 S' ^7 F6 \
----------------------------------
. L! C) t- o( Z8 p( s( W--Flash Rom Switch Reg
; W3 o3 |0 a& M) A: T3 \6 |4 a
Flash_bank_p:process(Clk)
; y* J) `$ c4 H! a& g
begin
% S$ v3 B! S5 Z5 K! v
if Clk'event and Clk='1' then
4 s& P3 e. A) \ P* k! @ if Clr_en='1' then
- O7 ^ a. Q6 r8 y- j! H( q. W FlashRomBankReg<="000";
7 ?# \7 r3 Y$ ~9 {& o8 \ elsif Addr="1100000000000101" and Wr_en='1' then --Address:C005h
4 _' M8 a+ \ K9 r& h/ r FlashRomBankReg<=P0(2 downto 0);
" O" H$ {2 Y7 z0 e9 m# z- `! X7 f6 h
end if;
! M$ i- l; T9 k/ R6 s0 ^; z
end if;
4 Y. x. q3 F; t' t$ kend process;
l. c$ T& u" E" o7 a' D
FlashRomBank<=FlashRomBankReg;
1 F! h; P# i0 ]7 t
--------------------------------
; T$ p1 I$ t& V3 |* f* O; s3 G--------------------------------
4 C5 _. u |. x4 y
--Rd process
9 B- L) P# [# Q, u
-- now just two in-builde register
, X7 \8 b$ q. g0 ]Rd_p:process(RdSample,Addr,RamBankReg,FlashRomBankReg)
* @, s) ] }3 u6 C
begin
4 }9 c8 w# Q8 C, x
if Addr="1100000000000100" and RdSample='0' then --C004h
& O( m9 T; n# [ g* p) C7 {
P0<="000000"&RamBankReg;
. J/ q0 i7 D9 t9 C' A7 Relsif Addr="1100000000000101" and RdSample='0' then --C005h
' p# m1 [; x' L0 A$ L$ z; z% M3 F6 E
P0<="00000"&FlashRomBankReg;
9 K. c5 y! S* {
else
1 M5 b' x# d* y P0<="ZZZZZZZZ";
9 V& E5 b4 y; w, F+ d- D, d' x
end if;
4 j' K V/ P2 Pend process;
$ O0 }6 L& h3 l
-------------------------------
1 y' @: m C. i+ ?2 K: S, e# u/ yPina_p:process(Clk)
/ R9 `( {9 H& C5 Q
begin
! n! J: j$ p6 J3 J' @; ]2 N
if Clk'event and Clk='1' then
1 ~( O4 s d4 a$ P if Clr_en='1' then
. k7 I: s- l( r. T, B! U7 G; V
PinaReg<='0';
( F! z3 W2 X( L: n9 i
elsif Addr="1100000000000110" and Wr_en='1' then --C006h
' l* k1 `9 N) X+ a
PinaReg<=P0(0);
1 a5 x. O6 B1 u/ ?
end if;
- X$ ~/ A G9 W D/ B a8 h
end if;
9 E( p/ x% [% K3 Nend process;
, }: {! i9 `: V' Y r) mPina<=PinaReg;
1 f" x+ V# J% c6 w
end cpldbus51;