Форум программистов, компьютерный форум, киберфорум
Программируемая логика: ПЛИС, ПАИС
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
1 / 1 / 2
Регистрация: 06.07.2009
Сообщений: 54
1

Задержка сигналов в ПЛИС

30.04.2021, 14:41. Показов 719. Ответов 16
Метки нет (Все метки)

Добрый день, пишу первый проект на Quartus 2.
Использую чип EPM3032ALC44, проект написал "Block Diagram/Schematic File" откомпилировал и прогрузил в чип (работает...).
Вопрос в следующем, как сделать задержки прохождения сигналов через логические элементы?
В интернете ничего конкретного не нашел, пишут что это невозможно, но как-то их программируют чтобы они по временным показателям (характеристикам) совпадают с логикой на логических элементах.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.04.2021, 14:41
Ответы с готовыми решениями:

Передача сигналов с камер и обработка на ПЛИС
Здравствуйте. Вопрос задаю на будущее (прицеливаюсь). Суть: есть мысль сопречь 4 видео камеры,...

Способы стабилизации сигналов энкодеров, триггеров, захват ШИМ сигналов
Доброго времени суток, поделитесь своим опытом как вы боритесь с ложными срабатываниями Timer Input...

Построить временные диаграммы выходных сигналов триггеров для заданных входных сигналов
1 задание. Построить временную диаграмму выходных сигналов T-триггера при заданных входных...

Построить временные диаграммы выходных сигналов триггеров для заданных входных сигналов
1 задание. Построить временную диаграмму выходных сигналов T-триггера при заданных входных...

16
2571 / 1850 / 403
Регистрация: 11.09.2009
Сообщений: 6,872
30.04.2021, 23:22 2
Цитата Сообщение от pvg_79 Посмотреть сообщение
как сделать задержки прохождения сигналов через логические элементы?
Тактировкой триггерами/регистрами сдвига. При частоте такта 200 МГц можете иметь дискрет установки задержки 5 нс.
Если нужно что-то более мелкое, то можете попробовать Programmable Speed/Power Control (даташит, стр.20).
Городить что-то "для задержки" схемотехнически действительно практически бесполезно - компиллятор с оптимизацией, всё равно всё это уберёт.
Но если очень-очень надо, то можно добиться нужных задержек ручным размещением функциональных блоков на кристалле. Но это ооочень трудоёмко и диапазон возможностей очень маленький.

Добавлено
Да, есть ещё способ добавить аналоговую задержку, если таких сигналов нужно не очень много. Можно вывести сигнал на внешнюю ножку, поставить там внешнюю RC-цепь, и с неё через другую ножку обратно. Если использовать входные порты с триггером Шмитта, то можно получать довольно большие задержки.
Если нужно добавить очень маленькую задержку, то можно использовать так же вывод через внешние ножки. Входные-выходные порты имеют существенно большую задержку, чем соединённые друг с другом внутренние элементы. В вашем кристалле это порядка 4 нс.
1
1 / 1 / 2
Регистрация: 06.07.2009
Сообщений: 54
30.04.2021, 23:34  [ТС] 3
Как сделать триггерами, я что-то читал но как сделать не понял, где брать синхронизацию.
И еще прочитал что ПЛИС работает очень быстро и что есть такие моменты когда входные сигналы находятся в переходном состоянии, а ПЛИС их считывает программа обрабатывает тогда на выходе получается мусор.

Добавлено через 8 минут
Я В ПЛИС реализовал схему с 5 логическими элементами (555ТМ2, 555КП11, 555ЛЕ1,555КП12 и 555ИД7) , в реале схема собранная на этих элементах работает без ошибок, заменил на ПЛИС все глючит страшно хотя таблица ИСТИНОСТИ, если так можно сказать, показывает правильный результат, это может и не задержки виноваты.
Есть один входной сигнал (главный) когда он равен "0" то схема должна отработать, а "1" схема не должна работать:
Данный сигнал в схему введен через элемент OR.
Есть здесь что-то вроде контейнера или типа того.
Может в этом проблема не знаю.
0
2571 / 1850 / 403
Регистрация: 11.09.2009
Сообщений: 6,872
01.05.2021, 01:32 4
Цитата Сообщение от pvg_79 Посмотреть сообщение
в реале схема собранная на этих элементах работает без ошибок, заменил на ПЛИС все глючит страшно хотя таблица ИСТИНОСТИ, если так можно сказать, показывает правильный результат
Да, вы столкнулись именно с этим "эффектом". При реализации внутри ПЛИС, схема минимизируется и преобразуется под имеющиеся "логические ячейки". Если схема была спроектирована так, что задержки элементов имели значение для правильного формирования сигнала, то внутри ПЛИС может оказаться даже так, что сигнал на выходе какого-то элемента появится даже раньше, чем "как бы изменится" входной сигнал, и действительно вся временная диаграмма "разъедется". Это результат преобразования схемы, после которого задержки в разных цепях совершенно не будут соответствовать исходной схеме. Там, где вы считали, что сигнал придёт позже, он придёт раньше, и наоборот.

