реклама на сайте
подробности

 
 
> преобразователь КОД-ЧАСТОТА
Iptash
сообщение Nov 15 2008, 16:47
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 613
Регистрация: 2-09-08
Из: г.Набережные Челны
Пользователь №: 39 936



Есть задача изготовить многоканальный преобразовватель код-частота. В голову приходит
только одно решение, сделать на подобии МК таймера с перезагрузкой по переполнении счетчиков,
т.е. параллельный внешний код загружается в счетчики, на тактирующий вх. подается частота,
этот код увеличивается до переполнения где происходит новая запись кода и т.д.. Вот только
смущает время реакции так сказать при маленьком коде, где до следующей перезаписи проходит
большое время, а код уже изменился и уже должна быть другая частота. Я не знаю понятно ли
изложил суть задачи?. Может кто нибудь решал подобные задачи.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sazh
сообщение Nov 15 2008, 17:37
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



счетчик на вычитание. По своему переносу загружает новое значение из регистра.
Go to the top of the page
 
+Quote Post
Iptash
сообщение Nov 15 2008, 17:50
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 613
Регистрация: 2-09-08
Из: г.Набережные Челны
Пользователь №: 39 936



Цитата(sazh @ Nov 15 2008, 20:37) *
счетчик на вычитание. По своему переносу загружает новое значение из регистра.


Ну я так и говорю, только по переполнению(без разницы). Но это должно быть в реальном времени
т.е. вх. код может в любое время измениться, а счетчик еще не досчитал, вот здесь как быть?
Go to the top of the page
 
+Quote Post
sazh
сообщение Nov 15 2008, 18:04
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Цитата(Iptash @ Nov 15 2008, 20:50) *
Ну я так и говорю, только по переполнению(без разницы). Но это должно быть в реальном времени
т.е. вх. код может в любое время измениться, а счетчик еще не досчитал, вот здесь как быть?

Значит проигнорировал изменение.
По переполнению (прерыванию) код должен меняться и устаканиться к ожидаемому переполнению
Go to the top of the page
 
+Quote Post
Iptash
сообщение Nov 15 2008, 18:20
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 613
Регистрация: 2-09-08
Из: г.Набережные Челны
Пользователь №: 39 936



Цитата(sazh @ Nov 15 2008, 21:04) *
Значит проигнорировал изменение.
По переполнению (прерыванию) код должен меняться и устаканиться к ожидаемому переполнению

Игнорировать нельзя. Устройство реального времени. Запись кода происходит допустим каждую
1мс. и мне кажется, что нужно при записи делать логическое сложение данных в счетчике и
кода. Как вы думаете?.
Go to the top of the page
 
+Quote Post
sazh
сообщение Nov 15 2008, 18:57
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Цитата(Iptash @ Nov 15 2008, 21:20) *
Игнорировать нельзя. Устройство реального времени. Запись кода происходит допустим каждую
1мс. и мне кажется, что нужно при записи делать логическое сложение данных в счетчике и
кода. Как вы думаете?.

Не понятно, что такое логическое сложение. Возможны наверно два варианта. Первый - это пока заданное не отработает, игнорирует записанный код в регистре. Второй вариант - Снова перезаписывает новое значение кода - и до переполнения. Не понятно что получается.
Вот пример, наверно базисный.

Код
module shim_test
(
input       clk,
input [7:0] period,
input [7:0] interval,
output reg  l_int,
output      shim,
output reg  ochibka
);

reg [7:0] ct_a, ct_b;
reg       enable;


