реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Множественный доступ к одному сигналу, Проблема (VHDL)
Muscat
сообщение Apr 12 2010, 12:13
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 277
Регистрация: 8-04-09
Из: Москва
Пользователь №: 47 382



В начале пути изучения VHDL, пишу простенькую программу следующего содержания

По приходу инициирующего сигнала запускается чтение битов из последовательной памяти. Инициируются клоки ROM-request, считываются данные по падающему фронту,которые затем выдаются на шину вывода,и далее устанавливается флаг Ready в положение '1'.

Собственно с этим и возникла проблема.
Сигнал объявляется в entity как

ready: inout STD_LOGIC:='0';

Далее в процессе ROM_clockong он ставится в положение 1

if (j=7) then ready<='1';

Ну и в процессе Read_complete, по приходу заднего фронта с шины, означающее что данные прочитаны, он снова сбрасывается в 0

ready<='0';

Если убрать процеес Read_complete, то все выполняется прекрасно, как надо (см. Graph2)

Если этот процесс раскомментировать, то сигнал получает значение Х (явно неопределенный).

Таким образом суть проблемы.
Если в сигнал Ready могут писать 2 процесса, то возникает ошибка. Если один — все в порядке. Прочитал про resolved и solved сигналы, но у меня то как раз вроде все правильно — STD_Logic resolved типа,в него могут писать разные процессы, STD_uLogic – solved, если описать ready так, то компилятор сам напомнит об этом.
Starter.vhd : (89, 0): Signal "ready" has two sources, but is not resolved signal

Что я делаю не так?


В мануалах приводятся примеры, в которых несколько процессов одновременно обращаются в переменной, в этом случае для решения конфликта один из них присваивает 1 или 0, другой слабые - H или L. Но в моем то случае происходит изменение сигнала в разное время.


--------------------
Because it's there
Go to the top of the page
 
+Quote Post
yes
сообщение Apr 12 2010, 13:20
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 198
Регистрация: 23-12-04
Пользователь №: 1 640



такой вопрос возникает часто, поэтому в архиве могут быть лучшие объяснения

у меня вопрос: это описание устройства или описание теста?
(не могу понять по картинкам, в какой системе моделируете - активхдл или вендорский симулятор?) они скорее всего предполагают, что описываете устройство

описание устройство не может поддерживать присвоение одному сигналу из двух процессов (независимо от языка проектирования), потому что нет такого "физического" элемента
рекомендуется почитать главу RTL coding style в документации на тул/микросхему, и писать описания устройств в сооттветствии с документом

для VHDL я считаю правильным описание в виде двух процессов - в одном с помощью локальных переменных (variable) производится описание комбинаторной логики (список чувствительности процесса включает все входные сигналы)
на выходе сигналу присваивается значение переменной

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

----------

если описываете какой-то хитрый тестбенч, то нужно взять нормальный симулятор типа моделсима, в котором не делается неявных предположений о том, что описано
Go to the top of the page
 
+Quote Post
Muscat
сообщение Apr 12 2010, 13:32
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 277
Регистрация: 8-04-09
Из: Москва
Пользователь №: 47 382



Среда Active HDL, стимулирование через временные диаграммы там же.

В первом процессе сигнал ready ставится в единицу по достижению некоторого значения счетчика, во втором он сбрасывается в ноль, если приходит такая команда извне. Второй процесс намеренно "отключен" - он не выполняется. Тем не менее само наличие оператора присвоения в нем приводит к ошибке.

Микросхема Actel, но к синтезу я пока даже не переходил. Т.е. нормально реализовать работу нескольких процессов на один выход невозможно в принципе?

Материалы, которые я прочитал по этому поводу не внесли ясности. Как же все таки писать нескольким процессам в одну выходную шину? Поиск по форуму "resolved signal" тоже не дал ответа.


--------------------
Because it's there
Go to the top of the page
 
+Quote Post
Muscat
сообщение Apr 12 2010, 20:23
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 277
Регистрация: 8-04-09
Из: Москва
Пользователь №: 47 382



Друзья, я дебил и не понимаю прописных истин?

Так можно ли организовать работу многих процессов на одну общую шину, или надо делать мукс, в который придут все это внешние сигналы с каждого процесса и который сам решит, что ему выставить на выход?


--------------------
Because it's there
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Apr 13 2010, 04:35
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(Muscat @ Apr 12 2010, 23:38) *
надо делать мукс, в который придут все это внешние сигналы с каждого процесса и который сам решит, что ему выставить на выход?
Бинго! Естественно, нужен некий арбитр.
Go to the top of the page
 
+Quote Post
dsmv
сообщение Apr 14 2010, 04:16
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 451
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 284



Цитата(andrew_b @ Apr 13 2010, 08:50) *
Бинго! Естественно, нужен некий арбитр.


В стандарте VHDL 2006 появились новые операторы: force, release; Они как раз и предназначены для включения и выключения драйвера для сигнала. Но Activ-HDL 8.1 похоже это не поддерживает.
Пример должен выглядеть так:
Код
library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity temp is
    port(
      a    : out std_logic
    );
end temp;


architecture temp of temp is


begin        
    
pr_a: process begin
    
              wait for 100 ns;
    a<= force  out '1';
    
    a<='1';
    
    wait for 400 ns;
    
    a<= release out;
    wait;
end process;    


end temp;


В этом примере сигнал a должен включится через 100 ns, выставить 1, а затем отключиться через 400 nc;
Эти операторы предназначены для работы со сложными типами данных, в которых трудно сделать функцию resolved. И предназначены в первую очередь для моделирования.
Go to the top of the page
 
+Quote Post
Muscat
сообщение Apr 14 2010, 14:31
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 277
Регистрация: 8-04-09
Из: Москва
Пользователь №: 47 382



все понял, на одну шину несколько процессов писать не могут. Спасибо

Тогда я не понял, зачем вообще нужны Resolved сигналы?

1) Некий процесс_1 обращается к шине выставляя слабые значения, работает с ней. Если есть процесс_2 выставляющие свои слабые значения в этот сигнал, то они конфилктуют, на выходе U

2) Тут к сигналу обращается процесс_3 и выставляет сильное значение. И все, теперь уже кроме этого процесса никто с этим сигналом работать не сможет, иначе ошибка

Правильно ли я понял, что физически функция отключения драйвера сигнала не синтезируется? Если что, микросхемы
http://www.actel.com/products/pa3l/default.aspx

И да, в учебниках по VHDL очень много разных констуркций, которые не реализуемы физически. Где можно прочитать ограничия по физической реализации на конкретном кристалле?


--------------------
Because it's there
Go to the top of the page
 
+Quote Post
SFx
сообщение Apr 15 2010, 11:03
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 758
Регистрация: 11-07-05
Из: Понаехал (Мск)
Пользователь №: 6 688



Цитата(Muscat @ Apr 14 2010, 18:46) *
Где можно прочитать ограничия по физической реализации на конкретном кристалле?

Скорее всего это вам нужно документация на тот кристалл, который вы будете использовать, но есть как бы правило, внутри плис не делать тристейт шин. все тристейт шины только , тк у плис выводы тристейтовые есть. а внутри кристалла нет необходимости экономить "на проводах" - единственное что могу сказать, что все таки надо стараться делать берсты пореже.это жрет ресурсы очень, но писать легче. имхо.
а вообще говоря это все становится понятно после просмотра схем в RTL режиме...
Go to the top of the page
 
+Quote Post
Muscat
сообщение Apr 16 2010, 05:02
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 277
Регистрация: 8-04-09
Из: Москва
Пользователь №: 47 382



Понял, внутри делать шины с тремя состояниями.
А как сделать такую шину на выход?


--------------------
Because it's there
Go to the top of the page
 
+Quote Post
o-henry
сообщение Apr 16 2010, 05:15
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 435
Регистрация: 8-03-06
Из: степей Украины
Пользователь №: 15 069



Цитата(Muscat @ Apr 16 2010, 08:17) *
А как сделать такую шину на выход?

Примеры из Xilinx ISE:

using When/Else:
<output> <= <input> when <enable> ='1' else 'Z';

Using Process:
process (<enable>, <input>)
begin
if (<enable>='1') then
<output> <= <input>;
else
<output> <= 'Z';
end if;
end process;
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 07:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01435 секунд с 7
ELECTRONIX ©2004-2016