前段时间手头一个项目中遇到的问题。硬件设计的时候将SDRAM同时挂在了两个FPGA上面,但实际工作的时候需要将其中一个FPGA连接SDRAM的管脚设计为高阻,避免影响另一片FPGA正常访问SDRAM。为了说清楚问题,将需要正常访问SDRAM的FPGA叫FPGA0,另一片FPGA叫FPGA1.
1、FPGA1中使用纯逻辑来实现
这个比较简单,将所有与SDRAM连接的接口如下设置即可:
assign mpmc_0_SDRAM_CAS_n_pin = (1'b1) ? 1'hz : 1'h1;
即可保证该接口恒为高阻态。
2、FPGA1中使用了MicroBlaze
这需要设计一个简单的IP Core来实现管教高阻。首先需要通过EDK来生成一个PLB的core,系统会自动生成plb_tri.vhd和user_logic.vhd两个文件。再自己定义一个module来实现三态端口,起个名字叫tri_state.v吧。因为对verilog比较熟悉,所以这个模块用verilog来实现的。当然在uer_logic.vhd中对该模块的例化还得用VHDL来写。其实很简单,不过就是因为MicroBlaze的原因,实现过程和纯逻辑的实现不一样而已,不能直接通过assign语句来实现。必须定义三个信号来定义一个接口:
input [12:0] mpmc_0_SDRAM_Addr_I ;
output [12:0] mpmc_0_SDRAM_Addr_O ;
output mpmc_0_SDRAM_Addr_T ;
大家看明白了吧,信号结尾必须用_I, _O, _T,这样MicroBlaze会自动将该Pin脚设置为三态端口。剩下的就好办了,直接将
mpmc_0_SDRAM_Addr_T <= 1'b1; (至于为什么设为1,就需要熟悉IO接口的结构了,Xilinx提供的资料有,大家自己查)
就可以保证该端口输入时候表现为高阻状态了,问题解决。
文章评论(0条评论)
登录后参与讨论