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

Какой симулятор использовать

На VHDL сделал суматор с переменным числом слагаемых. Параметры задаются через generic map. Синтез проходит на УРА! при всех значенияях, но симуляция в ModelSime 5.7(из WebPack 6.3) выбрасывает ошибку. По моему в моделсиме не полностью реализован оператор for ___ generate.

Что посоветуете? По другому описать данный компонент? Другой симулятор?

 

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

 

entity conveyer is

generic (WIDTH : natural:= 4;

INPORTS : natural:=6);

port ( CLK : in std_logic;

DATA_IN : in std_logic_vector(WIDTH*INPORTS - 1 downto 0);

DATA_EN : in std_logic;

DATA_OUT : out std_logic_vector(WIDTH - 1 downto 0));

end conveyer;

 

architecture Behavioral of conveyer is

 

function getst (INPORTS : in natural) return natural is

variable st : natural;

begin

st := 0;

while 2**st < INPORTS loop

st := st + 1;

end loop;

return st;

end;

constant CONN : natural := getst(INPORTS);

type ar is array (1 to 2**(CONN+1) - 1) of std_logic_vector(WIDTH - 1 downto 0);

signal data:ar;

begin

 

ge1: for i in 1 to CONN generate

process(CLK)

variable num: natural;

begin

if rising_edge(CLK) then

if DATA_EN = '1' then

num := 0;

cl1: for j in 1 to 2**(i - 1) loop

data(2**(i-1)+(j-1)) <= data(2**i+num)+data(2**i+num+1);

num := num + 2;

end loop;

end if;

end if;

end process;

end generate;

 

gen2: for i in 1 to 2**CONN generate

data(2**CONN + i - 1) <= DATA_IN(i*WIDTH - 1 downto (i-1)*WIDTH) when i < (INPORTS + 1) else (others=>'0');

end generate;

 

DATA_OUT <= data(1);

end Behavioral;

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

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


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

На VHDL сделал суматор с переменным числом слагаемых. Параметры задаются через generic map. Синтез проходит на УРА! при всех значенияях,

но симуляция в ModelSime 5.7(из WebPack 6.3) выбрасывает ошибку.

Лето в разгаре, телепаты в отпусках. Почему вы не потрудились привести текст ошибки? Если вы просите помощи, то почему не предоставляете максимум информации? Очень часто это помогает найти решение прямо в первой итерации, а не вытягивать клещами информацию постепенно.

 

По моему в моделсиме не полностью реализован оператор for ___ generate.

Вы ошибаетесь. Все там реализовано нормально.

 

Что посоветуете? По другому описать данный компонент? Другой симулятор?

Попробую угадать..

 

use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

Ну, во-первых, забудьте про эти библиотеки. Только numeric_std.

 

gen2: for i in 1 to 2**CONN generate
         data(2**CONN + i - 1) <= DATA_IN(i*WIDTH - 1 downto (i-1)*WIDTH) when i < (INPORTS + 1) else (others=>'0');
end generate;

Здесь ошибка? Так делать не надо. Надо так:

gen2: for i in 1 to 2**CONN generate
         genLess: if i < (INPORTS + 1) generate
                   data(2**CONN + i - 1) <= DATA_IN(i*WIDTH - 1 downto (i-1)*WIDTH);
         end generate;

         genMore: if i >= (INPORTS + 1) generate
                   data(2**CONN + i - 1) <= (others=>'0');
         end generate;
  end generate;

 

Такой же вопрос обсуждается тут: http://groups.google.com/group/comp.lang.v...161d5e3fac606/#

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


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

...

"Ну, во-первых, забудьте про эти библиотеки. Только numeric_std."

...

Это почему?! Аргументы...

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


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

...

"Ну, во-первых, забудьте про эти библиотеки. Только numeric_std."

...

Это почему?! Аргументы...

 

Numeric_std - детище IEEE и входит в стандарт, а std_logic_signed(_arith) и т.п. - это плод Synopsys и стандартом не является.

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


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

А не могли бы поделиться описанием на Numeric_std?

Я лучшего описания, чем сам код, предложить не могу: http://www.vhdl.org/vhdlsynth/vhdl/numeric_std.vhd

Все очень хорошо видно, какие фуникции, как перегружены...

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


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

Ну, во-первых, забудьте про эти библиотеки. Только numeric_std.

 

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

Xilinx при генерации шаблона user core сразу их подключает.

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


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

Стандартный пакет IEEE.NUMERIC_STD рекомендован для применения в новых проектах.

Это означает, что если новый проект является частично наследуемым из более ранних

проектов/версий, где использовались IEEE.STD_LOGIC_ARITH и

IEEE.STD_LOGIC_UNSIGNED, то надо пользоваться двумя правилами:

1. В библиотечных элементах в их интерфейсах использовать, по возможности,

только std_logic<_vector>, что и делают Altera и Xilinx при генерации

своих коров.

2. Но eсли только возникает необходимость в конвертации типов,

использованных из разных библиотек - делать это отдельно и аккуратно.

Например, signed в ieee.std_logic_arith и в ieee.numeric_std формально совершенно

разные типы.

 

Никаких глюков в никаких из этих билиотеках нет.

Поэтому какие из них использовать в своем проекте, в конце концов, дело вкуса.

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


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

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

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

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

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

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

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

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

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

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