Реализация открытого коллектора и типа данных 'z' - PullRequest
0 голосов
/ 04 февраля 2019

Я хочу реализовать протокол с открытым коллектором.Когда я пытаюсь установить для порта типа 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;

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

согласно книге Педрони, вы не можете использовать входной / выходной порт таким образом, и вы должны настроить буфер Tristate следующим образом:

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 ------------------------------

, используя приведенный выше код, мне удалось фактически синтезировать буфер Tristate.

0 голосов
/ 04 февраля 2019

Сначала перечитайте пост о подтягиваниях.Это половина вашего решения.

Во-вторых, ваша логика в отношении 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;
0 голосов
/ 04 февраля 2019

Вам необходимо смоделировать подтягивающий резистор.В своем испытательном стенде назначьте «H» (управляющий слабым) своему сигналу с тремя состояниями:

o_sample_trig <= 'H';

Возможно, вам также потребуется исправить ваш второй процесс и добавить условие для тактового сигнала.То, что у вас есть, может симулировать, но, скорее всего, оно не будет синтезироваться в аппаратное обеспечение.

...