嘿伙计们,我正在尝试交换 2 对 INOUT 信号,但到目前为止没有太多成功。
我有两个 PS/2 控制器,我想交换 PS2(1) 到 PS2(2) 信号,同时交换 PS2(2) 到 PS2(1) 信号。
也许用实际的(狙击的)代码来解释更简单。
-- external ports
ps2_clk_io : inout std_logic := 'Z';
ps2_data_io : inout std_logic := 'Z';
ps2_mouse_clk_io : inout std_logic := 'Z';
ps2_mouse_data_io : inout std_logic := 'Z';
-- signals
signal ps2_mode_s : std_logic := '0';
signal PS2K_DAT_IN : std_logic;
signal PS2K_DAT_OUT : std_logic;
signal PS2K_CLK_IN : std_logic;
signal PS2K_CLK_OUT : std_logic;
signal PS2M_DAT_IN : std_logic;
signal PS2M_DAT_OUT : std_logic;
signal PS2M_CLK_IN : std_logic;
signal PS2M_CLK_OUT : std_logic;
signal ps2_data_out : std_logic;
signal ps2_clk_out : std_logic;
signal ps2_mouse_data_out : std_logic;
signal ps2_mouse_clk_out : std_logic;
-- LOGIC BLOCK
-- PS/2 keyboard
PS2K_DAT_IN <= ps2_data_io when ps2_mode_s = '0' else ps2_mouse_data_io;
PS2K_CLK_IN <= ps2_clk_io when ps2_mode_s = '0' else ps2_mouse_clk_io;
ps2_data_out <= PS2K_DAT_OUT when ps2_mode_s = '0' else PS2M_DAT_OUT;
ps2_clk_out <= PS2K_CLK_OUT when ps2_mode_s = '0' else PS2M_CLK_OUT;
ps2_data_io <= '0' when ps2_data_out = '0' else 'Z';
ps2_clk_io <= '0' when ps2_clk_out = '0' else 'Z';
-- PS/2 Mouse
PS2M_DAT_IN <= ps2_mouse_data_io when ps2_mode_s = '0' else ps2_data_io;
PS2M_CLK_IN <= ps2_mouse_clk_io when ps2_mode_s = '0' else ps2_clk_io;
ps2_mouse_data_out <= PS2M_DAT_OUT when ps2_mode_s = '0' else PS2K_DAT_OUT;
ps2_mouse_clk_out <= PS2M_CLK_OUT when ps2_mode_s = '0' else PS2K_CLK_OUT;
ps2_mouse_data_io <= '0' when ps2_mouse_data_out = '0' else 'Z';
ps2_mouse_clk_io <= '0' when ps2_mouse_clk_out = '0' else 'Z';
如您所见,我想使用控制信号“ps2_mode_s”在鼠标和键盘之间交换信号。如果此信号为“0”,我需要第一个端口上的键盘和第二个端口上的鼠标。如果它是“1”,则相反,第一个端口上的鼠标和第二个端口上的键盘。
我已经尝试了一些变化,但我没有找到合适的解决方案。
(编辑)如果我使用多路复用器,两个端口似乎都不会发送或接收任何数据。
(编辑)所有四个信号都连接到各自的模块。PS2K_DAT_IN、PS2K_CLK_IN、PS2K_DAT_OUT、PS2K_CLK_OUT 进入 ps2 键盘控制器,其他四个 PS2M_DAT_IN、PS2M_CLK_IN、PS2M_DAT_OUT、PS2M_CLK_OUT 进入 ps2 鼠标控制器模块。如果我不使用多路复用器,两个模块都可以工作,将信号直接连接到 INOUT 端口。
PS2K_DAT_IN <= ps2_data_io;
ps2_data_io <= '0' when (PS2K_DAT_OUT = '0') else 'Z';
PS2K_CLK_IN <= ps2_clk_io;
ps2_clk_io <= '0' when (PS2K_CLK_OUT = '0') else 'Z';
PS2M_DAT_IN <= ps2_mouse_data_io;
ps2_mouse_data_io <= '0' when (PS2M_DAT_OUT = '0') else 'Z';
PS2M_CLK_IN <= ps2_mouse_clk_io;
ps2_mouse_clk_io <= '0' when (PS2M_CLK_OUT = '0') else 'Z';
有人可以帮忙吗?