always @(posedge clk)
begin
if (ct_a == 8'd1)         begin
ct_a   <=   (period == 8'd0) ? 8'd1 : period;
ct_b   <= (interval == 8'd0) ? 8'd1 : interval;
enable <= 1'b1;
l_int  <= 1'b1;           end
else                                       begin
                     ct_a <= ct_a - 1'b1;
if (enable)          ct_b <= ct_b - 1'b1;
if (ct_b == 8'd1)  enable <= 1'b0;
                    l_int <= 1'b0;         end

ochibka <= (period <= interval);
end

assign shim = enable;

endmodule
Go to the top of the page
 
+Quote Post
Iptash
сообщение Nov 15 2008, 19:33
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 613
Регистрация: 2-09-08
Из: г.Набережные Челны
Пользователь №: 39 936



Цитата(sazh @ Nov 15 2008, 21:57) *
Не понятно, что такое логическое сложение. Возможны наверно два варианта. Первый - это пока заданное не отработает, игнорирует записанный код в регистре. Второй вариант - Снова перезаписывает новое значение кода - и до переполнения. Не понятно что получается.
Вот пример, наверно базисный.

Код
module shim_test
(
input       clk,
input [7:0] period,
input [7:0] interval,
output reg  l_int,
output      shim,
output reg  ochibka
);

reg [7:0] ct_a, ct_b;
reg       enable;
always @(posedge clk)
begin
if (ct_a == 8'd1)         begin
ct_a   <=   (period == 8'd0) ? 8'd1 : period;
ct_b   <= (interval == 8'd0) ? 8'd1 : interval;
enable <= 1'b1;
l_int  <= 1'b1;           end
else                                       begin
                     ct_a <= ct_a - 1'b1;
if (enable)          ct_b <= ct_b - 1'b1;
if (ct_b == 8'd1)  enable <= 1'b0;
                    l_int <= 1'b0;         end

ochibka <= (period <= interval);
end

assign shim = enable;

endmodule

Спасибо. Я подумаю. Если, что надумаю, выложу.


Цитата(Boris_TS @ Nov 15 2008, 22:05) *
Я использую конструкция просто регистр + счетчик, в такой задаче: есть некий подвижный объект, он перемещается с какой-то скоростью, необходимо генерировать импульсы (для запуска чего-то) через равные промежутки расстояния, скорость конечно же меняется... При моих физических ограничениях на возможные ускорения объекта (и !!! заданной минимальной частоты дискретизации) вполне достаточно досчета счетчика по старому значению и по переполнению загрузки нового.
Я вот у Вас как-то до конца не разобрал этот момент...

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

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

Надеюсь не слишком мутно объяснил

У меня тоже для управления неким объектом. ЧПУ выдает код на мое устройство переодом 1мс..
Допустим мое устройство меняет переод от 10мкс. до 1сек.. Вот в случае если записан код для 1сек.
то ЧПУ в этот момент может изменить 1000раз.. Это устройство можно назвать как ЦАП с цифровым
выходом что-ли?. Т.е. мое устройство должно реагировать как ЦАП.
Go to the top of the page
 
+Quote Post
barabek
сообщение Nov 16 2008, 05:51
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Цитата(Iptash @ Nov 16 2008, 05:33) *
Спасибо. Я подумаю. Если, что надумаю, выложу.
У меня тоже для управления неким объектом. ЧПУ выдает код на мое устройство переодом 1мс..
Допустим мое устройство меняет переод от 10мкс. до 1сек.. Вот в случае если записан код для 1сек.
то ЧПУ в этот момент может изменить 1000раз.. Это устройство можно назвать как ЦАП с цифровым
выходом что-ли?. Т.е. мое устройство должно реагировать как ЦАП.


А в чем заморочка собственно? Пусть счетчик считает от нуля до заданного. Т.е. если содержимое счетчика больше заданного (большеИЛИравно?), счетчик обнулять. Заданное обновлять независимо от счетчика. Почему такой вариант не подходит
Код
     wire clk;                                       //input
     wire reload;                                  //input
     wire [MAXWIDTH:0] newlimit;        //input

     reg [MAXWIDTH:0] counter, limit;
     always@(posedge clk)
            if(counter>limit)counter<='d0;
            else counter<=counter+1'b1

    always@(posedge clk)
           if(reload)limit<=newlimit;

можно оба олвейса объеденить, конечно же
Go to the top of the page
 
+Quote Post
Iptash
сообщение Nov 16 2008, 09:01
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 613
Регистрация: 2-09-08
Из: г.Набережные Челны
Пользователь №: 39 936



Цитата(barabek @ Nov 16 2008, 08:51) *
А в чем заморочка собственно? Пусть счетчик считает от нуля до заданного. Т.е. если содержимое счетчика больше заданного (большеИЛИравно?), счетчик обнулять. Заданное обновлять независимо от счетчика...

Заморочка в том, что мое устройство должно "моментально" реагировать на изминение входного кода
и не терять предыдущего(которое еще не "отработано") А считать лучьше от заданного до нуля,
проще схема сравнения и меньше рессурсов понадобиться.
Go to the top of the page
 
+Quote Post
barabek
сообщение Nov 16 2008, 13:22
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Цитата(Iptash @ Nov 16 2008, 19:01) *
Заморочка в том, что мое устройство должно "моментально" реагировать на изминение входного кода
и не терять предыдущего(которое еще не "отработано") А считать лучьше от заданного до нуля,
проще схема сравнения и меньше рессурсов понадобиться.

Как можно И "моментально" среагировать И "не терять предыдущего". Разве это возможно? Вы привели пример : "Вот в случае если записан код для 1сек. то ЧПУ в этот момент может изменить 1000раз." Допустим такую ситуацию. Записан код на 1с. Прошло допустим 0,011 секунд. Пришел код на 10мс. Теперь возможны 2 ситуации. 1. Т.к. уже отсчитано более 10мс, перегружаемся и считаем заново (мое предложение - один из вариантов). 2. Досчитываем до 1 с, а затем переходим на новую частоту (например, Ваш вариант). Но И то И одновременно другое реализовать нельзя. ИЛИ-ИЛИ. Может я что-то не догоняю?
А на счет ресурсов - так их же много smile.gif. А если у Вас нужно предусмотреть reset, то у ALTERы, например, рекомендуется все регистры сбрасывать по питанию именно в 0. Можно и в 1, но это требует дополнительных ресурсов. Это так, к слову.
Go to the top of the page
 
+Quote Post
Iptash
сообщение Nov 16 2008, 15:33
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 613
Регистрация: 2-09-08
Из: г.Набережные Челны
Пользователь №: 39 936



Цитата(barabek @ Nov 16 2008, 16:22) *
Как можно И "моментально" среагировать И "не терять предыдущего". Разве это возможно? Вы привели пример : "Вот в случае если записан код для 1сек. то ЧПУ в этот момент может изменить 1000раз." Допустим такую ситуацию. Записан код на 1с. Прошло допустим 0,011 секунд. Пришел код на 10мс. Теперь возможны 2 ситуации. 1. Т.к. уже отсчитано более 10мс, перегружаемся и считаем заново (мое предложение - один из вариантов). 2. Досчитываем до 1 с, а затем переходим на новую частоту (например, Ваш вариант). Но И то И одновременно другое реализовать нельзя. ИЛИ-ИЛИ. Может я что-то не догоняю?
А на счет ресурсов - так их же много smile.gif. А если у Вас нужно предусмотреть reset, то у ALTERы, например, рекомендуется все регистры сбрасывать по питанию именно в 0. Можно и в 1, но это требует дополнительных ресурсов. Это так, к слову.

Я думал в таком плане. Когда приходит новый код то берется из счетчиков код и логически
складываем с новым кодом и опять в счетчик, а как мы знаем лог. 1+1=1 т.е. получается в счетчике
будет новый код + недосчитанный код. Наверное вот это и будет "моментальное" реагирование. Помоему должно работать, только как это аппаратно более гибко сделать?
Go to the top of the page
 
+Quote Post
Iptash
сообщение Nov 19 2008, 10:40
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 613
Регистрация: 2-09-08
Из: г.Набережные Челны
Пользователь №: 39 936



Вот у меня такая блок-схема прорисовывается. Для примера нарисовал 4разрядный преобразователь
код-частота. Я конечно не симулировал эту схему, но вроде должно работать, только надо
выход тоже простробировать входной частотой. Здесь как бы получается "моментальное" реагирование
на входной код не теряя код в счетчике. Ваше мнение?
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Iptash   преобразователь КОД-ЧАСТОТА   Nov 15 2008, 16:47
- - Boris_TS   Как я понимаю, у Вас получается регистр (хранящий ...   Nov 15 2008, 16:55
|- - Iptash   Цитата(Boris_TS @ Nov 15 2008, 19:55) Как...   Nov 15 2008, 17:12
||- - dvladim   Цитата(barabek @ Nov 16 2008, 16:22) реко...   Nov 16 2008, 13:33
|||- - barabek   Цитата(dvladim @ Nov 16 2008, 23:33) Так,...   Nov 16 2008, 14:28
|- - Boris_TS   Цитата(Iptash @ Nov 15 2008, 22:20) Игнор...   Nov 15 2008, 19:05
- - Dopler   А почему бы не сделать следующее: Максимальное зна...   Nov 16 2008, 10:45
- - Iptash   Цитата(Dopler @ Nov 16 2008, 13:45) А поч...   Nov 16 2008, 12:34
- - Ed)   Согласен с Dopler. Цитата(Iptash @ Nov 16 20...   Nov 19 2008, 16:58
- - Iptash   Цитата(Ed) @ Nov 19 2008, 19:58) Согл...   Nov 19 2008, 17:44
- - Ed)   Цитата(Iptash @ Nov 19 2008, 20:44) Как я...   Nov 19 2008, 19:09
- - Iptash   Цитата(Ed) @ Nov 19 2008, 22:09) Вы ж...   Nov 19 2008, 19:32
- - Ed)   Цитата(Iptash @ Nov 19 2008, 22:32) Я все...   Nov 19 2008, 19:51
- - Iptash   Цитата(Ed) @ Nov 19 2008, 22:51) Об э...   Nov 19 2008, 19:54
- - Ed)   Цитата(Iptash @ Nov 19 2008, 22:54) Хорош...   Nov 19 2008, 20:22
- - Iptash   Цитата(Ed) @ Nov 19 2008, 23:22) Насч...   Nov 19 2008, 20:38
- - Iptash   Все, схемку собрал, просимулировал в QUARTUS, рабо...   Nov 21 2008, 16:47


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th August 2025 - 22:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.01559 секунд с 7
ELECTRONIX ©2004-2016