Перейти к содержанию
    

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

Сделайте синхронный, синтезируемый проект, как здесь

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Синхронный не получается. Мне надо запуск импульса от одного клока, а спад - по другому

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Синхронный не получается. Мне надо запуск импульса от одного клока, а спад - по другому

синхронный получиться если правильно реализовать переходы в разные клоковые домены

 

Литература 1

Литература 2

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А поругайте такой код: (будет ли он работать в железе?)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А поругайте такой код: (будет ли он работать в железе?)

Есть запись

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

То что требуется описано чуть выше. Отрицательный clk проверяется, что бы импульс tdc_pld_new всегда не превышал длительность clk.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Синхронный не получается. Мне надо запуск импульса от одного клока, а спад - по другому

 

В таком случае опишите эти клоки - синхронные, один получен делением другого, полностью аснхронные.....

иначе толковую схему не предложить.

Лутше пояснить времянкой...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На самом деле все тривиально. 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 валит постоянно. 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

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ОК.

...

Вас устроит задержка перепада comp_in в 2 clk?

...

не вяжется Ваше ОК с Вашим вопросом. не вижу чтоб на (posedge comp) (pld_out <=1).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ОК.

Вся цифра работает на 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). Таким образом, измерив напряжение на конденсаторе, можно узнать "в каком месте" клока пришел фронт с компаратора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не так. 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 нельзя ни к кому привязывать"?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 может пропустить пару тактов, но он должен их ВСЕГДА пропускать, т.е. одинаковое количество.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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х.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...