Именно поэтому проектировать для ПЛИС рекомендуют синхронные (т.е. тактируемые) схемы. В любом случае, для ПЛИС нельзя использовать схемы, работа которых основана на задержках.

Цитата Сообщение от pvg_79 Посмотреть сообщение
не понял, где брать синхронизацию.
У ПЛИС есть специальный вход для тактового сигнала и PLL для формирования из него внутреннего тактового сигнала большей частоты. На вход PLL от внешнего тактового генератора подаётся 10-50 МГц, с его выхода внутри получается такт сотни мегагерц.
Впрочем, можно подать внешний тактовый сигнал и на любой другой вход, но максимально возможная частота будет меньше (внутри с выхода PLL частота такта в вашем чипе может быть больше 200 МГц, а через вывод хорошо если 40-50 пролезет).

Можете нарисовать тут свою схему. Или скриншот из квартуса.
0
1 / 1 / 2
Регистрация: 06.07.2009
Сообщений: 54
01.05.2021, 13:11  [ТС] 5
Да, вот схема, буду благодарен за помощь.
0
Миниатюры
Задержка сигналов в ПЛИС  
1 / 1 / 2
Регистрация: 06.07.2009
Сообщений: 54
01.05.2021, 13:14  [ТС] 6
Подскажи, пожалуйста, вот про эти задержки:

inertial – инерционная задержка
Передача сигнала будет иметь место, если входной сигнал будет сохранять соответствующий уровень в течении указанного отрезка времени — имитирует время срабатывание устройства
X <= inertial Y after 3 ns;
transport – транспортная задержка
Все изменения сигнала будет присваиваться с задержкой — имитирует задержку на линиях
X <= transport Y after 3 ns;
По умолчанию используется инерционная задержка
X <= Y after 3 ns;

Компилятор их уберет, т.е. они нужны только для отладки, так?
0
2571 / 1850 / 403
Регистрация: 11.09.2009
Сообщений: 6,872
01.05.2021, 23:16 7
Цитата Сообщение от pvg_79 Посмотреть сообщение
вот схема
Схема ужасна. К ней применимо всё написанное выше.
Начните с начала, с продумывания логики её работы.
0
1 / 1 / 2
Регистрация: 06.07.2009
Сообщений: 54
02.05.2021, 20:29  [ТС] 8
Цитата Сообщение от i8085 Посмотреть сообщение
Начните с начала, с продумывания логики её работы.
Это как, подскажи, я прекрасно понимаю логику работы схемы как электронщик, а как ее сделать для ПЛИС ???
Или проще описать в Verilog работу схемы.
0
124 / 93 / 18
Регистрация: 15.11.2012
Сообщений: 582
02.05.2021, 21:41 9
Чем-то напоминает логику управления памятью в клоне ZX-Spectrum...

У вас есть возможность выход inst20 подавать не прямо на inst3, а разорвать их внешними выводами CPLD? А снаружи их соединить. Это заставит синтезатор сделать полные верхнюю и нижнюю схемы. Как вариант, просто вывести линию между inst20 и inst3 на внешний вывод. Никуда его не подключая.

Синтезатор Quartus вообще частенько слишком увлекается "оптимизацией", убирая то, что убирать не надо. У меня такой случай когда-то был. Схема не работала. Не работала и в симуляторе тоже. Причем у меня было там и тактирование и прочее. Но один логический узел внутри FPGA не работал как должен (не выдавал нужный сигнал). В процессе симуляции я пытался вывести состояние этого логического узла на экран симуляции и... не нашел в схеме после синтеза этого узла вообще. Прифигев, я подключил вывод этого узла на внешний вывод. Вывод этот никуда у меня снаружи не шел, благо свободные выводы были, но я вынудил Quartus блок создать. Все заработало. Убрал внешний вывод - работать перестало.

Потом я перешел на Xilinx. Там таких косяков не было. Хотя там своих радостей хватает -)).

Добавлено через 1 минуту
Цитата Сообщение от pvg_79 Посмотреть сообщение
Компилятор их уберет, т.е. они нужны только для отладки, так?
Да. Языки универсальны, а реализация на "железе" имеет ограничения. Никаких задержек, указанных в программе, создаваться не будет, ибо нечем. Зато появятся те, которых в программе нет -)).
1
2571 / 1850 / 403
Регистрация: 11.09.2009
Сообщений: 6,872
03.05.2021, 01:22 10
Цитата Сообщение от pvg_79 Посмотреть сообщение
Это как, подскажи, я прекрасно понимаю логику работы схемы как электронщик
Верхняя часть схемы. Формирователь сигнала CLK для тактирования триггера. Выходной импульс собирается логикой из кучи входных сигналов.
Попробуйте нарисовать временные диаграммы этих входных сигналов, но у каждого в местах переходов из одного состояния в другое нарисуйте зону неопределённости длительностью несколько наносекунд. Внутри ПЛИС сигнал может перейти из одного состояния в другое в произвольный момент в этой зоне неопределённости.
Схему надо проектировать глядя вот на такой входной сигнал. Сможете нарисовать без тактировки так, чтобы на выходе был нужный вам импульс без "дребезга" (т.е. без этих зон неопределённости) на фронтах - схема будет работать. Принципиально не получается - требуется тактировка.
0
124 / 93 / 18
Регистрация: 15.11.2012
Сообщений: 582
03.05.2021, 13:17 11
Цитата Сообщение от i8085 Посмотреть сообщение
Выходной импульс собирается логикой из кучи входных сигналов.
Там есть сигналы OS и RS (насколько я понимаю - output strobe и read strobe). Они процессорами формируются уже после установления адреса и на мой взгляд как раз там проблем быть не должно.
0
1 / 1 / 2
Регистрация: 06.07.2009
Сообщений: 54
03.05.2021, 19:25  [ТС] 12
Цитата Сообщение от alexey6689 Посмотреть сообщение
Чем-то напоминает логику управления памятью в клоне ZX-Spectrum...
Да верно, управление ROM.
Цитата Сообщение от alexey6689 Посмотреть сообщение
Там есть сигналы OS и RS (насколько я понимаю - output strobe и read strobe)
OS и RS это тоже адреса, старшие просто так называются.
Попробую вывести на ножку ПЛИС, не получится, буду описывать через Verilog.

Добавлено через 22 минуты
В данной схеме сигналом тактирования можно считать RDR при переходе от 0 к 1 триггер должен сработать, при условии, что все адреса равны 0, а A8 равен 1. вот только куда воткнуть сигнал от адресов.

В Verilog это можно сделать таким образом:
Код
always @(posedge RDR)
	begin
		if( adr==1 )
		begin
			pl <= newpl;
		end
	end
0
124 / 93 / 18
Регистрация: 15.11.2012
Сообщений: 582
03.05.2021, 23:01 13
Цитата Сообщение от pvg_79 Посмотреть сообщение
В Verilog это можно сделать таким образом:
RDR имеет нулевой активный уровень? Тогда может и заработать, если использовать именно фронт RDR для записи.
0
1 / 1 / 2
Регистрация: 06.07.2009
Сообщений: 54
04.05.2021, 20:59  [ТС] 14
Всем доброго времени суток, написал код на Verilog откомпилировал, ошибок нет, загрузил в ПЛИС стало намного лучше чем в первом проекте, но еще работает нестабильно:
где может быть косяк, и в последнем блоке (always @(posedge RDR) "типа триггер") можно как-то поставить задержку 40-50нс.
Код
module ADR3032(
	A4,
	A5,
	A8,
	A6,
	A7,
	A9,
	A11,
	A12,
	A13,
	RS,
	OS,
	A2,
	A3,
	KAY_D40,
	mode,
	RDR,
	A10,
	A17,
	A16,
	OS_out,
	RS_out
);

input wire	A4;
input wire	A5;
input wire	A8;
input wire	A6;
input wire	A7;
input wire	A9;
input wire	A11;
input wire	A12;
input wire	A13;
input wire	RS;
input wire	OS;
input wire	A2;
input wire	A3;
input wire	KAY_D40;
input wire	mode;
input wire	RDR;
input wire	A10;
output reg	A16;
output reg	A17;
output wire	OS_out;
output wire	RS_out;

reg A16_new;
reg A17_new;
wire	SIGNAL_OS_MODE;
wire	SIGNAL_OS_MODE_not;
wire  SIGNAL_ADR;

assign	SIGNAL_OS_MODE = OS ^ mode;

assign	SIGNAL_OS_MODE_not = SIGNAL_OS_MODE & ~KAY_D40;

assign	OS_out = ~SIGNAL_OS_MODE_not;

assign	RS_out = RS & ~KAY_D40;

assign	SIGNAL_ADR = A4 | A5| A6 | A7 | ~A8 | A9 | A10 | A11 | A12 | A13 | SIGNAL_OS_MODE_not | RS_out;

always @(A3 or A2 or A17 or A16)
begin
	case( {A3,A2,A17,A16} )
	4'b0000:
		begin 
			A17_new = 0;
			A16_new = 0; 
		end
	4'b0001:
		begin
			A17_new = 0;
			A16_new = 1;  
		end
	4'b0010:
		begin
			A17_new = 1;
			A16_new = 0;  
		end
	4'b0011:
		begin
			A17_new = 1;
			A16_new = 1;  
		end
	4'b0100:
		begin
			A17_new = 1;
			A16_new = 1; 
		end
	4'b0101:
		begin
			A17_new = 1;
			A16_new = 1;  
		end
	4'b0110:
		begin
			A17_new = 1;
			A16_new = 1; 
		end
	4'b0111:
		begin
			A17_new = 1;
			A16_new = 0; 
		end
	4'b1000:
		begin
			A17_new = 1;
			A16_new = 0; 
		end
	4'b1001:
		begin
			A17_new = 1;
			A16_new = 0; 
		end
	4'b1010:
		begin
			A17_new = 0;
			A16_new = 0;  
		end
	4'b1011:
		begin
			A17_new = 0;
			A16_new = 1; 
		end
	4'b1100:
		begin
			A17_new = 0;
			A16_new = 1; 
		end
	4'b1101:
		begin
			A17_new = 0;
			A16_new = 0;  
		end
	4'b1110:
		begin
			A17_new = 0;
			A16_new = 1; 
		end
	4'b1111:
		begin
			A17_new = 0;
			A16_new = 0; 
		end
	endcase
end






always @(posedge RDR)
	begin
		if( SIGNAL_ADR == 0 )
		begin
			A17 = A17_new;
			A16 = A16_new;
		end
	end

endmodule
0
124 / 93 / 18
Регистрация: 15.11.2012
Сообщений: 582
05.05.2021, 00:02 15
Нужно иметь сигнал, который переходит из 1 в 0 (ну или 0 в 1) тогда, когда на линиях
Цитата Сообщение от pvg_79 Посмотреть сообщение
A3 or A2 or A17 or A16
уже выставлены нужные уровни.

Сама идея построения вида
Цитата Сообщение от pvg_79 Посмотреть сообщение
always @(A3 or A2 or A17 or A16)
скорее всего не будет нормально работать - ведь A3 например может смениться чуть ранее A2 и получится фигня.

Можно попробовать использовать сигнал MREQ от процессора, он приходит раньше RDR, хоть и не сильно.
И написать что-то типа
C
1
2
3
4
always @(negedge MREQ)
begin
    case( {A3,A2,A17,A16} )
.....
Впрочем, можно попробовать и сам RDR. Только для получения A17_new и A16_new использовать negedge,
а для вывода их на A17 и A16 - posedge.

в базисе FPGA/CPLD схема стабильно работает только тогда, когда она не зависит от задержек, выражаемых единицами времени, поэтому идей вида "мне бы задержку на 40 нс" быть не должно. Вот идея вида "нужна задержка на два такта (или даже на половину такта, хотя здесь уже возможны проблемы) такой-то частоты" - нормальна.
0
1 / 1 / 2
Регистрация: 06.07.2009
Сообщений: 54
05.05.2021, 20:05  [ТС] 16
В сем спасибо за помощь, заработало.
заменил posedge на negedge, я делал как в схеме она же работает, а ТМ2 работает по фронту.
Немного покурил, ведь при обращении к памяти адреса и сигнал выбора RDR формируется почти одновременно, адреса раньше чем RDR переходит в 0, вот и решил попробовать и заработало.

