library IEEE;
8 Q. e6 {' z, Z9 E; ruse IEEE.std_logic_1164.all;
& a$ `5 l: }* X2 z+ P6 e
use IEEE.std_logic_unsigned.all;
2 j8 L/ D& ~# ]4 E4 ^entity cpldbus51 is
6 J x# f0 ]$ J/ T- _& h4 Bport (
! Z5 k2 ~ m% ]* B$ W Clk: in STD_LOGIC; --Clock 16MHZ
/ T$ v3 z2 o! m3 p5 [1 y& ^
Clr: in STD_LOGIC; --Clear high
' O. g( `1 |" F P0: inout STD_LOGIC_VECTOR (7 downto 0); --8052 Port 0
. v5 j" ]0 ^7 c3 `+ Q P2: in STD_LOGIC_VECTOR (7 downto 0); --8052 Port 2
; @( _ o. T, e$ n1 g: Z2 w ALE: in STD_LOGIC; --8052 ALE
8 q6 d0 W+ W3 Q2 f H
-- PSEN: in STD_LOGIC; --8052'Psen
, i6 P, R0 Z: e. d' z" @; w
-- INT0

ut STD_LOGIC; --8052 INT0
v( ^" l/ s. w. p Wr: in STD_LOGIC; --8052'Wr
: z. d5 K a8 l- f7 R( R2 L Rd: in STD_LOGIC; --8052'Rd
% _2 S: K4 l/ c# r1 |# W& A1 Z---------------------------
/ d( F2 `+ n0 {* Z6 b( P Pina

ut STD_LOGIC; ---output
# _5 Z/ ?4 ~% A8 l! U9 Z1 {-----------------------
2 H& F" K% G5 n& g h0 } nCS8255: out STD_LOGIC; --select 8255
4 B7 x; }2 y5 G# Z2 G9 |
RamBank: out STD_LOGIC_VECTOR (1 downto 0);--Ram68128a bank switch A15 A16
4 e# W( s3 m5 K
nCsFlashRam: out STD_LOGIC; --select Flash Rom CE
/ g; d4 G/ w, E- k4 f FlashRomBank: out STD_LOGIC_VECTOR (2 downto 0) --Flash Rom switch A14 A15 A16
5 k/ r* d+ C! ~) h0 G5 n4 n. n* @
. ^! O! K' a) t9 }% A% v2 z, u);
, ^+ I" N1 o& L
end cpldbus51;
3 E8 _0 h) D( \5 `- [3 N2 O- F
; s/ f0 G' P. qarchitecture cpldbus51 of cpldbus51 is
! I* Q# z& }1 A6 m/ K------------------------------------------------------------------------------
- ?0 i/ M( t" K9 m# m4 n' nsignal Addr: std_logic_vector(15 downto 0); --16bit address
- c- ~; T" K- A8 ]% G
signal ALE_Sample:STD_LOGIC;
& Z+ |" ?. t1 H6 B6 E; f: c
signal RamBankReg: STD_LOGIC_VECTOR (1 downto 0);--Ram bank switch reg, 4 banks, 4*32K=128k bytes
- x+ l/ x+ T* b! ^: H; H1 \4 x
signal FlashRomBankReg: STD_LOGIC_VECTOR (2 downto 0);--Flash Rom bank switch reg, 8 banks, 8*16K=128k bytes
( G: x M; D- V0 ]
--Rd Sample
$ M# j/ ^6 k" N
signal RdSample:std_logic; --for Rd Sample
% Y4 P' G* r5 P3 N: v' a: x; u--WR Sample
2 |' A- G, `/ @$ C4 z5 \9 e! _- Lsignal WrSample0:std_logic; --Wr for Sample
/ ?7 K4 M0 {; t" E. Q
signal WrSample1:std_logic;
4 {3 P( F" O$ r: w4 v
signal WrSample2:std_logic;
d0 I; @0 U1 D4 bsignal WrSample3:std_logic;
5 k! s' Y" y' p4 n: T9 C4 F
signal WrSample4:std_logic;
, E( ` R$ H# `2 x: N: i& A$ j/ _" Ysignal WrSample5:std_logic;
& U- |% u s6 c% j# p* x
--Wr Sample output
0 k5 K+ D; Y: m* M2 g
signal Wr_en:std_logic;
* Y1 g" ^5 u: Z3 O+ X! ?! I--Clr Sample
i2 K6 e, }4 Y: w8 L' t% h
signal ClrSample0:std_logic; -- for Clr Sample
4 h6 B- p+ x( X& u3 R' d
signal ClrSample1:std_logic;
% @( }: b9 ]6 ?signal ClrSample2:std_logic;
6 K/ o" n) U7 jsignal ClrSample3:std_logic;
9 q+ y9 @8 W# z, Q
signal ClrSample4:std_logic;
9 A4 N7 g/ j0 ?) E6 |0 W( ^5 Q
signal ClrSample5:std_logic;
: ]) e+ l3 Q/ N! c' Vsignal ClrSample6:std_logic;
; z" I& u3 R5 Gsignal ClrSample7:std_logic;
5 ~4 D+ F8 s( Osignal ClrSample8:std_logic;
! B! x+ e( ~* \6 ?0 x9 ~1 L7 [signal ClrSample9:std_logic;
$ Q1 e) f* k; `3 M$ H--Clr Sample output
0 h. P# R$ S: h+ S# B
signal Clr_en:std_logic;
: {+ e4 i" r2 Z! f" w------------------------------------------------------------------------------
A" z- `. Q+ }) }--output Reg
" i% P( i& ?. `signal PinaReg:std_logic;
& q6 I5 f0 g0 w# {
begin
! N3 r, Q6 ?2 |. n1 Y' r: c
--------------------------------------------
! V' \- t/ U" Z2 d' A0 ~5 R--Sample Clr signal
% i5 S8 c1 \( K6 nClrSample_p:process(Clk)
2 a8 J& F% a+ zbegin
+ \: Q. Q. l+ n: |
if Clk'event and Clk='1' then
2 n! D n3 X' ~) F' l5 n ClrSample0<=Clr;
% I. v; F7 A) ?. j/ \8 e9 G ClrSample1<=ClrSample0;
: d( e3 D& o$ {" D
ClrSample2<=ClrSample1;
9 G' K$ H: s6 m# l
ClrSample3<=ClrSample2;
9 r% e, a4 g7 K ClrSample4<=ClrSample3;
/ o# f5 h& I& k0 m& l
ClrSample5<=ClrSample4;
0 i. F2 x& h1 j+ z2 h. i ClrSample6<=ClrSample5;
% }7 P8 }* k$ o6 J ClrSample7<=ClrSample6;
0 k7 U& A' t, M4 M- F2 x9 V
ClrSample8<=ClrSample7;
! s0 S. R- X: ]+ u6 F
ClrSample9<=ClrSample8;
0 B# r$ S0 Z: x0 [5 O# e: \
end if;
7 [) }" B4 T, W) N
end process;
- q+ W8 P: Y9 Q9 \3 {
---------------------------------------
6 S2 k$ G3 g& D! X--Clr Enable Signal
% R& ? C( H- g- v4 F' r
Clr_en_p:process(Clk)
( X/ R2 c# \2 U0 {6 _7 N8 K$ [begin
. t2 Z, _! d* q1 k
if Clk'event and Clk='1' then
h* v* P8 F _ C% G+ C
if ClrSample0='1' and ClrSample1='1'
: Z7 ^; [9 g2 f& q
and ClrSample2='1' and ClrSample3='1'
5 G, m- @- z% A+ L+ _5 v8 V; e$ N, Z and ClrSample4='1' and ClrSample5='1'
: G: }2 M2 [6 g
and ClrSample6='1' and ClrSample7='1'
% c4 B( ^4 c( b& M: q x
and ClrSample8='1' and ClrSample9='1' then
/ E, k3 d# X& g, o! H" B& u6 c) ?
Clr_en<='1';
% @+ H& p: c2 O( x8 w else
- ~* j- N7 O' E0 L
Clr_en<='0';
- x! A5 b: B, v# A! o ?
end if;
# ]8 n& c4 G5 }# M/ F& ^- M
end if;
: {% Q( l5 N& R q6 ~end process;
3 K) K2 h' g: G' c7 r------------------------------------------------
* M ~* e0 G6 x# y1 O2 ^) ]! q1 Y--sample ALE signal
* k5 h: x2 B* d: D' |. G& H" J
ALE_p:process(Clk)
/ @% Z' R; a G. U, W6 |7 m, Y5 M6 ~$ gbegin
2 h! I: m! }1 f5 i+ A k if Clk'event and Clk='1' then
( d+ ^" \( l! x3 m4 h9 u) S
if Clr_en='1' then
! t) N* r! c% `/ f/ b$ p/ c
ALE_Sample<='0';
/ Z/ K4 L7 C3 q2 S else
. c, N' d; W; o2 n
ALE_Sample<=ALE;
` p4 q- q. Z0 ]. S( t end if;
! r0 J/ @+ t4 m8 Y+ Z' {
end if;
_& i0 f$ n$ v8 w4 @
end process;
$ H7 H& ~; Q7 H! G/ Q7 B
-------------------------------------------------
% q, u9 ]3 U& d& B1 a--Address Latch
0 N" f) j( Y$ j1 {. p% E( Q
Address_p:process(Clk)
1 n* K4 W6 t& q! q+ u ~1 Z
begin
$ n+ F2 k; \" n1 D9 Q
if Clk'event and Clk='1' then
7 A% [- \9 e/ U. I0 g# v; Q6 \ if Clr_en='1' then
$ G% `; F* e$ Q" l
Addr<="0000000000000000";
" C. e% v- n& T! L# g, D
elsif ALE_Sample='1' then
/ J) l1 V& e1 R; l Addr<=P2&

0;
+ r( E$ H% {( D) [: o5 a6 j6 t- V" H. D+ Q end if;
; p4 b$ u- G3 B2 k# x d5 A, J3 |; j5 f end if;
; s, u2 Q3 u+ T1 M5 c1 oend process;
% ~" F l- W3 r% \# _+ c. D-------------------------------------
- y7 h% D0 Q) `
--Sample Wr
' r! {) F: D! i uWrSample_p:process(Clk)
( z: B/ S& U9 L. Wbegin
# R$ Y4 j q) j
if Clk'event and Clk='1' then
( d+ r5 p# K: U3 w& o if Clr_en='1' then
6 d% a! j y7 @; {" ~ t0 U* X WrSample0<='1';
. U% Z. [1 G5 w- B9 U0 w WrSample1<='1';
7 K. Z: L, b( i A2 V- i" D
WrSample2<='1';
+ K1 M- {* X* T9 s( a, g9 D0 j0 n
WrSample3<='1';
& Q7 w9 R7 t+ D4 F, T3 E( Q WrSample4<='1';
2 C% O2 E+ D, C5 U; V
WrSample5<='1';
$ N; k/ z+ ~+ o _
else
. i8 J( t+ {8 g% X% n! X WrSample0<=Wr;
" s5 `6 \3 \: Y, K4 r2 O
WrSample1<=WrSample0;
# P! ?- [6 I8 e) q3 I* M; w' B
WrSample2<=WrSample1;
$ r E# H# }! Y( M
WrSample3<=WrSample2;
1 ?' x( ~7 V, W
WrSample4<=WrSample3;
% b! z% h K8 g; ]
WrSample5<=WrSample4;
" o) {6 t9 N2 O% Z$ v$ Z* g
end if;
8 J6 g# I# [! D. f
end if;
( N4 r0 {! N+ x0 I
end process;
" u4 @! B0 Z; k0 C+ s9 ^# q7 M
---------------------------------------
h9 {# R6 d. ^! s- g9 m& x
--internal Wr enable signal
% k/ h- e" @( F+ T: S" A# b2 [WrEn_p:process(WrSample0,WrSample1,WrSample2,WrSample3,WrSample4,WrSample5)
/ @* a( F: n" {( ~
begin
, k9 I; z4 m$ `7 v8 u
if (WrSample0='0' and WrSample1='0'
: d. L2 Y1 D5 @0 Z1 n
and WrSample2='0' and WrSample3='0'
8 J! |: C0 b3 m1 J3 |% V9 B and WrSample4='1'and WrSample5='1')then
8 R1 g1 o% n% k Wr_en<='1';
# h' \4 l$ C6 J# i3 y$ X3 \
else
5 r6 Q' _* L3 @ Wr_en<='0';
- s- D: q! t, w* @, ?9 Y
end if;
$ F7 L7 L3 s6 D \8 e
end process;
" a3 b; e, p N/ q' R----------------------------------------
' C& k6 z2 R" t& A( d5 r: ]" X
--Rd Sample
; V0 c* ^: i5 ?, y& t" l) N
RdSample_p:process(Clk)
) J- G+ ]+ ?$ y5 N6 W7 \& V
begin
2 L* h6 A% M- ^: i. J' f0 a2 z
if Clk'event and Clk='1' then
( Q. y/ `* I, W9 C c) [
if Clr_en='1' then
/ o( Z2 K b- h7 b; m* D
RdSample<='1';
7 j3 v6 J @8 G, {
else
) M/ L" ? r+ p& G$ w, W
RdSample<=Rd;
6 r4 q" ~' E% O) O; J- I$ S
end if;
0 w. j2 }* X4 ~! T; d
end if;
1 B. G$ F7 o. n8 }' A
end process;
6 W1 y& K. O! A y% H0 u! h' i( p) _+ n0 t) e, W* W$ b ]: s
-----------------------------------
- K# K9 i! a6 U, K% w* e, R% C; Y: y
--Flash Rom Chip select signal
3 E% y: _! Y- s% YCS_Flash_p:process(Addr)
5 E8 B1 H0 i- {$ x/ t' P0 Z) ~
begin
^8 j; }. K2 m( y' \6 bif Addr(15 downto 14)="10" then --Address:8000h--BFFFh
+ |9 ~ p( F! I0 v
nCsFlashRam<='0';
% v# R1 h5 f/ s! Kelse
) s- Y3 O% k6 L0 s6 B" f
nCsFlashRam<='1';
3 j5 `+ A ]0 }' F5 [end if;
: i9 a& s. M0 @$ r/ \
end process;
X" b' p1 c! s! S( k4 h9 ~-----------------------------------
5 O5 v }5 h2 g* H# f! w& h; ^! {
-- 8255 Chip select signal
0 o& s, j8 a$ n- G' u
cs8255_p:process(Addr)
9 X0 Z: }8 C6 t, }/ U0 j/ Q* ^6 B+ Nbegin
4 n2 \5 I) Z# W# w# [ g
if Addr(15 downto 2)="11000000000000" then --C000h--C003h
, v+ I: R% g% E: i/ _; Y8 N$ W nCS8255<='0';
' M) Y N! }# o% c* s
else
5 O p, N- L6 z0 Z. s
nCS8255<='1';
4 f0 f! l0 R) ~9 F end if;
5 b/ y5 t! [& ~+ @
end process;
) d, H/ Q, T7 d6 |+ a-----------------------------------
6 I3 I, l% l0 a' a, x-----------------------------------
" S$ W2 W7 L4 ]- ^, _-- Ram Bank Switch Reg
! ]7 @7 g6 I' D4 M' G6 R
Ram_bank_p:process(Clk)
e& C% J% |. s4 Hbegin
; A$ Y: {, e& D- e, n/ c
if Clk'event and Clk='1' then
% G8 u, Y( z* G# | @. z3 e0 G' H
if Clr_en='1' then
5 T2 _& x, n, i RamBankReg<="00";
5 n6 K; }8 a5 `' g" s) U7 N. O
elsif Addr="1100000000000100" and Wr_en='1' then --Address:C004h
* r; O2 i1 B, ?" M0 e$ O' P( x
RamBankReg<=P0(1 downto 0);
' R/ _5 [5 u* B) o
end if;
- U! ~" {) F3 x6 ?) H3 n
end if;
% M& A: |/ I+ P$ w7 R* Eend process;
0 c! F2 O( k) y6 T6 |6 l6 k* kRamBank<=RamBankReg;
$ g5 u* Q- D3 |4 R1 P8 } A
----------------------------------
" Q, A: w* I& o; o$ I* J----------------------------------
- J- H! N& X0 v# n' t
--Flash Rom Switch Reg
]5 F& u7 x F% v4 T
Flash_bank_p:process(Clk)
# W9 L2 E; T1 I0 l0 Sbegin
) {. y0 e, u. ]% y" ]9 F% Vif Clk'event and Clk='1' then
1 y* [* z5 U$ q/ y: D! c if Clr_en='1' then
7 Q. p `5 r* U I
FlashRomBankReg<="000";
+ G$ B% g9 A: `' [! W2 a; ]' X6 s$ P
elsif Addr="1100000000000101" and Wr_en='1' then --Address:C005h
, [7 w; K! b; L2 q& _9 X FlashRomBankReg<=P0(2 downto 0);
+ J4 C0 u Y6 E* M
end if;
) ]1 ^' N+ E) X: R% P/ Cend if;
! \& ?( x! y i- h$ z+ M% l
end process;
* b. q$ C0 S& w6 F' P2 C4 g
FlashRomBank<=FlashRomBankReg;
8 o/ X, R2 `$ q5 B/ [2 K
--------------------------------
8 D4 v! Y0 Y, r; Y) f
--------------------------------
" q9 i7 y) N+ C# q7 w! w! v" ~
--Rd process
7 i; K) ~$ m) X; p+ ~$ s6 V
-- now just two in-builde register
; q5 K/ q- M, c+ x
Rd_p:process(RdSample,Addr,RamBankReg,FlashRomBankReg)
' F+ o/ a) {$ f- b7 }% L3 Abegin
, U! J, g) j& T3 W$ cif Addr="1100000000000100" and RdSample='0' then --C004h
6 S/ z. [: @' h ` P0<="000000"&RamBankReg;
5 ~+ {! D% V7 O0 H$ F+ F4 Celsif Addr="1100000000000101" and RdSample='0' then --C005h
. q1 ?9 \. D9 L9 l P0<="00000"&FlashRomBankReg;
! X& x- U }" e9 B
else
; s. V* a2 ~; H! c) ~: t# s
P0<="ZZZZZZZZ";
8 `$ \( X: F/ o" a
end if;
5 {+ ~% Q" A8 qend process;
0 z- j/ f) L* j3 w# p-------------------------------
/ r. | S/ V; L4 ]Pina_p:process(Clk)
! I7 ^* {2 Y: H& ^& v$ P
begin
; E) a3 ~5 J( b* Y4 @4 G" [if Clk'event and Clk='1' then
5 Q+ o4 u! y/ q8 g( U3 g& M if Clr_en='1' then
) i* f. _& ~! J7 K: e. \
PinaReg<='0';
2 g! k$ g+ Q- W+ V( r) C$ V elsif Addr="1100000000000110" and Wr_en='1' then --C006h
9 Q/ A8 h0 }* }! u0 P+ F9 D
PinaReg<=P0(0);
n, u0 e" B# r4 \! W& k# m
end if;
7 w) w9 o% O1 U8 q* O4 C
end if;
' e; E) t6 T, \ M& N- P3 \ aend process;
) Z* l4 x# P$ M4 LPina<=PinaReg;
" j/ _* j" U- w" v' p* N. {
end cpldbus51;