Board logo

标题: CPLD/FPGA中双向总线的实现方法 [此博文包含图片] [打印本页]

作者: yuyang911220    时间: 2015-8-30 22:21     标题: CPLD/FPGA中双向总线的实现方法 [此博文包含图片]

作者:duoduo

   对于CPLD/FPGA初学者而言,如何实现双向信号往往是个难题。duoduo当年初接触CPLD/FPGA的时候也为这个问题头疼过。让我们透过下面这个简单的例子看看CPLD/FPGA设计中如何实现双向信号。   假设HOST通过CPLD/FPGA读写外设(比如MCU通过CPLD/FPGA读写一块memory的情况),为了简化问题的说明,假设HOST端只有写信号hwr_,读信号hrd_双向8位数据总线hd;外设端相应有写信号swr_,读信号srd_双向8位数据总线sdCPLD/FPGA对所有信号只作一个通路的作用,即对HOST和外设来讲,它们都认为自己是直接连接到了对方,而不知道CPLD/FPGA的存在(显然实际电路中这样做可能并没有什么用处,但是这个例子只是用来说明双向信号的用法)。
   下图中表示了信号流向,虚线部分表示在CPLD/FPGA中通过的信号流。可以看到,hwr_swr_hrd_srd_都只是单向信号,HdSd则是双向的总线。

   单向信号很简单就不多说了,看看双向信号如何实现。首先从CPLD/FPGAIO结构上分析如何实现双向。尽管ICIOPad结构上可能很复杂,但是从实现双向功能这个目的来看,我们可以把IOPad结构简化成下面的图示:

   图中A_OUT_OEA_OUTA_IN均为CPLD/FPGA内部信号,A则是CPLD/FPGA的引脚信号名。显然,A_IN始终反映了A的实际状态,即引脚输入,A_OUTA_OUT_OE控制,当A_OUT_OE为高的时候A_OUT可以通过三态缓冲器输出到引脚上,即引脚输出。因此,在CPLD/FPGA内部定义A_IN(实际上A_IN就是A)A_OUTA_OUT_OE三个信号用于内部逻辑,并合适地产生A_OUT_OE信号,就可以实现双向引脚。
   根据这个实现双向IO的原理,对上面的HOST读写外设的例子,我们可以这样来描述:
module bidir(
      hwr_,
      hrd_,
      hd,
      swr_,
      srd_,
      sd,
      //dumy
);

input  hwr_;
input  hrd_;
inout [7:0]   hd;
output swr_;
output srd_;
inout [7:0]   sd;
//input  dumy;

wire hd_out_oe;
reg [7:0]  hd_out;
wire sd_out_oe;
reg [7:0]  sd_out;

always @(hwr_)
begin
      if(!hwr_)      sd_out = hd;
end

always @(hrd_)
begin
      if (!hrd_) hd_out = sd;
end

assign swr_ = hwr_;
assign srd_ = hrd_;
//assign sd_out_oe = !hwr_ &dumy;
assign sd_out_oe = !hwr_;
assign hd_out_oe = !hrd_;

assign hd = hd_out_oe ? hd_out : 8'hzz;
assign sd = sd_out_oe ? sd_out : 8'hzz;
endmodule




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0