CPLD/FPGA中双向总线的实现方法 [此博文包含图片]
- UID
- 1029342
- 性别
- 男
|
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位数据总线sd。CPLD/FPGA对所有信号只作一个通路的作用,即对HOST和外设来讲,它们都认为自己是直接连接到了对方,而不知道CPLD/FPGA的存在(显然实际电路中这样做可能并没有什么用处,但是这个例子只是用来说明双向信号的用法)。
下图中表示了信号流向,虚线部分表示在CPLD/FPGA中通过的信号流。可以看到,hwr_和swr_,hrd_和srd_都只是单向信号,Hd和Sd则是双向的总线。
单向信号很简单就不多说了,看看双向信号如何实现。首先从CPLD/FPGA的IO结构上分析如何实现双向。尽管IC在IOPad结构上可能很复杂,但是从实现双向功能这个目的来看,我们可以把IOPad结构简化成下面的图示: 图中A_OUT_OE,A_OUT,A_IN均为CPLD/FPGA内部信号,A则是CPLD/FPGA的引脚信号名。显然,A_IN始终反映了A的实际状态,即引脚输入,A_OUT受A_OUT_OE控制,当A_OUT_OE为高的时候A_OUT可以通过三态缓冲器输出到引脚上,即引脚输出。因此,在CPLD/FPGA内部定义A_IN(实际上A_IN就是A),A_OUT,A_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 |
|
|
|
|
|