摘 要:在使用Flash存储数据时,有时需要对其设计读写控制逻辑。本文介绍了用VHDL语言在CPLD内部编程,实现对Flash中数据的读取控制的具体方法,并给出了时序仿真波形。根据需求进行相应的修改,该设计可以支持可多种数据输出宽度,因而具有较好的灵活性。 关键词:CPLD VHDL Flash 多种数据输出宽度
1 概述 本设计已实用于国家863计划“可扩展到T比特的高性能IPv4/v6路由器基础平台及实验系统”项目中。其主要功能是对主控部分的FPGA读取Flash进行控制。 在本项目中,主控部分的FPGA在重启时需要从Flash中下载初始化程序。当下载完成后,FPGA仍会根据需要从Flash相应地址读取数据。这就要求在FPGA和Flash之间有一块控制逻辑来控制对Flash的读取。本设计就是完成的对这块控制逻辑的具体实现。 本文用VHDL语言在CPLD内部编程将其实现。本文第2节给出用VHDL语言在CPLD内部编程实现Flash读取的过程,第3节对全文进行概括总结。
2 实现
2.1 器件的选择 我们选用Xilinx公司XC9500XL 3.3V ISP 系列XC95288XL-7TQ144I芯片。XC95288xl是一个3.3V的低电压、高效的CPLD,在通信和计算机系统中的有广泛的应用。它包含16个54V18个功能块,提供了6400个可用的门电路,这些门电路的传播延时为6ns. 对于Flash,项目中选择了Intel公司的Intel StrataFlash系列的256-Mbit J3型Flash.其数据宽度可分别支持8位或者16位。
2.2 实现中的问题及解决方法 项目中选用的Flash的输出为16位,而向FPGA输出的数据为32位,因此产了数据宽度不匹配的问题,解决的方法有两种: 第一 使用两块相同的Flash,分别将其输出的数据送入FPGA接口的高16位和低16位;其缺点是需要增加一块Flash,从而成本增加。 第二 采用降低读取速度的方法,把从一块Flash中连续两次读取的16位数据拼接起来,组成一组32位的数据后送入FPGA接口。 出于对成本和复杂度的考虑,在此设计中我们采取了第二种方法加以实现。
2.3 基本设计模块图 图1 程序模块图
(注:框中部分为本设计所实现模块,setfpga模块完成对FPGA设置)
2.4 用VHDL进行实现(注:实体部分定义可分别参见模块图中的划分)
Flash control 1 process(reset,gclk) begin if reset ="0" then count_reset <="0"; elsif gclk"event and gclk ="1" then count_reset <= not(count(4) and count(3) and count(2)); end if; end process; process(count_reset,gclk) begin if count_reset ="0" then count <=(others =>"0"); elsif gclk"event and gclk ="1" then count <=count +1; end if; end process; process(count_reset,reset,enable) begin if reset ="0" then F_CS <="1"; F_OE <="1"; F_WE <="1"; elsif count_reset ="0" then F_CS <= "1"; F_OE <= "1"; F_WE <= "1"; elsif enable"event and enable ="1" then F_Abus <= C_Abus; F_CS <= "0"; F_OE <= "0"; F_WE <= "1"; C_Dbus <= F_Dbus; end if; end process; Flash control 2 d_count_rst <= not(d_count(1) and (not d_count(0)) and empty); sig_WD <= not(d_count(1) and (not d_count(0))); WR_DATA <= sig_WD; process(gclk,d_count) begin if reset ="0" then d_count <= "1"; elsif F_CS = "1" then d_count1 <= not d_count1 ; if gclk"event and gclk ="1" then d_count2 <= d_count1; d_count <= d_count2; end if; end if; end process; process(reset,d_count,C_Dbus) begin if reset = "0" then data_adder <= (others =>"0"); elsif d_count"event and d_count = "0" then data_adder(31 downto 16) <= C_Dbus; elsif d_count"event and d_count = "1" then data_adder(15 downto 0) <= C_Dbus; end if; end process; enable <= enable1 and enable2; process(reset,d_count,F_CS) begin if reset = "0" or F_CS = "0" then enable1 <= "1"; enable2 <= "1"; elsif d_count"event then if gclk"event and gclk ="1" then enable1 <= "0"; enable2 <= not enable1; end if; end if; end process; process(reset,F_CS) begin if reset = "0" then address<= X"400000"; elsif F_CS = "1" then C_Abus <= address; address <= adderss +1; end if; end process; process(reset,F_CS) begin if reset = "0" then address<= X"400000"; data_adder <=(others =>"0"); elsif F_CS = "1"; address <= adderss +1; end if; end process; process(d_count2,F_CS) begin if F_CS = "0" then enable1 <= "1"; enable <= "1"; elsif d_count2 = "00" or d_count2 = "01" then enable <= "0"; end if; end process; process(gclk,sig_WD) begin if sig_WD = "1" then Pulse_RW <="1"; elsif gclk"event and gclk ="1" then W_D1 <= sig_WD; W_D2 <= W_D1; if empty ="0" then data_adder1 <= data_adder; Pulse_RW <= (W_D1 or (not W_D2)); end if; end if; end process;
(注:此程序在Xilinx公司的ISE6.2i环境下用VHDL编程实现,其仿真波形见下图) 图2 Flash control 1仿真图
图3 Flash control 2仿真图
3 结束语 在实际应用中,以此CPLD对Flash的读取进行控制。仿真结果及最后的实际调试都表明该设计符合项目的要求。在程序中通过对读取的记数控制,本设计可以在不增加Flash片数的情况下支持16/32/64位的数据输出宽度。可以节约一定的成本,具有相当的灵活性和实用性。
参考文献: 1 29066721 3 Volt Intel StrataFlash Memory Datasheet, Intel 公司,2003 2 姜立东. VHDL语言设计及应用.北京:北京邮电大学出版社,2001
|
文章评论(0条评论)
登录后参与讨论