khlenar 5 15 ноября, 2008 Опубликовано 15 ноября, 2008 · Жалоба Есть задача изготовить многоканальный преобразовватель код-частота. В голову приходит только одно решение, сделать на подобии МК таймера с перезагрузкой по переполнении счетчиков, т.е. параллельный внешний код загружается в счетчики, на тактирующий вх. подается частота, этот код увеличивается до переполнения где происходит новая запись кода и т.д.. Вот только смущает время реакции так сказать при маленьком коде, где до следующей перезаписи проходит большое время, а код уже изменился и уже должна быть другая частота. Я не знаю понятно ли изложил суть задачи?. Может кто нибудь решал подобные задачи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Beby 8 15 ноября, 2008 Опубликовано 15 ноября, 2008 · Жалоба Как я понимаю, у Вас получается регистр (хранящий код, с которого начинает считать счетчик) и непосредственно сам счетчик. Если это так, то счетчик можно доукомплектовать входом предустановки (во все единицы). Тогда на следующем после предустановки такте, счетчик загрузит новое значение. Если я правильно понял Вашу проблему, то это Вам должно подойти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 15 ноября, 2008 Опубликовано 15 ноября, 2008 · Жалоба Как я понимаю, у Вас получается регистр (хранящий код, с которого начинает считать счетчик) и непосредственно сам счетчик. Если это так, то счетчик можно доукомплектовать входом предустановки (во все единицы). Тогда на следующем после предустановки такте, счетчик загрузит новое значение. Если я правильно понял Вашу проблему, то это Вам должно подойти. Вы правильно меня поняли. Т.е. как я понял предустановку делать при изменении кода? но тогда потеряется предыдущее значение? Может их как то суммировать эти кода? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 15 ноября, 2008 Опубликовано 15 ноября, 2008 · Жалоба счетчик на вычитание. По своему переносу загружает новое значение из регистра. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 15 ноября, 2008 Опубликовано 15 ноября, 2008 · Жалоба счетчик на вычитание. По своему переносу загружает новое значение из регистра. Ну я так и говорю, только по переполнению(без разницы). Но это должно быть в реальном времени т.е. вх. код может в любое время измениться, а счетчик еще не досчитал, вот здесь как быть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 15 ноября, 2008 Опубликовано 15 ноября, 2008 · Жалоба Ну я так и говорю, только по переполнению(без разницы). Но это должно быть в реальном времени т.е. вх. код может в любое время измениться, а счетчик еще не досчитал, вот здесь как быть? Значит проигнорировал изменение. По переполнению (прерыванию) код должен меняться и устаканиться к ожидаемому переполнению Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 15 ноября, 2008 Опубликовано 15 ноября, 2008 · Жалоба Значит проигнорировал изменение. По переполнению (прерыванию) код должен меняться и устаканиться к ожидаемому переполнению Игнорировать нельзя. Устройство реального времени. Запись кода происходит допустим каждую 1мс. и мне кажется, что нужно при записи делать логическое сложение данных в счетчике и кода. Как вы думаете?. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 15 ноября, 2008 Опубликовано 15 ноября, 2008 · Жалоба Игнорировать нельзя. Устройство реального времени. Запись кода происходит допустим каждую 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Beby 8 15 ноября, 2008 Опубликовано 15 ноября, 2008 · Жалоба Игнорировать нельзя. Устройство реального времени. Запись кода происходит допустим каждую 1мс. и мне кажется, что нужно при записи делать логическое сложение данных в счетчике и кода. Как вы думаете?. Я использую конструкция просто регистр + счетчик, в такой задаче: есть некий подвижный объект, он перемещается с какой-то скоростью, необходимо генерировать импульсы (для запуска чего-то) через равные промежутки расстояния, скорость конечно же меняется... При моих физических ограничениях на возможные ускорения объекта (и !!! заданной минимальной частоты дискретизации) вполне достаточно досчета счетчика по старому значению и по переполнению загрузки нового. Я вот у Вас как-то до конца не разобрал этот момент... А вот наверное третий вариант... Но если Вам необходимо работать так: 1. Если новое значение меньше предыдущего (понижаем частоту) - то можно, чтобы счетчик досчитал до переноса. 2. Если новое значение больше предыдущего (повышаем частоту) - то необходимо, чтобы счетчик с момента обновления считал не дольше нового (свежезаданного периода ожидания). То тогда Вы можете откровенно поставить рядышком вычитатель, который будет сравнивать код в счетчике с находящемся в регистре (в т.ч. и всежезаписанным), и если счетчику считать дольше, то перезаписывать в него новое начальное значение. Надеюсь не слишком мутно объяснил Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 15 ноября, 2008 Опубликовано 15 ноября, 2008 · Жалоба Не понятно, что такое логическое сложение. Возможны наверно два варианта. Первый - это пока заданное не отработает, игнорирует записанный код в регистре. Второй вариант - Снова перезаписывает новое значение кода - и до переполнения. Не понятно что получается. Вот пример, наверно базисный. 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 Спасибо. Я подумаю. Если, что надумаю, выложу. Я использую конструкция просто регистр + счетчик, в такой задаче: есть некий подвижный объект, он перемещается с какой-то скоростью, необходимо генерировать импульсы (для запуска чего-то) через равные промежутки расстояния, скорость конечно же меняется... При моих физических ограничениях на возможные ускорения объекта (и !!! заданной минимальной частоты дискретизации) вполне достаточно досчета счетчика по старому значению и по переполнению загрузки нового. Я вот у Вас как-то до конца не разобрал этот момент... А вот наверное третий вариант... Но если Вам необходимо работать так: 1. Если новое значение меньше предыдущего (понижаем частоту) - то можно, чтобы счетчик досчитал до переноса. 2. Если новое значение больше предыдущего (повышаем частоту) - то необходимо, чтобы счетчик с момента обновления считал не дольше нового (свежезаданного периода ожидания). То тогда Вы можете откровенно поставить рядышком вычитатель, который будет сравнивать код в счетчике с находящемся в регистре (в т.ч. и всежезаписанным), и если счетчику считать дольше, то перезаписывать в него новое начальное значение. Надеюсь не слишком мутно объяснил У меня тоже для управления неким объектом. ЧПУ выдает код на мое устройство переодом 1мс.. Допустим мое устройство меняет переод от 10мкс. до 1сек.. Вот в случае если записан код для 1сек. то ЧПУ в этот момент может изменить 1000раз.. Это устройство можно назвать как ЦАП с цифровым выходом что-ли?. Т.е. мое устройство должно реагировать как ЦАП. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
barabek 0 16 ноября, 2008 Опубликовано 16 ноября, 2008 · Жалоба Спасибо. Я подумаю. Если, что надумаю, выложу. У меня тоже для управления неким объектом. ЧПУ выдает код на мое устройство переодом 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; можно оба олвейса объеденить, конечно же Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 16 ноября, 2008 Опубликовано 16 ноября, 2008 · Жалоба А в чем заморочка собственно? Пусть счетчик считает от нуля до заданного. Т.е. если содержимое счетчика больше заданного (большеИЛИравно?), счетчик обнулять. Заданное обновлять независимо от счетчика... Заморочка в том, что мое устройство должно "моментально" реагировать на изминение входного кода и не терять предыдущего(которое еще не "отработано") А считать лучьше от заданного до нуля, проще схема сравнения и меньше рессурсов понадобиться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dopler 0 16 ноября, 2008 Опубликовано 16 ноября, 2008 · Жалоба А почему бы не сделать следующее: Максимальное значение счетчика сделать фиксированным (большим), а увеличивать его не на 1, а на требуемый код (не счетчик а сумматор). Выход - старший разряд счетчика (сумматора) Т.е. нужно частоту большую - код большой (счетчик быстро переполняется), нужно маленькую - код маленький. В данном случае реакция мгновенная. По такому принципу построены DDS. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 16 ноября, 2008 Опубликовано 16 ноября, 2008 · Жалоба А почему бы не сделать следующее: Максимальное значение счетчика сделать фиксированным (большим), а увеличивать его не на 1, а на требуемый код (не счетчик а сумматор). Выход - старший разряд счетчика (сумматора) Т.е. нужно частоту большую - код большой (счетчик быстро переполняется), нужно маленькую - код маленький. В данном случае реакция мгновенная. По такому принципу построены DDS. Спасибо. Я так тоже думал, это один из вариантов.Но это тоже самое, когда код маленький счетчик долго переполняется, а в случае пока он не переполнился код допустим поменялся(резко вырос) нужно соответственно и код менять + тот код который не досчитал, а не ждать пока он досчитает. Вот это будет наверное более реальное воздействие. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
barabek 0 16 ноября, 2008 Опубликовано 16 ноября, 2008 · Жалоба Заморочка в том, что мое устройство должно "моментально" реагировать на изминение входного кода и не терять предыдущего(которое еще не "отработано") А считать лучьше от заданного до нуля, проще схема сравнения и меньше рессурсов понадобиться. Как можно И "моментально" среагировать И "не терять предыдущего". Разве это возможно? Вы привели пример : "Вот в случае если записан код для 1сек. то ЧПУ в этот момент может изменить 1000раз." Допустим такую ситуацию. Записан код на 1с. Прошло допустим 0,011 секунд. Пришел код на 10мс. Теперь возможны 2 ситуации. 1. Т.к. уже отсчитано более 10мс, перегружаемся и считаем заново (мое предложение - один из вариантов). 2. Досчитываем до 1 с, а затем переходим на новую частоту (например, Ваш вариант). Но И то И одновременно другое реализовать нельзя. ИЛИ-ИЛИ. Может я что-то не догоняю? А на счет ресурсов - так их же много :). А если у Вас нужно предусмотреть reset, то у ALTERы, например, рекомендуется все регистры сбрасывать по питанию именно в 0. Можно и в 1, но это требует дополнительных ресурсов. Это так, к слову. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться