LINUX.ORG.RU

vhdl, помогите разобраться


0

1

Как написать структурную модель, которая должна состоять из компонентов, последовательно соединенных друг с другом?
т.е.
input-->[c0]-->[c1]-->[c2]-->output

Если делать через сигналы и port map, то на c0 будет правильный результат, а на c1,c2 — unsigned. Спасибо.
-------------------------------------------------------------------------------------
Несколько перефразирую вопрос.
Как написать структурную модель компоратора для 8-ми входов на основе компоратора с 2-мя входами?



Последнее исправление: kermzyxer (всего исправлений: 1)

> Если делать через сигналы и port map, то на c0 будет правильный результат, а на c1,c2 — unsigned.

Как написать структурную модель компоратора для 8-ми входов на основе компоратора с 2-мя входами?

ничего не понял. Ты хочешь сделать конвеер на основе блока для сравнения двух сигналов? И какая связь у неправильного результата с unsigned?

xawe
()
Ответ на: комментарий от xawe

Опр. cmp2:

entity cmp2 is
port (a1, a0: in std_logic; -- биты первого числа
b1, b0: in std_logic; -- биты второго числа
ext_e, ext_g, ext_l: in std_logic; -- входы увеличения разрядности
e: out std_logic;  -- equal
g: out std_logic;  -- greater
l: out std_logic); -- less
end cmp2;
cmp8:
architecture struct of cmp8 is

component cmp2 is
port (a1, a0: in std_logic;
b1, b0: in std_logic;
ext_e, ext_g, ext_l: in std_logic;
e, g, l: out std_logic);
end component;

signal comp1_e, comp1_g, comp1_l: std_logic;
signal comp2_e, comp2_g, comp2_l: std_logic;
signal comp3_e, comp3_g, comp3_l: std_logic;
begin

comp3: cmp2 port map (
a(7), a(6), b(7), b(6),
ext_e => '1',
ext_g => '0',
ext_l => '0',
e => comp3_e,
g => comp3_g,
l => comp3_l);

comp2: cmp2 port map (
a(5), a(4), b(5), b(4),
ext_e => comp3_e,
ext_g => comp3_g,
ext_l => comp3_l,
e => comp2_e,
g => comp2_g,
l => comp2_l);

comp1: cmp2 port map (
a(3), a(2), b(3), b(2),
ext_e => comp2_e,
ext_g => comp2_g,
ext_l => comp2_l,
e => comp1_e,
g => comp1_g,
l => comp1_l);

comp0: cmp2 port map (
a(1), a(0), b(1), b(0),
ext_e => comp1_e,
ext_g => comp1_g,
ext_l => comp1_l,
e => e,
g => g,
l => l);

end struct;
Этот код не работает, т.к. сигналы вычисляются параллельно, и всем компораторам, кроме comp3 на вход подается unsigned. Я пытаюсь понять, как сказать на vhdl, что сигналы должны вычисляться последовательно.

kermzyxer
() автор топика
Ответ на: комментарий от kermzyxer

Я пытаюсь понять, как сказать на vhdl, что сигналы должны вычисляться последовательно.

State machine сочини.

mv ★★★★★
()
Ответ на: комментарий от kermzyxer

Я вижу тут асинхронный дизайн. Чтобы вычислять сигналы последовательно нужен тактовый сигнал - тогда можно будет использовать enable флаги и выделять для вычислений каждому компаратору определенный квант времени.

П.С.: unsigned - представление вектора как позитивного числа. Он не может подаваться на входы, так как это просто интерпритация числа.

xawe
()
Ответ на: комментарий от mv

Я уже не знаю, в чем ошибка...
Собственно, вот код:
http://pastebin.com/yiSxp05J
http://pastebin.com/3EM0FTGn
Вот результат симуляции:
http://img64.imageshack.us/img64/2899/feh017953000001screensh.png
Если вы мне укажите на ошибку, буду оч. благодарен.

kermzyxer
() автор топика
Ответ на: комментарий от xawe

Я уже не помню, откуда взял слово 'unsigned'. Просто при сумуляции сигнал отображается красным и стоит буква U. Можете на скриншоте посмотреть.

kermzyxer
() автор топика
Ответ на: комментарий от kermzyxer

Теперь ясно, у тебя проблема в том, что в начале твои сигналы не определены. Установить их можно следующим образом:

signal g1 : std_logic := '0';

это желательно делать, так как иначе modelsim будет ругаться на неопределенные сигналы и поэтому тормозить симуляцию. Но это не главное тут. У тебя асинхронный дизайн - а это не правильно, если ты работаешь с FPGA. Тут нужен сигнал, относительно которого ты считаешь время - тактовый сигнал. В самом простом случае можно добавить только его. Тогда ты будешь знать, что через 4 цикла после установки значений ты получишь правильный ответ. Я ещё добавил testbench(его надо доработать - добавить сигналы и их определение), который генерирует тактовый сигнал. Можешь использовать его как модуль верхнего уровня.

cmp2: http://pastebin.com/nRdg6xw3 cmp8: http://pastebin.com/aLHf4GL9 testbench: http://pastebin.com/XCQYJ4fX

xawe
()
Ответ на: комментарий от xawe

Спасибо за код.

У тебя асинхронный дизайн - а это не правильно, если ты работаешь с FPGA.

Это для универа. Синхронизация в другой лобораторной ))
---------------------------------------------------------------------
Понял в чем была проблема: при симуляции, в библиотеке была старая версия(либо вообще не было) cmp2. Я, однако, не думал, что там используется раздельная компиляция. Добавил в библиотеку cmp2, все заработало. Спасибо за помощь.

kermzyxer
() автор топика

компоратора

граммар-наци должны покарать тебя

Harald ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.