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

VHDL. Можно ли описывать порты в виде массива векторов?

Чтобы можно было назначать на них сигналы в цикле.

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


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

бился в свое время, но был послан, в итоге входные - выходные порты я сделал огромным одномерным вектором размера

число_векторов * размер_вектора. В цикле их и заасийнил.

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


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

Если я правильно понял, то можно и очень просто. Нужно объявить свой многомерный тип в package, и подключать его к каждому файлу где он будет использован.

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


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

Если я правильно понял, то можно и очень просто. Нужно объявить свой многомерный тип в package, и подключать его к каждому файлу где он будет использован.

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

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


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

ISE и Verilog мне написали что входные - выходные порты не могут быть массивами. Может я его не так понял, или может это касается только верилога?

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


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

ISE и Verilog мне написали что входные - выходные порты не могут быть массивами.

 

И правильно сделали. Verilog не имеет такой конструкции. Используйте более свежий SystemVerilog, там это есть.

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


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

а понятно...

ну я не бедствую, массив векторов - суть длинный вектор, это все вопрос представления

разница в индексах

против [i*size -: size]

 

 

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


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

И правильно сделали. Verilog не имеет такой конструкции. Используйте более свежий SystemVerilog, там это есть.

Если речь идёт об ISE, то там этого (поддержки SV) никогда не было и уже не будет. Но эта проблема тоже решаема.

 

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


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

Бодрый день всем. Всех категорически благодарю за отвеы.

Сабжевую задачу, кажется, решил. Не хочется заводить новую тему, поэтому попрошу вашей помощи в этой. В первую очередь обращаюсь к тем, у кого под рукой имеется XILINX ISE. Пожалуйста, посмотрите, что не так в коде.

library IEEE;
Library UNISIM;
use UNISIM.vcomponents.all;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use UNISIM.vcomponents.all;

package vector10x10 is
type vect10 is array(9 downto 0) of std_logic_vector(9 downto 0);
type vect10x10 is array(integer range 9 downto 0) of std_logic_vector(9 downto 0);
end vector10x10;
library IEEE;
Library UNISIM;
use UNISIM.vcomponents.all;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use UNISIM.vcomponents.all;
use vector10x10.all;

entity ADC_147 is

    port(
            generator_p,generator_n:in std_logic;
            clkout_p,clkout_n: out std_logic_vector(9 downto 0);
            clkFromADC_p,clkFromADC_n: in std_logic_vector(9 downto 0);
            adc10in_p ,adc10in_n:in vect10x10;
            adc10out:out vect10x10
    );
end ADC_147;
architecture Behavioral of ADC_147 is
signal clk:std_logic;
signal tmp1, counter, ADCclk : std_logic_vector(9 downto 0);
signal tmp : std_logic_vector(15 downto 0);
signal input, average :vect10x10;

begin
process
begin
    if clk'event and clk = '1' then
        counter <= counter+1;
    end if;
end process;

   IBUFDS_inst : IBUFDS
   port map 
    (
      O => clk,  
      I => generator_p,
      IB => generator_n
   );
qwe:
    for x in 9 downto 0 generate
    clkTO :  OBUFDS
    port map 
    (
        O => clkout_p(x),
        OB => clkout_n(x),
        I => counter(1)
    );
    clkFROM : IBUFDS
    port map
    (
        O => ADCclk(x),
        I => clkFromADC_p(x),
        IB => clkFromADC_n(x)
    );
    ewq: 
        for y in 9 downto 0 generate
        inputs: IBUFDS
        port map 
        (
            O => input(x)(y),
            I => adc10in_p(x)(y),
            IB => adc10in_n(x)(y)
        );
        end generate;

        process
        variable st: integer:=0;
        
        begin
            if ADCclk(x)'event and ADCclk(x) = '1' then
                st:=st+1;
                if st=64 then
                    average(x) <= tmp(15 downto 6);
                    st:=0;
                    tmp <= (others => '0');
                else
                    tmp <= tmp + not input(x);
                end if;
            end if;
        end process;
    end generate;
    adc10out <= average;
end Behavioral;

Синтезатор утверждает, что Multi-source на сигнале tmp. При этом, если убрать последнюю строку, (adc10out <= average;), синтез проходит успешно. Не могу понять, каким образом эта строка портит сигнал tmp. И как вытащить наружу результат, полученный в процессе.

Изменено пользователем Штабскапитан Овечкин

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


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

При этом, если убрать последнюю строку, (adc10out <= average;), синтез проходит успешно.

Ну конечно проходит, ведь синтезатор выкидывает весь неиспользуемый код.

И дело сдесь скорее в generate. Я сомневаюсь, что там так просто можно писать tmp сигналы, скорее уж variable.

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


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

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

 

Удобная вещь, жаль, что Моделсим такое не поддерживает

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


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

Сигнал tmp надо задекларировать внутри generate блока. Когда он снаружи, то его пытаются параллельно изменять несколько экземпляров generate, и, естественно, получается плохо.

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


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

Сигнал tmp надо задекларировать внутри generate блока. Когда он снаружи, то его пытаются параллельно изменять несколько экземпляров generate, и, естественно, получается плохо.
Timmy, благодарю душевно!!! Кажется, полегчало!!! :beer:

 

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


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

Если речь идёт об ISE, то там этого (поддержки SV) никогда не было и уже не будет.

 

Не было не в ISE, а в XST. Но им синтезировать, в общем то, никто насильно не заставляет....

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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