|
Синхронный счетчик для измерения частоты |
|
|
|
 |
Ответов
(15 - 29)
|
Aug 31 2007, 06:37
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(Andrewak @ Aug 29 2007, 13:11)  Совершенно верно. Но я написал: "Скорость работы счётчика как раз и определяется скоростью щёлканья триггера." Может быть написал не совсем корректно, но я имел в виду, что это основополагающий фактор. Задержка распространения между ячейками есть в любой ПЛИС. Максимальная частота тактирования триггра является основополагающим фактором при разрядностьях счетчика обычно не более полдюжины, а вот при бОльших разрядностях (а у нас тут рассматривается именно такой случай) доминирующим фактором становятся задержки на цепях переноса. И максимальная частота счетчика определяется именно суммой задержек вычислений переносов и самих переносов, т.к. следующий фронт клока не может быть подан (при правильной работе счетчика) до тех пор, пока на входах триггеров счетчика не установятся новые значения, а это произойдет только после того, как отработает комбинационная логика, вычисляющая значения переносов, и сигналы переносов не пройдут по своим цепям. Именно это и ограничивает максимальные частоты. Для борьбы с этим иногда применяют спецальные архитектуры как, например, в Cyclone, где значения каждого из пятиразрядных блоков вычисляется параллельно, но в одном случае для переноса, равного 0, в другом - для переноса, равного 1, а когда реальное значение выходит из предыдущего 5-разрядного блока, то производится просто переключение между уже вычисленными значениями. Эта архитектура называется Carry-Select. Очень эффективное решение в плане повышения быстродействия. Но весьма дорогое, по причине чего в Cyclone II он него отказались.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Aug 31 2007, 14:07
|
Профессионал
    
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643

|
Приветствую! Соотносится очень просто - каждый следующий триггер работает на половинной часте предыдущего. Поэтому макс. чатота определяется только первым триггером. Заодно и разрешение счета управляет только одним первым триггером, а не разветвляется на все триггеры в синхронной схеме. На картинке кусок счетчика после синтеза в Synplify. Успехов! Rob.
|
|
|
|
|
Aug 31 2007, 16:13
|

Гуру
     
Группа: Модераторы
Сообщений: 2 095
Регистрация: 27-08-04
Из: Россия, СПб
Пользователь №: 553

|
Цитата Вот я и хочу понять, как соотнести многоразрядный асинхронный последовательный счетчик с высокой частотой следования импульсов счета на первом триггере. ... Рассмотрим систему из 4 D-триггеров(Т- специально брать не будем) c выводами C(тактовый), D(вход) и Q(выход) и запишем уравнения : C1=входной сигнал;D1=!Q1;(частота с1=fin) C2=Q1;D2=!Q2;(частота с2=fin/2) C3=Q2;D3=!Q3;(частота с3=fin/4) C4=Q3;D4=!D4;(частота с4=fin/8) .... Вот в принципе и все) А сложность снятия данных заключается в том, что реакция на Q4 может появиться позже, чем закончится период на С1 за счет задержек.
|
|
|
|
|
Aug 31 2007, 16:40
|
Профессионал
    
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643

|
Приветствую! Код module Flip(Clk,En,Rst,Q) /* synthesis syn_hier = "hard" */; input Rst,Clk,En; output reg Q;
always @(posedge Clk or posedge Rst) begin if (Rst) Q<=0; else if (En) Q<=~Q; end endmodule
module AsynjCnt(Clk,En,Rst,Q) /* synthesis syn_hier = "hard" */; parameter WH=16;
input Clk,Rst,En; output [WH-1:0] Q;
//reg [WH-1:0] rC /* synthesis syn_keep = 1 */; wire [WH-1:0] wClki; wire [WH-1:0] wClk;
assign wClki={~Q[WH-2:0],Clk}; assign #(1) wClk =wClki;
generate genvar ii; begin:gen for (ii=0;ii<WH;ii=ii+1) begin:cnt if (ii==0) Flip flp(.Clk(wClk[ii]),.En(En) ,.Rst(Rst),.Q(Q[ii])); else Flip flp(.Clk(wClk[ii]),.En(1'b1),.Rst(Rst),.Q(Q[ii])); end end endgenerate
endmodule Вот собственно и кусок кода картинка которого приведенна выше. Удачи! Rob
|
|
|
|
|
Sep 1 2007, 08:36
|
Гуру
     
Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804

|
Цитата(dxp @ Sep 1 2007, 09:47)  У буржуинов для такого счетчика даже имеется название: ripple-carry counter. В доFPGA'шные (рассыпушные) времена были весьма популярны в силу простоты реализации, малому потреблению ресурсов по сравнению с синхронным счетчиком. С развитием ПЛИС необходимость в таких счетчиках почти отпала (за исключением случаев, подобных обсуждаемому). В середине 90-х у Альтеры была целая апнота, где описывались недостатки ripple-carry counter'ов и рекомендовалось использовать синхронные счетчики (при этом не забывалось подчеркнуть, как классно такой счетчик реалзиуется уже на FLEX8000 в carry look-ahead режиме  ). Мы как всегда шли своим путем. Уже на 133 серии стало понятна бесперспективность использования последовательных счетчиков в "высокоскоростных" устройствах. И даже некая угроза качеству разработки, потому что многие добивались работоспособности устройства с помощью rc цепочек при серийном изготовлении. А с переходом на 530 серию о последователльных счетчиках вообще забыли, потому что их уже не было в номенклатуре этой серии, что позволило интуитивно сразу перейти на одноклоковую синхронизацию при проектировании. Поэтому на FPGA такая схема ложилась не глядя, а вот те, кто с временными колбасками работал, пролетели по полной. Вот я и подумал, что мой опыт сыграл со мной злую шутку и я упустил что то важное. А ссылка на FLEX8000, ab_137, так там под именем ripple-carry counter нарисована связка триггеров, тактируемых одним клоком. Кстати необходимость в последовательном счетчике я и здесь не почувствовал. Частота то таже получилась. Правда повторюсь без указаний синтезатору (неохота сейчас замену подбирать в своем пакете)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|