Vhdl 实现开放式收集器和';z';数据类型

Vhdl 实现开放式收集器和';z';数据类型,vhdl,xilinx-ise,Vhdl,Xilinx Ise,我想实现开放收集器协议。当我尝试将inout type port设置为“Z”值时,它只是继续保持以前的值。为了说明,我刚刚编写了以下VHDL代码,首先将o_sample_trig设置为0,然后设置为“z”(高阻抗)状态,因为o_sample_trig引脚被拉起,它应该立即变为“1”状态,但继续发送“0”!请告诉我 library IEEE; use IEEE.STD_LOGIC_1164.ALL; --******************************************** en

我想实现开放收集器协议。当我尝试将inout type port设置为“Z”值时,它只是继续保持以前的值。为了说明,我刚刚编写了以下VHDL代码,首先将o_sample_trig设置为0,然后设置为“z”(高阻抗)状态,因为o_sample_trig引脚被拉起,它应该立即变为“1”状态,但继续发送“0”!请告诉我

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
--********************************************
entity TopLvl is
port(
    clk,reset : in std_logic;
    max_tick: out std_logic;
    o_sample_trig: inout std_logic
    );
 end TopLvl;
 --***************************************************
architecture Behavioral of TopLvl is
signal timer1_reg,timer1_next : integer range 0 to 23999999:=0;
 attribute PULLUP: string;
 attribute PULLUP of o_sample_trig : signal is "TRUE";

begin

process ( clk ,reset)
begin
        if(reset ='1') then
            timer1_reg <= 0;
        elsif ( clk'event and clk='1' ) then 
             timer1_reg <= timer1_next;
        end if;
end process;

 --**************************************************       
  process ( clk ,timer1_reg)
  begin

            Timer1_next <= timer1_reg+1;


        if (timer1_reg >= 100 and timer1_reg < 150)  or (timer1_reg >= 200 and timer1_reg < 225) or (timer1_reg = 300) then 
            o_sample_trig<='0';
        elsif (timer1_reg >= 150 and timer1_reg < 200) or (timer1_reg >= 225 and timer1_reg < 300) or (timer1_reg >= 400) then
            o_sample_trig<='Z';
        end if;         
        if (timer1_reg >= 151 and timer1_reg < 199 and o_sample_trig = '1') then
            max_tick<= '1';
        end if;

end process;


end Behavioral;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
--********************************************
实体TopLvl是
港口(
时钟,复位:在标准逻辑中;
最大勾选:输出标准逻辑;
o_样本触发:输入输出标准逻辑
);
端到端;
--***************************************************
TopLvl的体系结构是
信号定时器1_reg,定时器1_next:整数范围0至2399999:=0;
属性PULLUP:string;
o_sample_trig属性上拉:信号为“真”;
开始
过程(时钟、复位)
开始
如果(reset='1'),则

timer1_reg您需要对上拉电阻器进行建模。在测试台上,为您的三态信号指定“H”(驾驶弱信号):

o_sample_trig <= 'H';

o_sample_trig您需要对上拉电阻器进行建模。在测试台上,为您的三态信号指定“H”(驾驶弱信号):

o_sample_trig <= 'H';

o_sample_trig根据Pedroni的书,您不能以这种方式使用输入/输出端口,您应该按照以下方式配置三态缓冲区:

1 ------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ------------------------------
5 ENTITY bidir IS
6 PORT (a, b: IN STD_LOGIC;
7 c: INOUT STD_LOGIC;
8 d: OUT STD_LOGIC);
9 END ENTITY;
10 ------------------------------
11 ARCHITECTURE arch1 OF bidir IS
12 BEGIN
13 c <= a WHEN b='1' ELSE 'Z';
14 d <= c;
15 END ARCHITECTURE;
16 ------------------------------
17 ARCHITECTURE arch2 OF bidir IS
18 BEGIN
19 PROCESS (a, b)
20 BEGIN
21 d <= c;
22 IF (b='1') THEN c <= a;
23 ELSE c <= 'Z';
24 END IF;
25 END PROCESS;
26 END ARCHITECTURE;
27 ------------------------------
1------------------------------
2图书馆;
3使用ieee.std_logic_1164.all;
4 ------------------------------
5实体bidir为
6端口(a、b:标准逻辑中;
7c:输入输出标准逻辑;
8 d:输出标准逻辑);
9终端实体;
10 ------------------------------
11比迪尔的建筑拱门1为
12开始

13 c根据Pedroni的书,您不能以这种方式使用输入/输出端口,您应该以以下方式配置三态缓冲区:

1 ------------------------------
2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 ------------------------------
5 ENTITY bidir IS
6 PORT (a, b: IN STD_LOGIC;
7 c: INOUT STD_LOGIC;
8 d: OUT STD_LOGIC);
9 END ENTITY;
10 ------------------------------
11 ARCHITECTURE arch1 OF bidir IS
12 BEGIN
13 c <= a WHEN b='1' ELSE 'Z';
14 d <= c;
15 END ARCHITECTURE;
16 ------------------------------
17 ARCHITECTURE arch2 OF bidir IS
18 BEGIN
19 PROCESS (a, b)
20 BEGIN
21 d <= c;
22 IF (b='1') THEN c <= a;
23 ELSE c <= 'Z';
24 END IF;
25 END PROCESS;
26 END ARCHITECTURE;
27 ------------------------------
1------------------------------
2图书馆;
3使用ieee.std_logic_1164.all;
4 ------------------------------
5实体bidir为
6端口(a、b:标准逻辑中;
7c:输入输出标准逻辑;
8 d:输出标准逻辑);
9终端实体;
10 ------------------------------
11比迪尔的建筑拱门1为
12开始

13c首先重新阅读关于引体向上的帖子。这是你解决方案的一半

其次,你关于max_tick的逻辑是错误的。您需要处理“H”和1,并为0分配一个赋值

    if (timer1_reg >= 151 and timer1_reg < 199 and to_x01(o_sample_trig) = '1') then
        max_tick <= '1';
    else
        max_tick <= '0';
    end if;
如果(timer1_reg>=151,timer1_reg<199,to_x01(o_sample_trig)='1'),则

max_tick首先重新阅读关于引体向上的帖子。这是你解决方案的一半

其次,你关于max_tick的逻辑是错误的。您需要处理“H”和1,并为0分配一个赋值

    if (timer1_reg >= 151 and timer1_reg < 199 and to_x01(o_sample_trig) = '1') then
        max_tick <= '1';
    else
        max_tick <= '0';
    end if;
如果(timer1_reg>=151,timer1_reg<199,to_x01(o_sample_trig)='1'),则


max_tick灵敏度列表在第二个过程中不完整。我看不出有任何理由将
clk
包括在灵敏度列表中,灵敏度列表中缺少
o\u sample\u trig
。不,这不是问题所在:(在第二个过程中,灵敏度列表不完整。我看不出有任何理由将
clk
包括在灵敏度列表中,灵敏度列表中缺少
o\u sample\u trig
。不,这不是问题所在:(根据pedroni的书,“H”将被合成为“1”。它不起作用。我认为Charles的建议是,如果你有一个开放式收集器,那么必须在某个地方有一个上拉-例如电路板、IO单元或测试台。尽管如此,这必须建模才能进行模拟。因此,正如Charles所建议的,也许你需要这样做在你的测试台上有吗?因为测试台不是合成的,这很好,但也可以看到下面,因为这只是解决方案的一半。我根本不尝试设计用于模拟的电路。我想要的是我想知道为什么在现实世界中输入端口不接收输入!是的,我确实尝试使用物理上拉。除了“H”状态被定义为仅用于模拟。我自己已经回答了这个问题,问题是我配置三态缓冲区的方式。如果max tick不是您关注的一部分,那么在这里发布一个不包括它的最小完整示例以供审阅。根据pedroni的书,“H”将合成为“1”。它不起作用。我认为rles的建议是,如果你有一个开放式采集器,那么必须在某个地方有一个上拉-例如电路板、IO单元或测试台。尽管如此,必须对其进行建模才能进行模拟。因此,正如Charles所建议的,也许你需要将其放在测试台上?因为测试台不是合成的,所以这很好,but还可以看到下面的内容,因为这只是解决方案的一半。我根本不尝试为模拟设计电路。我想知道的是,为什么我的输出端口在现实世界中不接收输入!是的,我确实尝试使用物理上拉。此外,“H”状态被定义为仅用于模拟。我自己已经回答了这个问题,问题是我配置三态缓冲区的方式如果max tick不是您关注的一部分,那么在这里发布一个最小的完整示例以供查看,但不包括它。这不是我想要做的,我想在timer1_reg>=100和timer1_reg<150间隔期间通过o_sample_trig端口发送0,然后在tim期间从同一端口接收输入er1_reg>=150和timer1_reg<200间隔。我不想触发max_tick。我刚才提到max_tick是为了合成工具不忽略此端口。我已经阅读了pull up,这是我从中构思的,请提供建议。我自己已经回答了这个问题,问题是如果您离开max_tick logi,我配置三态缓冲区的方式事实上,它从“X”(在某些技术中可以是1)开始,然后分配给1。它从来都不是0。因此,它不是我们大多数人都希望在评论中使用或允许使用的那种硬件。这不是我想做的,我想发送0 t