2 并-串转换时序设计& a# z9 z8 Q) U. Q p6 L
- v e# G7 p+ i' h在时序设计上,关键在于要保持DATAIN加载数据的连续性、DATAIN与CCLK加载时钟的同步性以及EEPROM访问地址的复位问题。对于复位问题,采用上电时FPGA产生的/INIT信号对95108内部的EEPROM地址发生器复位。这样做的原因是/INIT与FPGA之CCLK时钟产生有着同步关系,但同时也默认上电加载是一次成功;在考虑串行DATAIN数据的连续性时,采用两组移位寄存器,设定它们为R_shiftA和R_shiftB,当R_shiftA在进行移位操作时,R_shiftB由EEPROM中读入八位并行数据,反之亦然;为保持DATAIN与CCLK时钟的同步性,所有上述操作都以CCLK为同步时钟,值得注意的是,由于DATAIN串行数据是在CCLK的上升沿打入FPGA,因此我们给予XC95108芯片设计的运转时钟是经过反相的CCLK时钟,这样就保证了CCLK与DATAIN的时间关系。
1 I1 |" u, _1 ^2 k; R4 O. _1 ~# p" ^) k% G, ?' j
以下是为该加载设计的VHDL硬件编程语言设计程序45,其中的计数器及移位寄存器模块用F2.11设计软件之LogicBlox模块产生。整个程序经F2.1I开发软件仿真、编译成功后,经JTAG编程电缆写入XC95108芯片。加电后便加载成功,经多次加电实验,成功率为100%。; a2 r0 } D, V& b
虽然该程序是针对XCV100芯片及AT29C010A EEPROM设计的,但对于其他FPGA及EEPROM芯片同样适用,不同的是针对不同容量的EEPROM,应改变其地址计数器的位数。3 ]3 |, T! z0 ]) u$ [# ?
Library IEEE;
: u8 G$ Z: {( Z+ sUse IEEE.Std_logic_1164.all;% I& o2 a1 t) L" h; a: A% T
Use ieee.Std_logic_arith.all;
; C8 H7 U+ y$ ~8 z6 W$ [0 ]Use ieee.Std_logic_unsigned.all;Entity v10sload is
/ k6 h4 O# ]4 Q) y" i' Uport
: M# N* I; Z: ]- |pDATA in STD_LOGIC_VECTOR 7 downto 0 - `, U7 o4 O$ W: A1 z
Paddress inout STD_LOGIC_VECTOR 16
) Y) j6 \) r E# [( lDownto 0
) @% L+ I6 E+ K7 uCCLKIN in STD_LOGIC9 Y# \4 d+ v& {" {4 W3 G4 I
RESET in STD_LOGIC
* A. b* K5 ?7 v1 `: kDATAINout STD_LOGIC
: f. N# {3 O' |/ v- l$ ~
! F. t8 v5 D" H- tend v10sload architecture v10sload_arch of v10sload is6 ^! `+ X8 Z# t& k# i
signal loadin CE Nce CCLK8 Nreset nCCLK aDATAIN
/ ?- X8 c& G) a7 [" i" d# a( GbDATAIN std_logic) |5 }. s6 U) I& \
signal clkenable CCLK std_logic
& h1 u( N$ N3 ]* ksignal ppDATA std_logic_vector 7 downto 0 5 ^9 @0 ]" E( y7 i
component clk_div8
& |! J: O) ?2 G7 n5 MPORT3 a& ?+ j* n! W# c( h
CLOCKASYNC_CTRL IN std_logic
1 b& {3 F& G1 e1 G6 kCLK_OUT OUT std_logic
# c8 m( l+ j! H# y2 c! lend component ^0 V" k8 M/ z5 b% M( M9 s' v
component R_shift8
$ o' p/ `# S7 ?8 BPORT6 g/ E) O# Q9 |4 O4 `
D_IN IN std_logic_vector 7 DOWNTO 0 2 t4 \/ q$ Z' j7 F: M
LOAD IN std_logic
' n, V. L; d9 v4 ]" \* rCLK_EN IN std_logic
( r! H' A R0 j! b" v. vCLOCK IN std_logic* _# ?8 C5 @! B! N; a& `% R
LS_OUT OUT std_logic : `! w; T3 t7 B4 O& N2 [
end component: g2 k7 f; ?/ f& V, q9 l1 m& Z# C
component BUFG
/ i3 R& c/ s) O J* `port I in std_logic O out std_logic
6 |7 N4 ]7 N f, x) d. Y1 R/ lend component
4 D ]; x$ I0 U% G1 [begin& t8 g5 A, H3 J
-------------------------------! Q* A; Z' c* a% J: t6 T
--data-loading function statements here
6 F# T7 z8 \" fnRESET<=not RESET
) H2 o6 x4 A; f; g. Y% Rinit_dataprocessRESET
" m* P2 l- ]8 z( `begin/ y/ Q; K1 A, ?& B
if RESET='0' then' K& E" `; } ]2 l
ppDATA<=″00000000″
9 d t5 k! z6 T: s, E! {$ d: A0 Felse ppDATA<=pDATA
4 S; p. _- R( R; Gend if
8 N0 N/ @% G% v- h: O Nend process init_data5 z8 b5 X& p" N# z2 w
L0 BUFG port mapI=>CCLKIN O=>CCLK
4 R" d$ Z8 v& H& AnCCLK<=not CCLK
4 X1 i8 ]9 @* J8 u5 ]" YL1counter17 portmap; ]( S& w0 ~/ `! _5 a' T
CLOCK=>CCLK8ASYNC_CTRL=>nRESET
. B0 J( T0 M5 H0 }' I+ |Q_OUT=>pADDRESS 5 K* ?6 t, _* o9 V7 V* }
L2 clk_div8 portmap, ~: s0 Z. P3 i1 v3 C
CLOCK=>nCCLKASYNC_CTRL=>nRESET
9 ], B: J& S$ A+ S# m" W+ H8 y- m' @CLK_OUT=>CCLK8
# J l T1 o2 z: o$ z- D( S- InCE<=not pADDRESS0
# L5 p6 x$ d8 M- xCE<=pADDRESS0 0 u/ _& A: q& h
clkenable<='1'
- M5 G$ v% ~% Y) e# ZL3R_shift8 portmap
4 f- S0 U3 L+ l @5 b: [D_IN=>ppDATALOAD=>nCECLK_EN=>" t2 f9 }. w' N) V
clkenableCLOCK=>nCCLK
0 V6 r* t4 m! BLS_OUT=>aDATAIN + |+ h1 `4 |( x: u
L4R_shift8 portmap
) [5 Q- D7 M" r8 H2 JD_IN=>ppDATALOAD=>CECLK_EN=>
$ D, t* W) d* d/ l6 v S( b* XclkenableCLOCK=>nCCLK8 j, Q @2 S9 G9 T4 V1 F: g
LS_OUT=>bDATAIN 0 h$ e4 o. l, J# L9 H) m- K
Process Adatain bDATAIN CE % y }4 K* x0 z7 O3 H
begin. V' } p: c g+ Q6 F
if CE='1' then DATAIN<=dDATAIN) r0 u/ S7 N+ X
else DATAIN<=bDATAIN4 C5 j$ T" V' h9 L: }
end if7 s. _- x$ R0 P0 d
end process- d; J! L! }4 {! O& Q
end v10sload_arch |