我想实现开放收集器协议。当我尝试将inout类型端口设置为上拉的“ 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;
答案 0 :(得分:1)
您需要对上拉电阻建模。在测试台中,为三态信号分配“ H”(驱动一个弱信号):
o_sample_trig <= 'H';
您可能还需要修复第二个过程并为时钟信号添加一个条件。您拥有的可能会模拟,但是可能不会合成为硬件。
答案 1 :(得分:1)
首先重新阅读有关引体向上的文章。这是您解决方案的一半。
第二,关于max_tick的逻辑是错误的。您需要同时处理'H'和1并为0赋值。
printf
答案 2 :(得分:0)
根据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 ------------------------------
使用上面的代码,我设法合成了一个三态缓冲区。