Jump to content

    

Дружить с синтезатором стоит ?

Хлопцы! Пишу я описание проекта, вставляю коментарии ... и нахожу в рабочей программе лишнюю строку. Думаю,- облегчу (ускорю) модулёк. И хорошо пустил на компиляцию и глянул отчёт. А Там, вау! Скорость упала с 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 вьювер хуже чем в Кактусе) ..., но есть о чём подумать. Получается что в кризисных ситуациях стоит позволять себе такие вещи, чтобы поднять скорость. Что народ скажет?

Edited by Мур

Share this post


Link to post
Share on other sites
Что народ скажет?

телепатирую валиться времянка по цепям счетчика cntime ? если да, то это очевидно и объяснить это так же просто как забрать конфетку у ребенка %)

Share this post


Link to post
Share on other sites

Добрый день!

Не смотрели, где лежат критические пути в обоих вариантах синтеза аппаратуры?

Изменились ли пути reg2reg, in2reg, reg2out?

По идее, в Вашем средстве синтеза для ПЛИС эти вещи тоже можно посмотреть.

Участвует ли там "cntime" ?

Share this post


Link to post
Share on other sites
телепатирую валиться времянка по цепям счетчика cntime ? если да, то это очевидно и объяснить это так же просто как забрать конфетку у ребенка %)

Тут нет счётчиков. Тут сдвиговые регистры. ...Может быть только у регистра состояния автомата...

 

А может прочувствовать синтезатор ...методом проб. Это же не программирование контроллеров.

Edited by Мур

Share this post


Link to post
Share on other sites
Тут нет счётчиков. Тут сдвиговые регистры. ...Может быть только у регистра состояния автомата...

у вас он используется как счетчик, так что не вижу противоречий.

А может прочувствовать синтезатор ...методом проб. Это же не программирование контроллеров.

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

 

Share this post


Link to post
Share on other sites

Спасибо!

у вас он используется как счетчик, так что не вижу противоречий.

На таких частотах счётчик ущербен. Выбор не случаен..

 

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

Всё правильно. Только эта случайность "ошибки", уход от академизма VHDL ....позволил явно почувствовать разницу.

Ну ведь так специально не напишешь, глядя в учебники?

Edited by Мур

Share this post


Link to post
Share on other sites
Всё правильно. Только эта случайность "ошибки", уход от академизма VHDL ....позволил явно почувствовать разницу.

стиль у вас не айс, потому и такие ошибки ;). своему подавану руки бы оторвал за такое %)

 

Ну ведь так специально не напишешь, глядя в учебники?

я когда работаю сразу прикидываю куда это ляжет и сколько займет

 

Share this post


Link to post
Share on other sites
..

На таких частотах счётчик ущербен. Выбор не случаен..

..

Это на каких ?

Да и счётчики то разные бывают B)

 

Ну а глобально ответ на вопрос в топике - с ним не нужно дружить, нужно знать как он может разложить требуемый дизайн :rolleyes: (это как в анекдоте про друзей)

Share this post


Link to post
Share on other sites
стиль у вас не айс, потому и такие ошибки ;). своему подавану руки бы оторвал за такое %)

Я не совершененн. Я в этой теме 7 месяцев и слишком увлекался поведением на Алдеке, нежели привязкам к архитектуре конкретного ПЛИС.

 

я когда работаю сразу прикидываю куда это ляжет и сколько займет

Кстати, было бы интересно увидеть код мастера, взяв за основу мою "рыбу". :tort: :beer:

 

..Да это важно многим чайникам, как я. Опыт,- великое дело!

Меня для моих требований устраивает и такой вариант. Вы как мастер ассемблера, а я где-то на уровне Бейсика блукаю... Ситуация похожа на программиста на С(ему всё равно, какой камень,-рессурс позволяет) и ассемблерного гения с простенькой машинкой и офигительной задачей...

 

Это на каких ?

Я указывал 200МГц

Да и счётчики то разные бывают B)

Несомненно. Можно просто в коде писать инкременты не думая(вариант не прокатывает). Здесь описаны сдвиговые регистры, как по книжке

IEEE Press RTL Hardware Design Using VHDL

Ну а глобально ответ на вопрос в топике - с ним не нужно дружить, нужно знать как он может разложить требуемый дизайн :rolleyes: (это как в анекдоте про друзей)

Мечты, мечты... Где ваша сладость?

Это когда есть запас времени. И это приходит не сразу, а бесконечным анализом RTL <-> VHDL.

Я сейчас пишу сейчас описание и уже знаю, что меня дёрнут на новый этап. Я заинтересован писать для себя так, чтобы не было проблем через 2 мц.

Edited by Мур

Share this post


Link to post
Share on other sites

2 Мур

обычные 8-битные счётчики и без выкрутасов нормально работают на 200МГц что на С3 что на S6

Правда тут сравнительно недавно обсуждалась ситуация, когда XST "немножко по дебильному"(ЦЕ) собрал счётчик ну и ессно времянка упала из-за этого..

Share this post


Link to post
Share on other sites
Кстати, было бы интересно увидеть код мастера, взяв за основу мою "рыбу". :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 раза выше скорости данных, для других соотношений нужно немного поправить %)

 

ЗЗЫ. Ну и сигнал сброса я не добавлял, лень

Share this post


Link to post
Share on other sites
скажите тоже, я чайник еще каких поискать. Если я правильно понял что вы имели в виду под USART, 25Mbps, мажоритар по трем семплам, то я бы сделал так :

 

ЗЫ. Функциональность не проверял, результаты синтеза тоже. Но на вскидку везде комбинационные пути на один 4-х входовой лют. И уж точно должно лечь в 6 ти входовой %) Тактовая должна быть в 3 раза выше скорости данных, для других соотношений нужно немного поправить %)

 

ЗЗЫ. Ну и сигнал сброса я не добавлял, лень

Вот это супер! Мой респект!....

Я думаю тут многих посетит озарение!(Я пока латентный,-Verilog в зачаточном состоянии). Теперь я понял главное,- оценка по LUT рессурсу макроячейки.

В моём варианте я бил на унарность кода в сдвиговом регистре и в итоге уходил от сложных многовходовых элементов....

Share this post


Link to post
Share on other sites
Я думаю тут многих посетит озарение!(Я пока латентный,-Verilog в зачаточном состоянии). Теперь я понял главное,- оценка по LUT рессурсу макроячейки.

Выводы не совсем нужные вы сделали. Описание должно быть простое и понятное, что бы логика была на виду. Попробуйте вернуться к своему коду где то так через пару месяцев и что то в нем поменять. Ну и не забывать что в слайсе/LCELLe рядом с триггером лют все равно есть ;)

 

ЗЫ.

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

Share this post


Link to post
Share on other sites
Извините меня за нубский вопрос. А что такое мажоритирование?

Добавление избыточной аппаратуры для повышения надежности и отказоустойчивости.

Такие вопросы задаются google'у, а не здесь.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this