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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Signal cannot be synthesized, bad synchronous description., Не пойму в чем дело...
h0t
сообщение Feb 4 2012, 18:26
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 23-09-11
Пользователь №: 67 345



Добрый вечер, было уже когда-то похожая проблема но сейчас уже не помню с чем связана.
В итоге есть код:
Код
function read_bit(signal RX, SCK:std_ulogic)  return bit is
variable read_data: Std_uLogic_Vector ( 4 downto 0);
variable current_bit : bit;
begin
  
    
    for i in 0 to 4 loop
        if(rising_edge(SCK)) then
           read_data(i) := RX;
        end if;
    end loop;


    if (read_data = "00000") then  current_bit:='0';
     elsif (read_data = "00001") then  current_bit:='0';
     elsif (read_data = "00010") then  current_bit:='0';
     elsif (read_data = "00011") then  current_bit:='0';
     elsif (read_data = "00100") then  current_bit:='0';
     elsif (read_data = "00101") then  current_bit:='0';
     elsif (read_data = "00110") then  current_bit:='0';
     elsif (read_data = "00111") then  current_bit:='1';
     elsif (read_data = "01000") then  current_bit:='0';
     elsif (read_data = "01001") then  current_bit:='0';
     elsif (read_data = "01010") then  current_bit:='0';
     elsif (read_data = "01011") then  current_bit:='1';
     elsif (read_data = "01100") then  current_bit:='0';
     elsif (read_data = "01101") then  current_bit:='1';
     elsif (read_data = "01110") then  current_bit:='1';
     elsif (read_data = "01111") then  current_bit:='1';
     elsif (read_data = "10000") then  current_bit:='0';
     elsif (read_data = "10001") then  current_bit:='0';
     elsif (read_data = "10010") then  current_bit:='0';
     elsif (read_data = "10011") then  current_bit:='1';
     elsif (read_data = "10100") then  current_bit:='0';
     elsif (read_data = "10101") then  current_bit:='1';
     elsif (read_data = "10110") then  current_bit:='1';
     elsif (read_data = "10111") then  current_bit:='1';
     elsif (read_data = "11000") then  current_bit:='0';
     elsif (read_data = "11001") then  current_bit:='1';
     elsif (read_data = "11010") then  current_bit:='1';
     elsif (read_data = "11011") then  current_bit:='1';
     elsif (read_data = "11100") then  current_bit:='1';
     elsif (read_data = "11101") then  current_bit:='1';
     elsif (read_data = "11110") then  current_bit:='1';
     elsif (read_data = "11111") then  current_bit:='1';
     end if;
    
    return current_bit;
end;




begin
    
    process (SCK,RX)         
    variable current_bit:bit;    
    variable read_data: Std_uLogic_Vector ( 4 downto 0);
    begin
    if (falling_edge(RX)) then
            current_bit:=read_bit(RX,SCK);
            current_bit:=read_bit(RX,SCK);

            DATA <= "0000000000000000000000000000000000000000000000000000000000000000000000000000
000"&to_stdulogic(current_bit);
    end if;
    
    end process;


И получаю ошибку line 57: Signal read_data1<0> cannot be synthesized, bad synchronous description. The description style you are using to describe a synchronous element (register, memory, etc.) is not supported in the current software release.. Подскажите в чем дело. Тема похожая уже здесь была, я ее просматривал но осознать как подправить код не смог(. Спасибо.

P.S. про жуткий способ вычисления current_bit знаю, просто я игрался с ошибкой что-бы понять в чем дело.

Сообщение отредактировал h0t - Feb 4 2012, 18:28
Go to the top of the page
 
+Quote Post
svedach
сообщение Feb 4 2012, 19:08
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 135
Регистрация: 8-01-12
Из: Беларусь
Пользователь №: 69 226



Я не спец, но возможно нельзя использовать rising_edge(SCK) внутри функции??

Сообщение отредактировал svedach - Feb 4 2012, 19:08
Go to the top of the page
 
+Quote Post
h0t
сообщение Feb 4 2012, 19:18
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 23-09-11
Пользователь №: 67 345



Да вроде можно, если вытащить функцию то это не помогает( Там что-то с сигналами связано, но вот не помню что...
Go to the top of the page
 
+Quote Post
gosu-art
сообщение Feb 4 2012, 19:18
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 555
Регистрация: 14-10-09
Пользователь №: 52 939



Так мало того там установка бита по rising_edge и по falling_edge wacko.gif
Go to the top of the page
 
+Quote Post
h0t
сообщение Feb 4 2012, 19:22
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 23-09-11
Пользователь №: 67 345



Цитата(gosu-art @ Feb 4 2012, 23:18) *
Так мало того там установка бита по rising_edge и по falling_edge wacko.gif

Можно подробнее, я не понял что Вы имели ввиду. Это вроде же разные сигналы....
Go to the top of the page
 
+Quote Post
gosu-art
сообщение Feb 4 2012, 19:27
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 555
Регистрация: 14-10-09
Пользователь №: 52 939



А то, что такую конструкцию в ПЛИС невозможно реализовать.
Причем у вас явно мышление "обычного" программиста - типа все операторы выполняются последовательно
Go to the top of the page
 
+Quote Post
h0t
сообщение Feb 4 2012, 19:36
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 23-09-11
Пользователь №: 67 345



Цитата(gosu-art @ Feb 4 2012, 23:27) *
А то, что такую конструкцию в ПЛИС невозможно реализовать.
Причем у вас явно мышление "обычного" программиста - типа все операторы выполняются последовательно

Если поменять один из них на if (RX='0') результат будет такой же...(
у меня process

Сообщение отредактировал h0t - Feb 4 2012, 19:36
Go to the top of the page
 
+Quote Post
gosu-art
сообщение Feb 4 2012, 19:45
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 555
Регистрация: 14-10-09
Пользователь №: 52 939



Цитата
for i in 0 to 4 loop
if(rising_edge(SCK)) then
read_data(i) := RX;
end if;
end loop;

Вот эта штука - ваще атасс smile3046.gif хотя бы попробуйте пока ее вообще выкинуть
Go to the top of the page
 
+Quote Post
h0t
сообщение Feb 4 2012, 19:48
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 23-09-11
Пользователь №: 67 345



я писал, что над функцией я игрался что-бы понять в чем ошибка. Если я ее выкину то вопрос станет не актуальный. Прошу Вас конструктивно объяснить в чем проблема.
Go to the top of the page
 
+Quote Post
des00
сообщение Feb 5 2012, 08:46
Сообщение #10


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(h0t @ Feb 4 2012, 14:48) *
Прошу Вас конструктивно объяснить в чем проблема.

Проблема в том, что Вы подошли к VHDL как к языку програмирования, а что VHDL это язык ОПИСАНИЯ аппаратуры (хотя программировать на нем можно и даже запускать то, что напрограмировали в симуляторе). И пока вы не поймете разницу, делать что либо н VHDL для ПЛИС бессмысленно. Рекоменду начать с азов, хотя бы с книни "ПЛИС. Курс молодого бойца" Максфилда.


--------------------
Go to the top of the page
 
+Quote Post
h0t
сообщение Feb 5 2012, 08:46
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 23-09-11
Пользователь №: 67 345



Цитата(gosu-art @ Feb 4 2012, 23:27) *
А то, что такую конструкцию в ПЛИС невозможно реализовать.
Причем у вас явно мышление "обычного" программиста - типа все операторы выполняются последовательно

Кажется я понял что Вы имели ввиду. НО полного осознания еще ни пришло код переписал полностью по тактам только от SCK. Но если объясните подробно буду благодарен.
.
Go to the top of the page
 
+Quote Post
gosu-art
сообщение Feb 5 2012, 09:07
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 555
Регистрация: 14-10-09
Пользователь №: 52 939



Завтра приду на работу попробую набросать примеры...
Go to the top of the page
 
+Quote Post
maksimp
сообщение Feb 5 2012, 09:36
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023



Цитата(h0t @ Feb 4 2012, 21:26) *
Код
function read_bit(signal RX, SCK:std_ulogic)  return bit is
...
begin
...
        if(rising_edge(SCK)) then
           read_data(i) := RX;
        end if;
...
end;
...
begin
    process (SCK,RX)         
...
    begin
    if (falling_edge(RX)) then
            current_bit:=read_bit(RX,SCK);
...
    end if;
    end process;

если подставить функцию на место её применения то получается
Код
...
begin
    process (SCK,RX)         
...
    begin
    if (falling_edge(RX)) then
        if(rising_edge(SCK)) then
           read_data(i) := RX;
        end if;
    end if;
    end process;

То есть вложенные друг в друга констпукции if с срабатыванием по фронту (falling_edge или rising_edge). Этого нельзя - в ПЛИС нет схем которые умеют так работать, и синтезатор поэтому отказывается.
Go to the top of the page
 
+Quote Post
h0t
сообщение Feb 5 2012, 11:44
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 23-09-11
Пользователь №: 67 345



Все спасибо, осознал. Всем спасибо.
Go to the top of the page
 
+Quote Post
Bad0512
сообщение Feb 6 2012, 03:14
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 802
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650



Цитата(h0t @ Feb 5 2012, 18:44) *
Все спасибо, осознал. Всем спасибо.

А вот у меня чисто спортивный интерес : а если бы вам нужно было количество единичек посчитать к примеру в 7-ми битном слове, то вы конструкцию типа if-elseif на 128 строчек написали бы? А вдруг ошиблись бы , к примеру в 115 строчке? Попоробуйте универсальную функцию подсчёта единичек (а может даже ещё и нулей!) написать. Тем более что VHDL позволяет передавать в функцию вектор заранее не определённой длины - можно сделать под любую разрядность входных данных.
Go to the top of the page
 
+Quote Post

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

 


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


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