Перейти к содержанию
    

Подскажите начинающему.. вот написал я прогу на VHDL.. демультиплексор на 64 выхода.. а как делается так что бы эти все выводы были с открытым стоком?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
--use IEEE.numeric_std.ALL;
--use IEEE.STD_LOGIC_unsigned.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;

-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity demultipleksor is
generic (N : natural := 6);
port 
( x: in std_logic_vector(N-1 downto 0); 
       En: in std_logic;
   w : in std_logic; 
     y : out std_logic_vector(2**N-1 downto 0));
end demultipleksor;
architecture Behavioral of demultipleksor is
signal i : integer range 0 to 2**N-1;
       function bin_to_int (signal x : std_logic_vector (N-1 downto 0))
                              return  integer is
               variable sum : integer := 0;
               begin 
               for i in 0 to N-1 loop 
                       if (x(i) = '1' ) then  sum := sum + 2**(i);
                       else null;
                       END IF;
               end loop;
               return sum;
       end bin_to_int;

       function outputS (
                       constant M :  natural;
                       signal j : integer range 0 to 2**N-1 ; 
                       signal w : std_logic) 
                       return std_logic_vector is 
                       variable z : std_logic_vector(2**N-1 downto 0); 
                       begin 
               for k in 0 to 2**M-1 loop 
                               if ( (k = j) and (w='0') ) then  z(k) := '0';
                               else z(k) := '1';
                               end if;
               end loop;
       return z;
       end outputS;

begin

       process (x,En,w)
       begin
       if (En='1') then

       i <= bin_to_int(x);
       y <= outputS(N,i,w);

       else y<=(others=>'1');
       end if;
       end process;

end Behavioral; --Pracue

 

использовать предпологается XA2C128.. написано что выводы поддерживают открытый сток.. вопрос.. так как это активируется.. или это уже по умолчанию?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В смысле чтобы так наружу выходили?

Найдите буфер с 1 входом, 1 выходом и отдельным входом разрешения. Информационный сигнал подавайте на вход разрешения, а на вход буфера - постоянно 0. Тогда при разрешающем сигнале у вас на выходе 0, а при запрещающем - 3-е состояние. Это если ваша ПЛИС сама не поддерживает выходы с открытым стоком (я не такой глубокий спец, и подобных тонкостей не знаю).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

.. вот написал я прогу на VHDL..

:bb-offtopic:

На VHDL описывают "железо". Даже в день программистов.

Изменено пользователем faa

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

:bb-offtopic:

На VHDL описывают "железо". Даже в день программистов.

 

Ок.. написал я прогу на VHDL описывающую железо.. легче стало?)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ок.. написал я прогу на VHDL описывающую железо.. легче стало?)
Это ещё хуже.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В смысле чтобы так наружу выходили?

Найдите буфер с 1 входом, 1 выходом и отдельным входом разрешения. Информационный сигнал подавайте на вход разрешения, а на вход буфера - постоянно 0. Тогда при разрешающем сигнале у вас на выходе 0, а при запрещающем - 3-е состояние. Это если ваша ПЛИС сама не поддерживает выходы с открытым стоком (я не такой глубокий спец, и подобных тонкостей не знаю).

да.. наружу.. хорошая рекомендация.. спасибо. Вот только моя плис именнно поддерживает этот открытый сток. Если брать ваше решение.. то мне для начала нужно синтезировать из моего VHDL описания элемент в Shematic .. и там уже добавить буферы. А вот если копаться только в коде.. вот нашёл на одном из форумов:

 

Переползаю с VHDL на SV. Хочу юзать открытый коллектор. В VHDL для этих целей завел себе пакетик и горя не знал:

library IEEE;
use IEEE.STD_LOGIC_1164.all;

PACKAGE open_collector_package is

   function resolved_open_collector ( s: std_ulogic_vector ) return std_ulogic;

   subtype open_collector is resolved_open_collector std_ulogic;

   type open_collector_vector is array (natural range <>) of open_collector;

   function pullup (sgnl: std_logic) return std_logic;

end open_collector_package;

PACKAGE BODY open_collector_package is

   function pullup (sgnl: std_logic) return std_logic is
   begin
       case sgnl is
           when 'U' => return '1';
           when 'X' => return 'Z';
           when '0' => return 'Z';
           when '1' => return '1';
           when 'Z' => return '1';
           when 'W' => return 'Z';
           when 'L' => return 'Z';
           when 'H' => return 'Z';
           when '-' => return 'Z';
       end case;
   end pullup;

   type opencollector_table is array (std_ulogic, std_ulogic) of std_ulogic;

   constant resolution_opencollector_table : opencollector_table := (
   -----------------------------------------------------------
   --|U    X    0    1    Z    W    L    H    -        |   |
   -----------------------------------------------------------
   ( 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U' ), -- | U |
   ( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ), -- | X |
   ( 'U', 'X', '0', '0', '0', '0', '0', '0', 'X' ), -- | 0 |
   ( 'U', 'X', '0', '1', '1', '1', '1', '1', 'X' ), -- | 1 |
   ( 'U', 'X', '0', '1', 'Z', 'W', 'L', 'H', 'X' ), -- | Z |
   ( 'U', 'X', '0', '1', 'W', 'W', 'W', 'W', 'X' ), -- | W |
   ( 'U', 'X', '0', '1', 'L', 'W', 'L', 'W', 'X' ), -- | L |
   ( 'U', 'X', '0', '1', 'H', 'W', 'W', 'H', 'X' ), -- | H |
   ( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' )  -- | - |
   );

   function resolved_open_collector ( s: std_ulogic_vector ) return std_ulogic is
       variable result :std_ulogic := 'Z';
   begin
       if  (s'length = 1)  then    return s(s'low);
       else
           for i in s'range loop
               result := resolution_opencollector_table(result, s(i));
           end loop;
       end if;
       return result;
   end resolved_open_collector;

end open_collector_package;

 

 

 

Это ещё хуже.

 

А как надо???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот только моя плис именнно поддерживает этот открытый сток.

 

Значит, не будет его имитировать на буфере с третьим состоянием.

И зачем графический редактор, на языке описания аппаратуры будет тоже самое

entity opndr is
port(
  di : in std_logic;
  do : out std_logic
);
end entity;

architecture behavioral of opndr is
begin

with di select
    do <= '0' when '1',
    'Z' when others;

end behavioral;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Переползаю с VHDL на SV. Хочу юзать открытый коллектор. В VHDL для этих целей завел себе пакетик и горя не знал:

Это Вы меня процитировали :) Только если Вам нужен синтезируемый код, пакетик этот бесполезен. Используйте внешние элементы с открытым коллектором/стоком или соответствующим образом сконфигурируйте нужные пины целевой ПЛИС. Первое, имхо, предпочтительнее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Значит, не будет его имитировать на буфере с третьим состоянием.

И зачем графический редактор, на языке описания аппаратуры будет тоже самое

entity opndr is
port(
  di : in std_logic;
  do : out std_logic
);
end entity;

architecture behavioral of opndr is
begin

with di select
    do <= '0' when '1',
    'Z' when others;

end behavioral;

 

Прежде всего спасибо, что ответили. А теперь по делу: в гиде по Xilinx написано: The OPEN_DRAIN constraint applies to Coolrunner™-II devices only.

CoolRunner-II outputs can be configured to drive the primary macrocell output function

as an open-drain output signal on the pin. The OPEN_DRAIN constraint applies to non 3-

state (always active) outputs in the design. The output structure is configured as open-

drain so that a one state on the output signal in the design produces a high-Z on the device

pin instead of a driven High voltage.

 

То есть.. в чём суть? Если я использую CoolRunnner2 то для того, чтобы у меня выходы были с открытым стоком надо соответственно описывать это в коде... как вы показали выше.. или достаточно где-нибудь в настройках проекта указать, что тип выхода с открытым стоком...???

Вообщем там ещё есть вариант с атрибутом.. http://www.xilinx.com/itp/xilinx4/data/doc...o6.html#1015676

Так как же делать.. научите неуча))

