2 并-串转换时序设计
在时序设计上,关键在于要保持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的时间关系。
以下是为该加载设计的VHDL硬件编程语言设计程序[4][5],其中的计数器及移位寄存器模块用F2.1I设计软件之LogicBlox模块产生。整个程序经F2.1I开发软件仿真、编译成功后,经JTAG编程电缆写入XC95108芯片。加电后便加载成功,经多次加电实验,成功率为100%。
虽然该程序是针对XCV100芯片及AT29C010A EEPROM设计的,但对于其他FPGA及EEPROM芯片同样适用,不同的是针对不同容量的EEPROM,应改变其地址计数器的位数。
library IEEE;
use IEEE.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity v10sload is
port (
pDATA: in STD_LOGIC_VECTOR(7 downto 0);
pADDRESS:inout STD_LOGIC_VECTOR(16
downto 0);
CCLKIN: in STD_LOGIC;
RESET:in STD_LOGIC;
DATAIN:out STD_LOGIC
);
end v10sload;
architecture v10sload_arch of v10sload is
signal:loadin,CE,nCE,CCLK8,nRESET,nCCLK,aDATAIN,
bDATAIN:std_logic;
signal clkenable,CCLK:std_logic;
signal ppDATA:std_logic_vector(7 downto 0);
component clk_div8
PORT(
CLOCK,ASYNC_CTRL: IN std_logic;
CLK_OUT: OUT std_logic);
end component;
component R_shift8
PORT(
D_IN: IN std_logic_vector(7 DOWNTO 0);
LOAD: IN std_logic;
CLK_EN: IN std_logic;
CLOCK: IN std_logic;
LS_OUT: OUT std_logic);
end component;
component BUFG
port(I:in std_logic; O:out std_logic);
end component;
begin
-------------------------------
--data-loading function statements here
nRESET<=not RESET;
init_data:process(RESET)
begin
if(RESET='0') then
ppDATA<=″00000000″;
else ppDATA<=pDATA;
end if;
end process init_data;
L0:BUFG port map(I=>CCLKIN,O=>CCLK);
nCCLK<=not CCLK;
L1:counter17 portmap
(CLOCK=>CCLK8,ASYNC_CTRL=>nRESET,
Q_OUT=>pADDRESS);
L2:clk_div8 portmap
(CLOCK=>nCCLK,ASYNC_CTRL=>nRESET,
CLK_OUT=>CCLK8);
nCE<=not pADDRESS(0);
CE<=pADDRESS(0);
clkenable<='1';
L3:R_shift8 portmap
(D_IN=>ppDATA,LOAD=>nCE,CLK_EN=>
clkenable,CLOCK=>nCCLK,
LS_OUT=>aDATAIN);
L4:R_shift8 portmap
(D_IN=>ppDATA,LOAD=>CE,CLK_EN=>
clkenable,CLOCK=>nCCLK,
LS_OUT=>bDATAIN);
process(aDATAIN,bDATAIN,CE)
begin
if(CE='1') then DATAIN<=aDATAIN;
else DATAIN<=bDATAIN;
end if;
end process;
end v10sload_arch;