【发布时间】:2015-12-01 18:50:36
【问题描述】:
所以我听说在不知道协议(或没有控制线)的情况下通过双向数据端口是不可能的。 (见tie two inout together vhdl)
但是,我真的很想这样做,而且我真的不想知道协议。所以...
我想通过 SIM 智能卡(通过电话)传递 DATA 线。目前一切正常,除了 DATA 线,它是双向的。
我尚未确认这一点,但我的范围界定暗示这条线被拉高了,任何一方都可以根据需要将其拉低。我想利用从外部拉高的线。
我想尝试以下注释代码中列出的两个选项:
architecture Behavioral of SIM_Select_Test_A is
begin
process(MOD_CLK, MOD_RST)
begin
SIM_RST <= MOD_RST;
SIM_CLK <= MOD_CLK;
end process;
-- OPTION ONE1
-- process(MOD_CLK, MOD_DATA, SIM_DATA)
-- begin
-- IF MOD_DATA = '0' THEN
-- SIM_DATA <= '0';
-- ELSE
-- IF SIM_DATA = '0' THEN
-- MOD_DATA <= '0';
-- ELSE
-- MOD_DATA <= MOD_DATA;
-- SIM_DATA <= SIM_DATA;
-- END IF;
-- END IF;
-- end process;
-- OPTION 2
-- process(MOD_CLK, MOD_DATA, SIM_DATA)
-- begin
-- IF MOD_DATA = '0' THEN
-- SIM_DATA <= '0';
-- ELSE
-- IF SIM_DATA = '0' THEN
-- MOD_DATA <= '0';
-- ELSE
-- MOD_DATA <= 'Z';
-- SIM_DATA <= 'Z';
-- END IF;
-- END IF;
-- end process;
end Behavioral;
有人可以确认,如果我将 SIM_DATA 驱动为低电平,我将不会陷入第二个 ELSE 并因此将 MOD_DATA 驱动为低电平(即进入一些循环逻辑)
如果我应该追求这条途径或者我是否绝对需要了解协议,任何 cmets。如果是这样,我想我会开始研究:(
提前致谢, 库尔特
编辑: 添加我的实体声明:
entity SIM_Select_Test_A is
Port ( SIM_VCC : OUT STD_LOGIC;
SIM_DATA : inout STD_LOGIC;
SIM_RST : out STD_LOGIC;
SIM_CLK : out STD_LOGIC;
MOD_VCC : in STD_LOGIC;
MOD_DATA : inout STD_LOGIC;
MOD_RST : in STD_LOGIC;
MOD_CLK : in STD_LOGIC);
attribute bufg : string;
attribute bufg of MOD_CLK : signal is "CLK";
attribute bufg of MOD_DATA : signal is "OE";
end SIM_Select_Test_A;
编辑 2: 哇,谢谢这么详细的回复。 是的,我明白你在说什么。我想我希望我可以在代码中添加一些智能,以便了解 CPLD 何时控制线路并优先考虑线路 1。所以你的cmets让我把我的想法正式化,这就是我得到的。为伪代码道歉,但我希望它能让事情更清楚,当我在脑海中编译它时它总是能很好地工作:)
IF (wire1 = '0' AND flag = '0') THEN
wire2 <= '0' <--here wire1 gets priority and wire2 is controlled based on wire1. My hope is that when it is at this point in the code then it does NOT fall into the else statement.
ELSE <-- IF (wire1 is NOT low OR there is a flag) THEN check if wire2 is low (which in my head seems slightly different than elsif
IF (wire2 = '0') THEN
wire1 <= '0';
flag <= '1'; <-- I think this is where there might be a problem. I am trying to use the flag to tell the outer IF that the CPLD holding wire1 low and to ignore it
ELSE <--neither are being held low externally
wire1 <= 'HIZ';
wire2 <= 'HIZ';
flag <= '0';
END IF
END IF;
我会看看我今天是否可以模拟,但感谢您可能拥有的任何 cmet。
【问题讨论】:
-
您对这些陈述有何期待:
MOD_DATA <= MOD_DATA;和SIM_DATA <= SIM_DATA;?能否请您发布实体声明和测试平台。 -
对于那些代码行,我只想让行保持不变。但你是对的——当我更多地看它们时,我更喜欢选项 2 的 HIZ。
-
还将我的实体声明添加到问题中。
标签: vhdl bidirectional