Мур 1 17 февраля, 2011 Опубликовано 17 февраля, 2011 (изменено) · Жалоба Хлопцы! Пишу я описание проекта, вставляю коментарии ... и нахожу в рабочей программе лишнюю строку. Думаю,- облегчу (ускорю) модулёк. И хорошо пустил на компиляцию и глянул отчёт. А Там, вау! Скорость упала с 291МГц до 101МГц!(Speed Grade: -2 Spartan6 architecture) Это модулёк скоростного приёмника USART с мажоритированием 25MBit/s library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use IEEE.std_logic_unsigned.all; entity UARTReceiver25 is port ( reset : in STD_LOGIC; -- initialization clk: in STD_LOGIC; -- 200MHz!!!!! rxd: in STD_LOGIC; --- serial input. rxd_data: out STD_LOGIC_VECTOR (7 downto 0);---date bus rxd_data_ready: out STD_LOGIC);--new date end UARTReceiver25; architecture UARTReceiverArch25 of UARTReceiver25 is signal b_i_t: STD_LOGIC; signal qqq: STD_LOGIC; signal bitte: STD_LOGIC_VECTOR (1 downto 0); signal cntbit: STD_LOGIC_VECTOR(9 downto 0); signal cntime: STD_LOGIC_VECTOR (7 downto 0); signal cntime0bit: STD_LOGIC_VECTOR (6 downto 0); signal dat: STD_LOGIC_VECTOR (7 downto 0); type AVT025t_type is ( strt, S2, pusk ); signal r_next: STD_LOGIC_VECTOR(7 downto 0); signal r0_next: STD_LOGIC_VECTOR(6 downto 0); signal r_cntbit_next: STD_LOGIC_VECTOR(9 downto 0); signal AVT025t: AVT025t_type; begin ---------------------------------------------------------------------- AVT025t_machine: process (clk) begin if clk'event and clk = '1' then if reset='1' then qqq<='0'; AVT025t <= strt; else case AVT025t is when strt => cntime <= (0=>'1',others=>'0'); cntime0bit <= (0=>'1',others=>'0'); cntbit <= (0=>'1',others=>'0'); if rxd ='1' then AVT025t <= strt; elsif rxd ='0' then AVT025t <= S2;---- begin process end if; ----------------------------------- when S2 => cntime <= r_next; --shift if cntime(7)='0' and rxd ='0'and cntbit(0)='1' then cntime0bit <= r0_next; --shift end if; if (cntime(6) ='1' and cntbit(0)='1') then --start bit if ((cntime0bit(6) = '1') or (cntime0bit(5) = '1') ) then AVT025t <= S2; cntime <= (0=>'1',others=>'0'); cntbit <= r_cntbit_next; --shift else AVT025t <= strt; --integralnity no! end if; elsif (cntime(2)='1' and cntbit(0)='0') then AVT025t <= pusk; bitte(0) <= rxd; end if; ------------------------------- when pusk => cntime <= r_next; --shift if cntime(4)='1' then bitte(1) <= rxd; end if; if cntime(6)='1' then if rxd ='1' then case bitte is --major when "10"|"01"|"11" => b_i_t <= '1'; when "00" => b_i_t <= '0'; when others => null; end case; else case bitte is --major when "11" => b_i_t <= '1'; when "00"|"01"|"10" => b_i_t <= '0'; when others => null; end case; end if; end if; if cntime(7)='1' then if cntbit(9)='1' then rxd_data <= dat;--- finale cod if b_i_t = '1' then--stop qqq<=not qqq; --change end if; AVT025t <= strt; cntime <= (0=>'1',others=>'0');--!!!! Super speed!!!! else dat <= b_i_t & dat(7 downto 1); --concatination date cntbit <= r_cntbit_next; --shift AVT025t <= S2; cntime <= (0=>'1',others=>'0'); end if; end if; when others => null; end case; end if; end if; end process; r_next <= cntime(6 downto 0) & '0'; --feedback r0_next <= cntime0bit(5 downto 0) & '0'; r_cntbit_next <= cntbit(8 downto 0) & '0'; rxd_data_ready <=qqq; end UARTReceiverArch25; Строка помечена --!!! Super speed!!!! По смыслу в следующем состоянии эта операция уже делается. Зачем повторять? ...Вот я и думаю, что синтезатор себе на уме и эта избыточность как-то помогла синтезатору развести ПЛИС по-другому? Или это глюк? RTL я не смотрел, времени нет (Да и в ISE вьювер хуже чем в Кактусе) ..., но есть о чём подумать. Получается что в кризисных ситуациях стоит позволять себе такие вещи, чтобы поднять скорость. Что народ скажет? Изменено 18 февраля, 2011 пользователем Мур Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 17 февраля, 2011 Опубликовано 17 февраля, 2011 · Жалоба Что народ скажет? телепатирую валиться времянка по цепям счетчика cntime ? если да, то это очевидно и объяснить это так же просто как забрать конфетку у ребенка %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sleep 0 17 февраля, 2011 Опубликовано 17 февраля, 2011 · Жалоба Добрый день! Не смотрели, где лежат критические пути в обоих вариантах синтеза аппаратуры? Изменились ли пути reg2reg, in2reg, reg2out? По идее, в Вашем средстве синтеза для ПЛИС эти вещи тоже можно посмотреть. Участвует ли там "cntime" ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Мур 1 17 февраля, 2011 Опубликовано 17 февраля, 2011 (изменено) · Жалоба телепатирую валиться времянка по цепям счетчика cntime ? если да, то это очевидно и объяснить это так же просто как забрать конфетку у ребенка %) Тут нет счётчиков. Тут сдвиговые регистры. ...Может быть только у регистра состояния автомата... А может прочувствовать синтезатор ...методом проб. Это же не программирование контроллеров. Изменено 17 февраля, 2011 пользователем Мур Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 17 февраля, 2011 Опубликовано 17 февраля, 2011 · Жалоба Тут нет счётчиков. Тут сдвиговые регистры. ...Может быть только у регистра состояния автомата... у вас он используется как счетчик, так что не вижу противоречий. А может прочувствовать синтезатор ...методом проб. Это же не программирование контроллеров. что его чувствовать то, все на виду, достаточно внимательно посмотреть код и разложить его на примитивы целевой плис %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Мур 1 17 февраля, 2011 Опубликовано 17 февраля, 2011 (изменено) · Жалоба Спасибо! у вас он используется как счетчик, так что не вижу противоречий. На таких частотах счётчик ущербен. Выбор не случаен.. что его чувствовать то, все на виду, достаточно внимательно посмотреть код и разложить его на примитивы целевой плис %) Всё правильно. Только эта случайность "ошибки", уход от академизма VHDL ....позволил явно почувствовать разницу. Ну ведь так специально не напишешь, глядя в учебники? Изменено 17 февраля, 2011 пользователем Мур Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 17 февраля, 2011 Опубликовано 17 февраля, 2011 · Жалоба Всё правильно. Только эта случайность "ошибки", уход от академизма VHDL ....позволил явно почувствовать разницу. стиль у вас не айс, потому и такие ошибки ;). своему подавану руки бы оторвал за такое %) Ну ведь так специально не напишешь, глядя в учебники? я когда работаю сразу прикидываю куда это ляжет и сколько займет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 17 февраля, 2011 Опубликовано 17 февраля, 2011 · Жалоба .. На таких частотах счётчик ущербен. Выбор не случаен.. .. Это на каких ? Да и счётчики то разные бывают B) Ну а глобально ответ на вопрос в топике - с ним не нужно дружить, нужно знать как он может разложить требуемый дизайн :rolleyes: (это как в анекдоте про друзей) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Мур 1 17 февраля, 2011 Опубликовано 17 февраля, 2011 (изменено) · Жалоба стиль у вас не айс, потому и такие ошибки ;). своему подавану руки бы оторвал за такое %) Я не совершененн. Я в этой теме 7 месяцев и слишком увлекался поведением на Алдеке, нежели привязкам к архитектуре конкретного ПЛИС. я когда работаю сразу прикидываю куда это ляжет и сколько займет Кстати, было бы интересно увидеть код мастера, взяв за основу мою "рыбу". :tort: :beer: ..Да это важно многим чайникам, как я. Опыт,- великое дело! Меня для моих требований устраивает и такой вариант. Вы как мастер ассемблера, а я где-то на уровне Бейсика блукаю... Ситуация похожа на программиста на С(ему всё равно, какой камень,-рессурс позволяет) и ассемблерного гения с простенькой машинкой и офигительной задачей... Это на каких ? Я указывал 200МГц Да и счётчики то разные бывают B) Несомненно. Можно просто в коде писать инкременты не думая(вариант не прокатывает). Здесь описаны сдвиговые регистры, как по книжке IEEE Press RTL Hardware Design Using VHDL Ну а глобально ответ на вопрос в топике - с ним не нужно дружить, нужно знать как он может разложить требуемый дизайн :rolleyes: (это как в анекдоте про друзей) Мечты, мечты... Где ваша сладость? Это когда есть запас времени. И это приходит не сразу, а бесконечным анализом RTL <-> VHDL. Я сейчас пишу сейчас описание и уже знаю, что меня дёрнут на новый этап. Я заинтересован писать для себя так, чтобы не было проблем через 2 мц. Изменено 17 февраля, 2011 пользователем Мур Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 17 февраля, 2011 Опубликовано 17 февраля, 2011 · Жалоба 2 Мур обычные 8-битные счётчики и без выкрутасов нормально работают на 200МГц что на С3 что на S6 Правда тут сравнительно недавно обсуждалась ситуация, когда XST "немножко по дебильному"(ЦЕ) собрал счётчик ну и ессно времянка упала из-за этого.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 17 февраля, 2011 Опубликовано 17 февраля, 2011 · Жалоба Кстати, было бы интересно увидеть код мастера, взяв за основу мою "рыбу". :tort: :beer: ..Да это важно многим чайникам, как я. Опыт,- великое дело! скажите тоже, я чайник еще каких поискать. Если я правильно понял что вы имели в виду под USART, 25Mbps, мажоритар по трем семплам, то я бы сделал так : /* logic usart__iclk ; logic usart__idat ; logic usart__oval ; logic usart__oerr ; logic [7 : 0] usart__odat ; usart usart ( .iclk ( usart__iclk ) , .idat ( usart__idat ) , .oval ( usart__oval ) , .oerr ( usart__oerr ) , .odat ( usart__odat ) ); assign usart__iclk = '0 ; assign usart__idat = '0 ; */ module usart ( iclk , idat , oval , oerr , odat ); //------------------------------------------------------------------------------------------------------ // //------------------------------------------------------------------------------------------------------ input logic iclk ; // 75MHz input logic idat ; // 25Mbps output logic oval ; output logic oerr ; output logic [7 : 0] odat ; //------------------------------------------------------------------------------------------------------ // //------------------------------------------------------------------------------------------------------ logic [2 : 0] dat_buffer; logic [1 : 0] cnt; logic val2decode; logic dat2decode; enum { cRESET_STATE , cSTART_BIT_STATE , cWORK_STATE , cSTOP_BIT_STATE } state /* synthesis syn_encoding = "sequential" */; logic [3 : 0] bit_cnt; //------------------------------------------------------------------------------------------------------ // //------------------------------------------------------------------------------------------------------ always_ff @(posedge iclk) begin dat_buffer <= (dat_buffer << 1) | idat; end wire bit_val = cnt[1]; wire bit_dat = decode_bit(dat_buffer); always_ff @(posedge iclk) begin cnt <= bit_val ? 0 : (cnt + 1'b1); end always_ff @(posedge iclk) begin val2decode <= bit_val; dat2decode <= bit_dat; end always_ff @(posedge iclk) begin case (state) cRESET_STATE : state <= cSTART_BIT_STATE; cSTART_BIT_STATE : state <= bit_val & ~dat2decode ? cWORK_STATE : cSTART_BIT_STATE; cWORK_STATE : state <= (bit_val & bit_cnt[3]) ? cSTOP_BIT_STATE : cWORK_STATE; cSTOP_BIT_STATE : state <= bit_val ? cSTART_BIT_STATE : cSTOP_BIT_STATE; endcase // if (state != cWORK_STATE) bit_cnt <= 4'b0001; // it's a hack else if (bit_val) bit_cnt <= bit_cnt + 1'b1; // if (bit_val) odat <= (odat << 1) | dat2decode; oval <= (state == cSTOP_BIT_STATE); oerr <= (state == cSTOP_BIT_STATE) & ~dat2decode; end //------------------------------------------------------------------------------------------------------ // //------------------------------------------------------------------------------------------------------ function automatic logic decode_bit (input logic [2 : 0] data); case (data) 3'b000 : decode_bit = 1'b0; 3'b001 : decode_bit = 1'b0; 3'b010 : decode_bit = 1'b0; 3'b011 : decode_bit = 1'b1; 3'b100 : decode_bit = 1'b0; 3'b101 : decode_bit = 1'b0; 3'b110 : decode_bit = 1'b1; 3'b111 : decode_bit = 1'b1; endcase endfunction endmodule ЗЫ. Функциональность не проверял, результаты синтеза тоже. Но на вскидку везде комбинационные пути на один 4-х входовой лют. И уж точно должно лечь в 6 ти входовой %) Тактовая должна быть в 3 раза выше скорости данных, для других соотношений нужно немного поправить %) ЗЗЫ. Ну и сигнал сброса я не добавлял, лень Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Мур 1 17 февраля, 2011 Опубликовано 17 февраля, 2011 · Жалоба скажите тоже, я чайник еще каких поискать. Если я правильно понял что вы имели в виду под USART, 25Mbps, мажоритар по трем семплам, то я бы сделал так : ЗЫ. Функциональность не проверял, результаты синтеза тоже. Но на вскидку везде комбинационные пути на один 4-х входовой лют. И уж точно должно лечь в 6 ти входовой %) Тактовая должна быть в 3 раза выше скорости данных, для других соотношений нужно немного поправить %) ЗЗЫ. Ну и сигнал сброса я не добавлял, лень Вот это супер! Мой респект!.... Я думаю тут многих посетит озарение!(Я пока латентный,-Verilog в зачаточном состоянии). Теперь я понял главное,- оценка по LUT рессурсу макроячейки. В моём варианте я бил на унарность кода в сдвиговом регистре и в итоге уходил от сложных многовходовых элементов.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 17 февраля, 2011 Опубликовано 17 февраля, 2011 · Жалоба Я думаю тут многих посетит озарение!(Я пока латентный,-Verilog в зачаточном состоянии). Теперь я понял главное,- оценка по LUT рессурсу макроячейки. Выводы не совсем нужные вы сделали. Описание должно быть простое и понятное, что бы логика была на виду. Попробуйте вернуться к своему коду где то так через пару месяцев и что то в нем поменять. Ну и не забывать что в слайсе/LCELLe рядом с триггером лют все равно есть ;) ЗЫ. бил на унарность кода в сдвиговом регистре сброс всех битов сдвигового регистра, из конченого автомата может привести к достаточно толстой логике и использованию большего кол-ва лютов. Особенно при малых разрядностях %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosu-art 0 17 февраля, 2011 Опубликовано 17 февраля, 2011 · Жалоба Извините меня за нубский вопрос. А что такое мажоритирование? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lexus.mephi 0 17 февраля, 2011 Опубликовано 17 февраля, 2011 · Жалоба Извините меня за нубский вопрос. А что такое мажоритирование? Добавление избыточной аппаратуры для повышения надежности и отказоустойчивости. Такие вопросы задаются google'у, а не здесь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться