Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разное (электроника) > vhdl множественные источники сигнала


Автор: enzaime 17.7.2014, 09:31
Привет всем, есть вот такой код (компиляция проходит успешно, ошибка при симуляции) (Код специально упрощён)
Код

entity a is
port(clk:in bit);
end entity;
architecture b of a is
type nat_vector is array (natural range<>) of natural;
signal indexes:nat_vector(0 to 3):=(0,2,4,6);
signal rez:nat_vector(0 to 3);
begin
    metka:for i in 0 to 3 generate
     begin
      rez(indexes(i))<=1;
    end generate metka;
end b;

Но если заменить rez(indexes(i))<=1; на  rez(2*i)<=1, то всё норм будет. Мне такой вариант не подходит, т.к. индексы могут быть произвольными например (0,1,4,5) или (1,2,3,2,7,4) так что с помощью только i их задать будет тяжело. Вариант с записью значений в переменную в последовательном цикле, а потом в сигнал мне не подходит, потому что нужна параллельность. Что-то эквивалентное тому, что выше, было бы отлично.

Автор: xvr 18.7.2014, 13:43
Цитата(enzaime @  17.7.2014,  09:31 Найти цитируемый пост)
ошибка при симуляции

Может при синтезе? Симулироваться должно, синтезироваться - нет (независимое присваивание из разных процессов и тем более статическое, одному и тому же сигналу - вещь не синтезируемая)
И вообще код странный  smile 

Автор: enzaime 18.7.2014, 18:18
А чем именно странный?

Добавлено через 2 минуты и 26 секунд
Да и разницы для меня нет на каком этапе ошибка. Интересно как её исправить.

Автор: xvr 18.7.2014, 19:11
Цитата(enzaime @  18.7.2014,  18:18 Найти цитируемый пост)
А чем именно странный?

В том, что он делает.

Цитата(enzaime @  18.7.2014,  18:18 Найти цитируемый пост)
 Интересно как её исправить. 

Пока код выглядит бессмысленным, так что и исправлять нечего. Что вы хотели получить в конце концов?

Автор: enzaime 19.7.2014, 13:11
Хорошо. Теперь так: задача в том, чтобы 4 элемента вектора q заполнились 1, причём индексы элементов могут быть произвольными (случайными), эти индексы сохранены в массиве indexes.  
Код

entity a is
port(
clk:in bit;
q:out bit_vector(0 to 10)
);
end entity;
architecture b of a is
type nat_vector is array (natural range<>) of natural;
signal indexes:nat_vector(0 to 3):=(0,1,5,9);
signal rez:nat_vector(0 to 3);
begin
    metka:for i in 0 to 3 generate
     begin
      q(indexes(i))<='1' when clk='1' and clk'event else clk='0';
    end generate metka;
end b;

Но выскакивает ошибка, что Signal "q" has multiple sources but is not resolved, хотя в массиве indexes нет повторяющихся значений. Вот в этом и проблема.

Автор: xvr 19.7.2014, 18:57
Цитата(enzaime @  19.7.2014,  13:11 Найти цитируемый пост)
Теперь так: задача в том, чтобы 4 элемента вектора q заполнились 1,

А как они будут сбрасываться в '0'? Кроме того, у вас эти присваивания стоят вне какого либо процесса, т.е. они статические. В таком случае действительно нельзя присваивать таким образом - у вас все строки 14 выполняются одновременно, и непонятно, что делать при одновременной записи в один и тот же элемент массива q (и то, что в indexes нет повторяющихся индексов дела не меняет - массив indexes не является константой, так что повторяющиеся элементы появиться могут позже).

Уберите generate и внесите весть цикл for под process и условие if (clk='1' and clk'event), это будет симулироваться, и может быть даже синтезироваться

Автор: enzaime 19.7.2014, 20:05
В примере выше я ошибся здесь:
q(indexes(i))<='1' when clk='1' and clk'event else clk='0';
а хотел написать:
q(indexes(i))<='1' when clk='1' and clk'event else '0';

Про одновременное присваивание, дело в том, что мне именно так и надо, чтобы присваивания происходили одновременно, а с процессом придётся использовать loop for - последовательный оператор. К тому же если изменить в исходном примере q(indexes(i))<='1' when clk='1' and clk'event else '0'; на q(indexes(i))<='1' when clk='1' and clk'event else '0'; , то никакой ошибки нет. Это мне и не ясно, т.к. на мой взгляд принципиально ничего не изменилось.

Автор: xvr 21.7.2014, 12:47
Цитата(enzaime @  19.7.2014,  20:05 Найти цитируемый пост)
q(indexes(i))<='1' when clk='1' and clk'event else '0';

Это у вас какая то дельта функция получится - элемент массива q выдаст импульс нулевой длинны по фронту clk

Цитата(enzaime @  19.7.2014,  20:05 Найти цитируемый пост)
что мне именно так и надо, чтобы присваивания происходили одновременно

Тогда надо убедится, что они (несколько штук) не происходят одновременно в один и тот же элемент массива q, и убедить в этом симулятор  smile 

Или задать http://www.it.kth.se/courses/IL2217/1011/ResolutionFunctions.pdf для одновременной записи для массива q


Автор: enzaime 24.7.2014, 08:44
Я уж не знаю создавать ли новую тему, но у меня появился ещё вопрос.
Вот есть такой код:

Код

use resoution_func.all; 
entity test is
port(
x:in bit;
y:in bit;
z:out res_f integer
);

architecture alg of test is
begin
process(x)
begin
if(x='1' and x'event) then
z<=1;
end if;
end process;

process(y)
begin
if(y='1' and y'event) then
z<=2;
end if;
end process;

end alg;

файл с разрешающей функцией:
Код

package resolution_func is
type integer_vector is array (natural range<>) of integer;
function res_f(data:integer_vector) return integer;
end package resolution_func;

package body resolution_func is
function res_f(data:integer_vector) return integer is
begin
return "последнее измененное значение";
end function;
end package body resolution_func;

как-то возникли проблемы с определением последнего измененного значения. Может я вообще изначально неправильно использую средства языка? Но мне как-то непонятно как сделать так чтобы решение test работало правильно.

Автор: xvr 24.7.2014, 12:59
Попробуйте спросить например http://electronix.ru/forum/index.php?showforum=16. Там такие вопросы гораздо ближе к основному профилю форума  smile 

Автор: enzaime 25.7.2014, 09:07
Спасибо, если найду ответ, то отпишусь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)