И ещё маленький вопрос как к ГУРУ.. есть ли возможность моделировать схемы с ПЛИС.. например как большинство пикконтроллеров в Proteus.. нарисовал схемку.. прошил тот же ПИК.. и посмотрел что как.. или конечный результат работты схемы можно только на реальном макете лицезреть?

 

 

Это Вы меня процитировали :) Только если Вам нужен синтезируемый код, пакетик этот бесполезен. Используйте внешние элементы с открытым коллектором/стоком или соответствующим образом сконфигурируйте нужные пины целевой ПЛИС. Первое, имхо, предпочтительнее.

Да.. точно вас..) Я так понял, что сконфигкурировать в коде нужные пины чтобы они были с ОС можно для любой ПЛИС.. тогда в чём преимущества CoolRunner2 ??

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И ещё маленький вопрос как к ГУРУ.. есть ли возможность моделировать схемы с ПЛИС.. например как большинство пикконтроллеров в Proteus.. нарисовал схемку.. прошил тот же ПИК.. и посмотрел что как.. или конечный результат работты схемы можно только на реальном макете лицезреть?

 

В Xilinx ISE есть симмулятор. Можно проверить как функциональное поведение проектируемой схемы так и близко к реальному (с задержками на каждом элементе).

Все зависит от того, на каком этапе компиляции Вы остановились. Если Вы сделали Place&Route то будете симулировать близко к оригиналу. Если не дошли - функциональное тестирование.

 

The OPEN_DRAIN constraint applies to Coolrunner™-II devices only.

CoolRunner-II outputs can be configured to drive the primary macrocell output function

as an open-drain output signal on the pin. The OPEN_DRAIN constraint applies to non 3-

state (always active) outputs in the design. The output structure is configured as open-

drain so that a one state on the output signal in the design produces a high-Z on the device

pin instead of a driven High voltage.

 

Вы сами ответили на свой вопрос. :) установите номера выходам мультиплексора в файле *.ucf и там же опишите их как open-drain. При компиляции, если мне память не изменяет, этот файл подхватится и constraints применятся. Возможно, его придется переименовать так же, как и имя проекта. Файл должен находиться в корне папки с проектом. Или проще, приатачте файл к проекту (правой кнопкой в ProjectManagere -> Add file).

 

Вроде так. Все по памяти, возможно где-то неточность, но в принципе идея такая... :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если я использую CoolRunnner2 то для того, чтобы у меня выходы были с открытым стоком надо соответственно описывать это в коде... как вы показали выше.. или достаточно где-нибудь в настройках проекта указать, что тип выхода с открытым стоком...???

Описывать в коде, как показали выше, а также в файле ограничений (*.ucf) (там, где номера пинов назначаются) нужно объяснить трассировщику, чтобы нужные пины конфигурировались с открытым стоком. Синтаксис смотрите в Language Templates в ISE(Web Pack). Впрочем, вот:

# OPEN_DRAIN indicates that an output buffer will be configured as open-drain.

NET mysignal OPEN_DRAIN; 

# Families: CR-II 
# 
# Applies to non-tristate output or to tristate output in which the data 
# the input to output buffer is dangling or driven by constant 0 (GND).

 

Я так понял, что сконфигкурировать в коде нужные пины чтобы они были с ОС можно для любой ПЛИС.. тогда в чём преимущества CoolRunner2 ??

Нет, далеко не для любой. Именно для CR-II - можно.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В Xilinx ISE есть симмулятор. Можно проверить как функциональное поведение проектируемой схемы так и близко к реальному (с задержками на каждом элементе).

