关于Inout 加第三端问题
补充:FIFO和寄存器用的都是一个数据线传输
既然你有片选信号,那不就简单啦
问题描述不清楚。为什么问问题前不先整理下语言呢?
可以看一下论坛里边关于双向口的仿真,这个问题不是现在才有的啦。
小编,你说的是不是三态逻辑啊? 一般fpga到mcu寄存器交互都用local bus总线,这上面就有个三态逻辑。
如果是xilinx的fpga,你直接用iobuf就可以了,你可以找下相关资料。如果是altera的片子,那下面这段逻辑你参考下,这个是带了一级锁存器的,(不带锁存器的就你把那个打一拍的process,就是那个creat flipflops的process,不要就可以了):
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY bidir IS
PORT(
bidir : INOUT STD_LOGIC_VECTOR (7 DOWNTO 0);
oe, clk : IN STD_LOGIC;
inp : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
outp : OUT STD_LOGIC_VECTOR (7 DOWNTO 0));
END bidir;
ARCHITECTURE maxpld OF bidir IS
SIGNAL a : STD_LOGIC_VECTOR (7 DOWNTO 0); -- DFF that stores
-- value from input.
SIGNAL b : STD_LOGIC_VECTOR (7 DOWNTO 0); -- DFF that stores
BEGIN -- feedback value.
PROCESS(clk)
BEGIN
IF clk = '1' AND clk'EVENT THEN -- Creates the flipflops
a <= inp;
outp <= b;
END IF;
END PROCESS;
PROCESS (oe, bidir) -- Behavioral representation
BEGIN -- of tri-states.
IF( oe = '0') THEN
bidir <= "ZZZZZZZZ";
b <= bidir;
ELSE
bidir <= a;
b <= bidir;
END IF;
END PROCESS;
END maxpld;
希望对你有帮助~
补一个verilog的,刚才没看到你要的是verilog的
module bidirec (oe, clk, inp, outp, bidir);
// Port Declaration
input oe;
input clk;
input [7:0] inp;
output [7:0] outp;
inout [7:0] bidir;
reg [7:0] a;
reg [7:0] b;
assign bidir = oe ? a : 8'bZ ;
assign outp = b;
// Always Construct
always @ (posedge clk)
begin
b <= bidir;
a <= inp;
end
endmodule
