fpga三态总线实现

fpga代码设计中,记得有一条“原则”,对于三态口,尽量在顶层模块使用三态,不要在内部子模块使用三态,不然会带来一系列问题,之前也是一直按照这个原则来设计代码的,图然然有点好奇,计算机中,挂在总线上的模块大多是三态的,相当于是一个个具有三态的子模块通过一个顶层连接到外部,那么作为使用硬件互联的FPGA也应该具有这样的能力,于是,使用Verilog写了段实现三态总线的代码。使用Quartus9.1编译,观察生成的RTL电路,验证想法。

首先设计具有三态口的子模块。,代码如下

module tricompoment1(
                    Clk,
                    iodata,
                    odata,
                    outen
);
input Clk;
input outen;
output [7:0]odata;
inout [7:0]iodata;
reg[7:0] data1,odata;
assign iodata=(outen)?data1:8'hzz;
always@(posedge Clk)
begin
   data1<=data1+8'd1;
   odata<=iodata;
end
endmodule
然后在顶层将具有三态口的多个模块相连,使得FPGA的引脚成为类似三态总线的存在。

module tribus(
               Clk,
               iodata,
               odata1,
               odata2
);
input Clk;
inout [7:0]iodata;
output[7:0] odata1,odata2;
wire[7:0]iodata;
reg outen1,outen2;
tricompoment1 tricomp1(
                        .Clk(Clk),
                        .iodata(iodata),
                        .odata(odata1),
                        .outen(outen1)
);
tricompoment1 tricomp2(
                        .Clk(Clk),
                        .iodata(iodata),
                        .odata(odata2),
                        .outen(outen2)
);
always@(posedge Clk)
begin
   outen1<=~outen1;
   outen2<=outen1;
end
endmodule
最终得到的RTL电路结构如图

fpga三态总线实现_第1张图片

模块内部结构如图
fpga三态总线实现_第2张图片
这样iodata引脚就成为三态总线的一部分啦,本人系新手,有什么不对的地方,希望大家批评指正~

你可能感兴趣的:(fpga三态总线实现)