Vhdl 用于输入输出端口的多路复用器

Vhdl 用于输入输出端口的多路复用器,vhdl,fpga,inout,Vhdl,Fpga,Inout,嘿,伙计们,我正试着交换两对输入输出信号,但到目前为止还没有成功 我有两个PS/2控制器,我想交换PS2(1)到PS2(2)信号,同时交换PS2(2)到PS2(1)信号 也许用实际的(被剪掉的)代码来解释更简单 ——外部端口 ps2时钟io:inout标准逻辑:='Z'; ps2_数据_io:inout标准_逻辑:='Z'; ps2_鼠标_时钟_io:inout标准逻辑:='Z'; ps2_鼠标_数据_io:inout标准_逻辑:='Z'; --信号 信号ps2_模式:标准逻辑:='0'; 信号

嘿,伙计们,我正试着交换两对输入输出信号,但到目前为止还没有成功

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

也许用实际的(被剪掉的)代码来解释更简单

——外部端口
ps2时钟io:inout标准逻辑:='Z';
ps2_数据_io:inout标准_逻辑:='Z';
ps2_鼠标_时钟_io:inout标准逻辑:='Z';
ps2_鼠标_数据_io:inout标准_逻辑:='Z';
--信号
信号ps2_模式:标准逻辑:='0';
信号PS2K_数据输入:标准逻辑;
信号PS2K_数据输出:标准逻辑;
信号PS2K_时钟输入:标准逻辑;
信号PS2K_CLK_OUT:标准逻辑;
信号PS2M_数据输入:标准逻辑;
信号PS2M_数据输出:标准逻辑;
信号PS2M_时钟输入:标准逻辑;
信号PS2M_CLK_OUT:标准逻辑;
信号ps2_数据_输出:标准逻辑;
信号ps2_clk_out:标准逻辑;
信号ps2 \鼠标\数据\输出:标准\逻辑;
信号ps2_鼠标_clk_out:标准逻辑;
--逻辑块
--PS/2键盘

PS2K_DAT_IN这是一个相当混乱的信号组合。我想在这方面,我更喜欢一个示意图。不幸的是,该选项在SE站点上不可用(就像在EE站点上一样)

我第一眼就觉得你在哪里 尝试通过FPGA构建双向路径。我试图了解发生了什么,但失败了

我被卡住了,因为你从来没有给PS2K\U CLK\U OUT赋值,但你确实使用了信号。对于
PS2K\u DAT\u OUT
也一样。因此,代码肯定是有缺陷的。 我建议您修复该部分,并通过添加以下类型的注释来更轻松地了解正在发生的事情:

-- Mode A: Data comes from X and goes to Y
一般来说:

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

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

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;
ieee库;
使用ieee.std_logic_1154.all;
实体PS2Switch为
港口(
--控制
模式:在标准逻辑中;
--键盘ps/2块
kbd_clk_in:标准逻辑中;
kbd_clk_out:输出标准逻辑;
kbd_数据_输入:标准逻辑中;
kbd_数据_输出:输出标准逻辑;
--鼠标ps/2块
鼠标锁定输入:在标准逻辑中;
鼠标锁定输出:输出标准逻辑;
鼠标数据输入:标准逻辑;
鼠标数据输出:输出标准逻辑;
--A港
prtA_clk:inout标准逻辑;
prtA_数据:inout标准_逻辑;
--B港
prtB_clk:inout标准逻辑;
prtB_数据:输入输出标准_逻辑
);
终端实体;
PS2Switch的体系结构rtl是
信号prtA_clk_out:标准逻辑;
信号prtA_数据输出:标准逻辑;
信号prtB_clk_out:标准逻辑;
信号prtB_数据_输出:标准逻辑;
开始
--输出多路复用器

欢迎收看StackOverflow。你可以,也许,访问,以更好地了解如何提出好的问题,特别是,什么是a。例如,您的问题甚至没有清楚地描述您遇到的问题(错误消息、不想要的行为…),而这是绝对必要的。对不起,我完全忘了写关于这个问题的内容。如果我使用mux,这两个端口似乎都不会发送或接收任何数据。也许您可以提供一个示例,以及您在实现或模拟中是否有问题。如果是实施,供应商的特定工具链和修订版。综合的支持语言为IEEE Std 1076-2008、16.8.2.4.10高阻抗值(“Z”)的解释、IEEE Std 1076.6-2004(撤销)6.3.1“Z”分配的三态逻辑。FPGA合成可能取决于分配目标是设备引脚(例如Vivado将内部信号“Z”分配转换为等效逻辑)。如果是模拟,MCVe将允许检查特定问题。谢谢您的回答。所有四个信号都连接到相应的模块。PS2K_DAT_IN、PS2K_CLK_IN、PS2K_DAT_OUT、PS2K_CLK_OUT传输至ps2键盘控制器,其他四个信号传输至ps2鼠标模块。在这两种情况下,如果我不使用多路复用器,直接将模块连接到输入输出端口,它都可以工作。
-- Mode A: Data comes from X and goes to Y
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;