Код
always @(negedge RDR)
	begin
		if( SIGNAL_ADR == 0 )
		begin
			A17 = A17_new;
			A16 = A16_new;
		end
	end
Добавлено через 6 минут
Подскажи, alexey6689.
Если я сделаю цикл, что-то вроде этого:

Код
module ADR3032(
...
	Test
);

...
output reg	Test;

...
integer n;
integer i;

always @(negedge RDR)
	begin
		if( SIGNAL_ADR == 0 )
		begin
			n = 0;
			Test = 0;
			for (i = 0; i<100; i = i+1)
			begin
				n=n+1;
				Test = A3;
			end
			
			if (n == 100)
			begin
				A17 = A17_new;
				A16 = A16_new;
			end	
			
		end
	end

endmodule
Задержка будет и если ДА то какая?
Или так нельзя делать.
Speed grade установлен 10.
0
124 / 93 / 18
Регистрация: 15.11.2012
Сообщений: 582
05.05.2021, 22:45 17
Цитата Сообщение от pvg_79 Посмотреть сообщение
Задержка будет и если ДА то какая?
Задержки не будет. Вся конструкция с циклом for и проверкой условия (n==100) будет исключена. Да и вообще не факт что соберется, поскольку формально имеет место множественное присваивание.

В Verilog (как и в VHDL и т.д.) вообще нет понятия последовательности выполнения. Ты не можешь одной переменной присвоить два разных значения по одному фронту/спаду. Хоть это и не схема а текст - переводится все равно в схему. Любая переменная - это по факту набор триггеров, запись в которые идет по фронту/спаду тактовой частоты. Ты не можешь на один вход триггера подать сразу два сигнала, ведь так? Также не могут реализовываться задержки - запись в триггера (а A16 и A17 это именно триггера) происходит именно по фронту/спаду клока, а не "чуть позже" или "чуть раньше".

Цикл for в Verilog нужен для размножения однотипных выражений. Иногда это удобно, например:
C
1
2
3
4
5
6
7
8
9
10
11
integer n;
reg [4:0] d;
reg [9:0] s;
always @(negedge RDR)
begin
for (n = 0;n<5;n=n+1)
begin
s[n*2] <= d[n];
s[n*2+1] <= 1'b0;
end
end
по negedge RDR запишет в s содержимое d с нулями между. Никакой последовательности не будет и переменной n не будет. Это будет полностью эквивалентно форме:
C
1
2
3
4
5
6
7
integer n;
reg [4:0] d;
reg [9:0] s;
always @(negedge RDR)
begin
s <= {d[0],1'b0,d[1],1'b0,d[2],1'b0,d[3],1'b0,d[4],1'b0};
end
Конструкция что ты написал означает следующее:
по КАЖДОМУ negedge RDR если SIGNAL_ADR == 0 сто раз произвести операцию n = n + 1 и т.д. Именно в одном цикле сразу.
Ну а поскольку результат такой операции можно вычислить еще на этапе синтеза - просто будет сразу считаться что n = 100, значит условие (if n == 100) всегда выполняется. Поэтому этого n и всего что с ним связано вообще не останется.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.05.2021, 22:45

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Построить временные диаграммы выходных сигналов триггеров для заданных входных сигналов
1 задание. Построить временную диаграмму выходных сигналов T-триггера при заданных входных...

Обработка ЧМ сигналов(спектры ЧМ сигналов)
Доброго времени суток! Ранее задавала вопрос: &quot;Алгоритм обработки ЧМ сигналов, основанный на...

Сделать - Формирование сигналов в виде импульсных последовательностей и Формирование типовых случайных сигналов
Здравствуйте, помогите пожалуйста сделать &quot;Формирование сигналов в виде импульсных...

ПЛИС
Приветствую! Поработав некоторое время с МК, меня все равно тянет в сторону ПЛИС :) Собственно и...

ПЛИС разработка
Здравствуйте Товарищи. С недавних пор начал заниматься программированием на ПЛИС. В целом можно...

ПЛИС и радиопередатчик.
Ребят. А таки реально сделать радиопередатчик на ПЛИС? В идеале вообще хотелось бы получить wifi....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.