Все зависит от того, на каком этапе компиляции Вы остановились. Если Вы сделали Place&Route то будете симулировать близко к оригиналу. Если не дошли - функциональное тестирование.

Про встроенный симулятор я знаю.. (сам я ModelSim использую).. я про моделирование не только плис.. а самой схемы, где используетс ПЛИС)

 

И ещё.. тот же Xilinx пишет:

Before using OPEN_DRAIN, declare it with the following syntax:

attribute OPEN_DRAIN: string;

After OPEN_DRAIN has been declared, specify the VHDL constraint as follows:

attribute OPEN_DRAIN of signal_name : signal is "TRUE";

 

Так может просто в тексте кода в архтектуре написать:

...
attribute OPEN_DRAIN: string;
attribute OPEN_DRAIN of y : signal is "TRUE";
...

Оно даже прокомпилилось)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Про встроенный симулятор я знаю.. (сам я ModelSim использую).. я про моделирование не только плис.. а самой схемы, где используетс ПЛИС)

 

Когда-то, во времена мамонтов, я еще использовал OrCAD v7.2 и там рисовал схемки и клеил к ним ПЛИС. Так вот, при симуляции, OrCAD сам подгружал компилятор Altera, получал описание скомпиленой схемы в EDIF файле и симулировал мне всю схему с ПЛИС. Не вижу причин, что через 12 лет все стало хуже.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Описывать в коде, как показали выше, а также в файле ограничений (*.ucf) (там, где номера пинов назначаются) нужно объяснить трассировщику, чтобы нужные пины конфигурировались с открытым стоком. Синтаксис смотрите в Language Templates в ISE(Web Pack). Впрочем, вот:

# OPEN_DRAIN indicates that an output buffer will be configured as open-drain.

NET mysignal OPEN_DRAIN; 

# Families: CR-II 
# 
# Applies to non-tristate output or to tristate output in which the data 
# the input to output buffer is dangling or driven by constant 0 (GND).

Простите за дотошность.

В итоге мой код будет выглядеть так????:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity demultipleksor is
generic (N : natural := 6);
port 
( x: in std_logic_vector(N-1 downto 0); 
En: in std_logic;
   w : in std_logic; 
     y : out std_logic_vector(2**N-1 downto 0));
end demultipleksor;


architecture Behavioral of demultipleksor is
signal i : integer range 0 to 2**N-1;

function bin_to_int (signal x : std_logic_vector (N-1 downto 0))
                              return  integer is
	variable sum : integer := 0;
	begin 
	for i in 0 to N-1 loop 
		if (x(i) = '1' ) then  sum := sum + 2**(i);
		else null;
		END IF;
	end loop;
	return sum;
end bin_to_int;

function outputS (
		constant M :  natural;
		signal j : integer range 0 to 2**N-1 ; 
		signal w : std_logic) 
		return std_logic_vector is 
		variable z : std_logic_vector(2**N-1 downto 0); 
		begin 
	for k in 0 to 2**M-1 loop 
			if ( (k = j) and (w='0') ) then  z(k) := '0';
			else z(k) := 'Z';  -------ВОТ
			end if;
	end loop;
return z;
end outputS;

begin

process (x,En,w)
begin
if (En='1') then

i <= bin_to_int(x);
y <= outputS(N,i,w);

else y<=(others=>'Z');  ----и ВОТ
end if;
end process;

end Behavioral; --Pracue

Плюс добавленный файл *.ucf в котором:

OPEN_DRAIN indicates that an output buffer will be configured as open-drain.

NET y(0) OPEN_DRAIN; 
... 
NET y(63) OPEN_DRAIN; 
# Families: CR-II 
# 
# Applies to non-tristate output or to tristate output in which the data 
# the input to output buffer is dangling or driven by constant 0 (GND).

Изменено пользователем brucemax

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...