Poluektovich 0 21 февраля, 2012 Опубликовано 21 февраля, 2012 · Жалоба Здесь если не латчи, то комбинационную петлю получите. Сделайте синхронный, синтезируемый проект, как здесь Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
eu1cc 0 21 февраля, 2012 Опубликовано 21 февраля, 2012 · Жалоба Синхронный не получается. Мне надо запуск импульса от одного клока, а спад - по другому Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 21 февраля, 2012 Опубликовано 21 февраля, 2012 · Жалоба Синхронный не получается. Мне надо запуск импульса от одного клока, а спад - по другому синхронный получиться если правильно реализовать переходы в разные клоковые домены Литература 1 Литература 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
eu1cc 0 22 февраля, 2012 Опубликовано 22 февраля, 2012 · Жалоба А поругайте такой код: (будет ли он работать в железе?) module tdc ( // {{ALTERA_ARGS_BEGIN}} DO NOT REMOVE THIS LINE! clk, comp_in, enable, tdc_pld, start // {{ALTERA_ARGS_END}} DO NOT REMOVE THIS LINE! ); // Port Declaration // {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE! input clk; input comp_in; input enable; output tdc_pld; output start; // {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE! reg tdc_pld_new; reg start_new; reg tmp; initial begin tdc_pld_new = 0; start_new = 0; tmp = 0; end assign tdc_pld = tdc_pld_new; assign start = start_new; always @ (posedge comp_in or posedge enable) begin if (enable) tmp <= 0; else if (comp_in && !start_new) tmp <= 1; end always @(posedge clk or posedge tmp) begin if (tmp) begin if (!start_new) begin if (!clk) begin tdc_pld_new <= 1; start_new <= 1; end else tdc_pld_new <= 1; end else tdc_pld_new <= 0; end if (clk) begin if (enable) begin start_new <= 0; tdc_pld_new <= 0; end else if (!start_new && tmp) start_new <= 1; end end endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bogaev_roman 0 22 февраля, 2012 Опубликовано 22 февраля, 2012 · Жалоба А поругайте такой код: (будет ли он работать в железе?) Есть запись always @(posedge clk or posedge tmp) begin if (tmp) begin if (!start_new) begin if (!clk).... Первая строчка вроде должна описывать триггер с тактовым входом clk и асинхронным сбросом tmp. Далее вижу if (!clk), т.е. на вход данных этого триггера поступает зависимость от тактовой частоты ~clk, такого вообще быть не может. Во что это выльется представить сложно... Думаю синтезатор это не проглотит, а если и проглотит, то опять же все выльется в комбинаторику. Да и два равнозначных if для одной переменной... Подход у Вас какой-то не "схемотехнический". Вы бы лучше подробно описали чего требуется, или временную диаграмму примерную, может код быстренько кто и накатал. reg comp_in_r; always @(posedge clk) comp_in_r<=comp_in; always @(posedge clk) if (clr) zamok<=1'b0; else if (~comp_in_r&comp_in) zamok<=1'b1; else zamok<=zamok; если comp_in по длительности больше одного такта clk, то здесь получите ~comp_in_r&comp_in импульс в один такт clk и на следующией такт блокировку zamok=1 до момента прихода clr. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
eu1cc 0 23 февраля, 2012 Опубликовано 23 февраля, 2012 · Жалоба То что требуется описано чуть выше. Отрицательный clk проверяется, что бы импульс tdc_pld_new всегда не превышал длительность clk. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
topor_topor 0 24 февраля, 2012 Опубликовано 24 февраля, 2012 · Жалоба Синхронный не получается. Мне надо запуск импульса от одного клока, а спад - по другому В таком случае опишите эти клоки - синхронные, один получен делением другого, полностью аснхронные..... иначе толковую схему не предложить. Лутше пояснить времянкой... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
eu1cc 0 25 февраля, 2012 Опубликовано 25 февраля, 2012 · Жалоба На самом деле все тривиально. clk - 100MHz валит постоянно. comp_in - сигнал от компаратора, т.е асинхронный ко всем сигналам. Максимальная частота - до 50МГц. enable - сигнал сброса (активный 1). tdc_pld - выход строба. start - выход сигнал разрешения работы последующей схемы. Принцип работы в следующем: пока enable == 1 ничего не делаем. tdc_pld = 0, start = 0. Когда enable перекидывается в 0 ждем первого прихода перепада comp_in из 0 в 1 и выставляем tdc_pld в 1 и start в 1. при приходе перепада clk из 0 в 1 tdc_pld выставляем в 0. После этого, пока enable в 0 ничего не делаем. Когда enable перекидывается в 1 start сбрасываем в 0. Чип MAX3000 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stu 0 27 февраля, 2012 Опубликовано 27 февраля, 2012 · Жалоба а если фронт comp_in и clk_100 совпадут? что тогда? вероятность мала, но есть ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
topor_topor 0 27 февраля, 2012 Опубликовано 27 февраля, 2012 · Жалоба На самом деле все тривиально. clk - 100MHz валит постоянно. comp_in - сигнал от компаратора, т.е асинхронный ко всем сигналам. Максимальная частота - до 50МГц. enable - сигнал сброса (активный 1). tdc_pld - выход строба. start - выход сигнал разрешения работы последующей схемы. Принцип работы в следующем: пока enable == 1 ничего не делаем. tdc_pld = 0, start = 0. Когда enable перекидывается в 0 ждем первого прихода перепада comp_in из 0 в 1 и выставляем tdc_pld в 1 и start в 1. при приходе перепада clk из 0 в 1 tdc_pld выставляем в 0. После этого, пока enable в 0 ничего не делаем. Когда enable перекидывается в 1 start сбрасываем в 0. Чип MAX3000 ОК. Вся цифра работает на clk=100MHz (т.е. enable, tdc_pld, start синхронны clk) Мы имеем только оди асинхронный вход - comp_in. 1) comp_in надо превязать к clk при помощи синхронизатора из 2-х флопов. Вас устроит задержка перепада comp_in в 2 clk? wire comp_in_sync; reg [1:0] sync_rg; always @ (posedge clk) sync_rg[1:0] <= {sync_rg[0], comp_in}; assign comp_in_sync =sync_rg[1]; 2) tdc_pld формируем на диференциаторе (or posedge detector). Можно использовать sync_rg[1] как часть диференциатора (diff_rg0): wire tdc_pld; reg diff_rg1; always @ (posedge clk) begin if (!enable) diff_rg1 <= sync_rg[1]; else diff_rg1 <= diff_rg1; end assign tdc_pld = sync_rg[1] & (~diff_rg1); 3) start - RS тригер в котором R=enable S=comp_in_sync; reg start; always @ (posedge clk) begin if (enable) start <= 1'b0; else begin if (comp_in_sync) start <= 1'b1; else start <= start; end end Не симулил, но где-то типа так.... Ресет асинхронный опустил для наглядности.... Схема роботоспособна при времени comp_in=1 < времени enable=0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stu 0 28 февраля, 2012 Опубликовано 28 февраля, 2012 · Жалоба ОК. ... Вас устроит задержка перепада comp_in в 2 clk? ... не вяжется Ваше ОК с Вашим вопросом. не вижу чтоб на (posedge comp) (pld_out <=1). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
eu1cc 0 29 февраля, 2012 Опубликовано 29 февраля, 2012 · Жалоба ОК. Вся цифра работает на clk=100MHz (т.е. enable, tdc_pld, start синхронны clk) Мы имеем только оди асинхронный вход - comp_in. Не так. enable - внешний сигнал и к clk не привязан. tdc_pld стартовать обязан по comp_in, а спадать по clk. start - не критично, можно с clk увязать. tdc_pld может пропустить пару тактов clk. comp_in нельзя ни к кому привязывать. Вообще, пытаюсь сделать TDC (time to digital converter). Т.е. мне надо с приходом сигнала от компаратора comp_in запустить генератор тока (tdc_pld <= 1), для зарядки конденсатора, а после прихода clk его остановить (tdc_pld <= 0). Таким образом, измерив напряжение на конденсаторе, можно узнать "в каком месте" клока пришел фронт с компаратора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
topor_topor 0 1 марта, 2012 Опубликовано 1 марта, 2012 · Жалоба Не так. enable - внешний сигнал и к clk не привязан. tdc_pld стартовать обязан по comp_in, а спадать по clk. start - не критично, можно с clk увязать. tdc_pld может пропустить пару тактов clk. comp_in нельзя ни к кому привязывать. Вообще, пытаюсь сделать TDC (time to digital converter). Т.е. мне надо с приходом сигнала от компаратора comp_in запустить генератор тока (tdc_pld <= 1), для зарядки конденсатора, а после прихода clk его остановить (tdc_pld <= 0). Таким образом, измерив напряжение на конденсаторе, можно узнать "в каком месте" клока пришел фронт с компаратора. В такой постановке задачи, понятие синхронного дизайна не применимо впринципе. Есть вопрос к постановке задачи ("измерив напряжение на конденсаторе, можно узнать "в каком месте" клока пришел фронт с компаратора."): 1) а что если comp_in прийдёт 1нс (1пс....) перед clk перепадом? Ваша ёмкость успеет зарядиться? 2) А чем это Вы напряжение на конденсаторе померяете? Не АЦП ли? А какое время ему надо для измерения? 3) А зачем Вам этот сдвиг надо знать? Может задачу по другому надо решать..... 4) А нельзя-ли увеличитьВаш clk и померять время напрямую - счётчиком? ----- 5) "tdc_pld может пропустить пару тактов clk. comp_in нельзя ни к кому привязывать" Вот тут не понятно.... "tdc_pld может пропустить пару тактов clk" - значит ли это, что запуск Вашего генератора тока можно отложить на 1-2 clk? Если да, то это значит, что tdc_pld будет сдвинут относительно фронта comp_in. Правильно? Аналогично сдвиг tdc_pld можно получить, сдвинув comp_in на 1-2 clk, а сам tdc_pld выдать моментально по фронту сдвинутого comp_in (comp_in_sync). Т.е. как я Вам и описал на верилоге..... Таким образом "comp_in нельзя ни к кому привязывать" противоречит "может пропустить пару тактов clk". Правильно? Или есть другая причина почему "comp_in нельзя ни к кому привязывать"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
eu1cc 0 1 марта, 2012 Опубликовано 1 марта, 2012 · Жалоба 1) а что если comp_in прийдёт 1нс (1пс....) перед clk перепадом? Ваша ёмкость успеет зарядиться? 2) А чем это Вы напряжение на конденсаторе померяете? Не АЦП ли? А какое время ему надо для измерения? 3) А зачем Вам этот сдвиг надо знать? Может задачу по другому надо решать..... 4) А нельзя-ли увеличитьВаш clk и померять время напрямую - счётчиком? ----- 5) "tdc_pld может пропустить пару тактов clk. comp_in нельзя ни к кому привязывать" Вот тут не понятно.... "tdc_pld может пропустить пару тактов clk" - значит ли это, что запуск Вашего генератора тока можно отложить на 1-2 clk? 1. Собственно и надо "разбить" 100МГц (10нс) на 10 частей. (по 1нс) 2. Да, АЦП, а при чем тут время? Времени в этом случае, как раз таки предостаточно. 3., 4., почитайте принцип эквивалентных выборок. 5. tdc_pld может пропустить пару тактов, но он должен их ВСЕГДА пропускать, т.е. одинаковое количество. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
topor_topor 0 2 марта, 2012 Опубликовано 2 марта, 2012 · Жалоба 1. Собственно и надо "разбить" 100МГц (10нс) на 10 частей. (по 1нс) 2. Да, АЦП, а при чем тут время? Времени в этом случае, как раз таки предостаточно. 3., 4., почитайте принцип эквивалентных выборок. 5. tdc_pld может пропустить пару тактов, но он должен их ВСЕГДА пропускать, т.е. одинаковое количество. 1) OK. Если это нормально на генератор тока подать импульс 1нс или меньше (как фронты совпадут).... ....правда при этом любая цифровая схема у которой на одном входе comp_in а на другом clk словит метастабильность...... 2) АЦП при том, что оно имеет конечное время преобразования... Как я понял, в Вашем случаэ АЦП должен успевать за 1нс (чтобы розбить период на 10 частей)... Неплохой такой АЦП... Или я как-то не так "достаточное время" понял? 5) "tdc_pld может пропустить пару тактов, но он должен их ВСЕГДА пропускать, т.е. одинаковое количество." Весь вопрос в требуемой точности. Может таки можна увеличить clk раза в 2 и пропускать 1-2 такта.... 6) Кажется мне, что Вашу задачу надо переформулировать: как сделать асинхронный RS ригер с динамическими входами (R & S срабатывают по положительному перепаду). При этом S=comp_in, R=clkб а Q=tdc_pld? Не к этому ли решению Вы клоните, уходя от синхронного принципа дизайна? ..... Вижу отсюда ноги ростут: http://electronix.ru/forum/index.php?showt...98383&st=15 Так-бы и сразу. В осцилографах я не спец.... но как сделать АЦП в 10 раз быстрее могу предложить Ставите 10 тактируемых АЦП и подаёте тактовые клоки со сдвигом. Проще всего иметь 10х базовый клок и поделить его на 10 сдвинутых 1х. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться