首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于INOUT端口的Mux

用于INOUT端口的Mux
EN

Stack Overflow用户
提问于 2018-07-25 22:05:24
回答 2查看 988关注 0票数 0

嘿,伙计们,我正试着交换2对INOUT信号,但到目前为止没有多少成功。

我有两个PS/2控制器,我想交换PS2(1)到PS2(2)信号,同时把PS2(2)交换到PS2(1)信号。

也许用实际的(狙击)代码来解释比较简单。

代码语言:javascript
复制
-- 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”,则选择“1”,鼠标放在第一个端口上,键盘放在第二个端口。

我已经试过了一些变体,但我没有找到合适的解决方案。

(编辑)如果使用mux,两个端口似乎都不会发送或接收任何数据。

(编辑)所有四个信号都连接到各自的模块。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鼠标控制器模块。如果我不使用mux,两个模块都可以工作,直接将信号连接到INOUT端口。

代码语言:javascript
复制
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';

有人能帮忙吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-27 15:41:35

诀窍是在每个双向引脚缓冲器之前放置两个复用器(一个用于输入,一个用于输出)。

代码语言:javascript
复制
library ieee;
use ieee.std_logic_1154.all;

entity PS2Switch is
    port(
        -- control
        mode_s : in std_logic;
        -- keyboard ps/2 block
        kbd_clk_in   : in  std_logic;
        kbd_clk_out  : out std_logic;
        kbd_data_in  : in  std_logic;
        kbd_data_out : out std_logic;
        -- mouse ps/2 block
        mouse_clk_in   : in  std_logic;
        mouse_clk_out  : out std_logic;
        mouse_data_in  : in  std_logic;
        mouse_data_out : out std_logic;
        --port A
        prtA_clk  : inout std_logic;
        prtA_data : inout std_logic;
        --port B
        prtB_clk  : inout std_logic;
        prtB_data : inout std_logic
        );
end entity;

architecture rtl of PS2Switch is
    signal prtA_clk_out  : std_logic;
    signal prtA_data_out : std_logic;
    signal prtB_clk_out  : std_logic;
    signal prtB_data_out : std_logic;
begin
    -- output muxes
    kbd_clk_out    <= prtA_clk  when mode_s = '0' else prtB_clk;
    kbd_data_out   <= prtA_data when mode_s = '0' else prtB_data;
    mouse_clk_out  <= prtA_clk  when mode_s = '1' else prtB_clk;
    mouse_data_out <= prtA_data when mode_s = '1' else prtB_data;

    -- input muxes
    prtA_clk_out  <= kbd_clk_in  when mode_s = '0' else mouse_clk_in;
    prtA_data_out <= kbd_data_in when mode_s = '0' else mouse_data_in;
    prtB_clk_out  <= kbd_clk_in  when mode_s = '1' else mouse_clk_in;
    prtB_data_out <= kbd_data_in when mode_s = '1' else mouse_data_in;

    -- tristate buffers (output pins)
    prtA_clk  <= '0' when prtA_clk_out  = '0' else 'Z';
    prtA_data <= '0' when prtA_data_out = '0' else 'Z';
    prtB_clk  <= '0' when prtB_clk_out  = '0' else 'Z';
    prtB_data <= '0' when prtB_data_out = '0' else 'Z';
end architecture;
票数 0
EN

Stack Overflow用户

发布于 2018-07-26 07:53:03

这是你在里面的信号混在一起。我想在这件事上我会更喜欢一个示意图。不幸的是,该选项在SE站点上不可用(就像在EE站点上一样)。

从第一眼看,我的印象是,你在那里试图建立一个双向的路径通过一个FPGA。我试图跟踪发生的事情,但失败了。

我被困住了,因为你从来不给PS2K_CLK_OUT分配一个值,但是你确实使用了这个信号。PS2K_DAT_OUT也是如此。因此,代码显然存在缺陷。我建议您修复这个部分,并通过添加更多的类型的注释,使跟踪所发生的事情变得更容易:

代码语言:javascript
复制
-- Mode A: Data comes from X and goes to Y

一般而言:

据我所知,通过FPGA构建真正的双向路径是不可能的。(真的,我的意思是自己决定信号的方向)。您需要一个在输入和输出模式之间切换端口的信号。如果这是您需要的,您唯一的选择是使用外部模拟开关或继电器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51528347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档