Jump to content

    

Recommended Posts

Добрый день, форумчане!

Решил сделать асинхронный фифо в образовательных целях. Не получается обработать флаги empty и full. Прилагаю исходник на верилоге.

double_clock_fifo.sv

Share this post


Link to post
Share on other sites

Если честно, не смотрел ваш код, работаю на VHDL, но у меня была такая же проблема. После принятия счетчика байт через функцию Грея в другом клоковом домене, надо этот счетчик пропустить через триггер, а потом использовать.

Share this post


Link to post
Share on other sites
5 минут назад, Kostochkin сказал:

Если честно, не смотрел ваш код, работаю на VHDL, но у меня была такая же проблема. После принятия счетчика байт через функцию Грея в другом клоковом домене, надо этот счетчик пропустить через триггер, а потом использовать.

А почему не через 2 ?

Share this post


Link to post
Share on other sites

Приветствую!

47 minutes ago, Kostochkin said:

Если честно, не смотрел ваш код, работаю на VHDL, но у меня была такая же проблема. После принятия счетчика байт через функцию Грея в другом клоковом домене, надо этот счетчик пропустить через триггер, а потом использовать.

"Не смотрел,  но осуждаю!" :biggrin:  Это так в союзе рецензии писали на западное кино.  Ну а благодарное население читая эти рецензии  воображало что же там в "этом кино"  могли такого :girl_hospital: показать  " ... конечно через  2 регистра - одного маловато будет ..." :wacko2:

А ничего что у TC  как раз все это присутствует и синхронизаторы  и по 2 регистра в них?   А вот с чем у TC проблема так с тем как вычислять события флагов empty и full.  @friks правильно я понимаю?

Удачи! Rob.

Share this post


Link to post
Share on other sites

Я делал так: асинхронный регистр -> синхронный регистр -> функция грея -> синхронный регистр. 

Здесь я имел в виду последний регистр.

Share this post


Link to post
Share on other sites

Я бы для начала слегка поменял Вашу архитектуру.

Сначала вы передаете адрес счетчика в код Грея. Переносите этот код через домен, посредством синхронизаторов. Затем преобразуете код Грея в нормальный код.

То, что Вы делаете через расширенный адресный бит - это правильно. Это классический способ анализа флагов.

Очень много замечаний по стилистике оформления. 

В одну строчку записать все входы и выходы модуля это круто, компактно. Но это неудобно в работе. И уж тем более в дальнейшем сопровождении.

ram_dual_clock u2 (in, r_addr, w_addr, (r_en & !empty), (w_en & !full), rst, r_clk, w_clk, out);

Название параметров:

parameter N = 4, M = 4)

Ну запишите Вы параметры человеческими названиями, типа data_widthdata_depth, Вам самим же будет проще в дальнейшем сопровождать проект.

Я лично признаю только такой стиль подключения модулей (Каюсь. Иногда на работе балуюсь verilog :biggrin:):

	gray_counter #
	(
		.data_width       (data_depth)
	)
	gray_counter_rd_adr
	(
		.rst               ( rst         ),
		.clk               ( r_clk       ),
		.en0               ( r_en        ),
		.en1               ( empty       ),
		.bin_counter_next  ( r_addr      ),
		.gray_counter_next ( r_addr_gray )
	);

 

Share this post


Link to post
Share on other sites
17 hours ago, friks said:

Добрый день, форумчане!

Решил сделать асинхронный фифо в образовательных целях. Не получается обработать флаги empty и full. Прилагаю исходник на верилоге.

double_clock_fifo.sv

у вас там вообще обработки флагов нет, вопрос не корректный) не "не получается", а "не знаю как". В сети есть пара статей хороших, про фифо от Suberst Design. Воспользуйтесь гуглом. На пальцах там два подхода: 1. счетчики заполнения отдельно и логика флагов на них. 2. равенство указателей с отслеживанием тренда изменения указателей (переполнение или опустошение). В обоих случаях есть свои преимущества и недостатки) 

 

Share this post


Link to post
Share on other sites

Рекомендую: https://habr.com/ru/post/321674/

И код: https://github.com/dsmv/fpga_components/tree/master/src/fifo

Я не рекомендую использовать код Грея. Если нужны не только full и empty, то код Грея резко усложняет логику работы.

Share this post


Link to post
Share on other sites
8 hours ago, dsmv said:

Я не рекомендую использовать код Грея. Если нужны не только full и empty, то код Грея резко усложняет логику работы.

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

ЗЫ. я бы не сказал более корректно, не усложняет, а роняет тактовую. Т.к. наружу торчат комбинаторные сигналы, сделать регистровыми или редуцировать логику до меньшего количества слоев логики можно, но там есть ньюансы) 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this