Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Делитель на 10 на ПЛИС Altera
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
foxit
Доброго времени суток.

Есть высокостабильный сигнал 1 Мгц.
Из него необходимо получить 100 кГц, 10 кГц, 1 Гц, 0.1 Гц.

Я так понимаю нужно сделать делитель на 10.
Данный сабж нужно сделать на ПЛИС Altera max3000.

Помогите, в ПЛИСах не силен.
Shtirlits
Цитата(foxit @ Jan 29 2009, 23:54) *
Из него необходимо получить 100 кГц, 10 кГц, 1 Гц, 0.1 Гц.

Одновременно на 4-х выводах или по очереди на одном?
Если одновременно, то что собираетесь делать с фазами выходов?
А какой именно max3000 ?
cms
Вот так дерево из 4 счетчиков может выглядеть на SV. Q7.2 укладывает этот делитель в 17 макрокелов EMP3032

Код
module div10
(
    input    logic         clk, rstn,
    output    logic [4:0]    clk_div
);

    logic [2:0] cntr[4:0];

    assign clk_div[0] = clk;

    genvar i;

    generate for (i=1;i<5;i++) begin : cntr_gens

        always_ff @(posedge clk_div[i-1], negedge rstn)
         if (!rstn) begin
            cntr[i]        <= '0;
            clk_div[i]     <= '0;            
         end else begin
               if ( cntr[i] == 4 ) begin
                            cntr[i] <= '0;
                clk_div[i] <= ~clk_div[i];
               end else
                cntr[i]++;
        end
    end endgenerate
    
endmodule
EvgenyNik
Цитата
Если одновременно, то что собираетесь делать с фазами выходов?

1 МГц невысокая частота. Можно результаты (поделенные частоты) пустить на выход через регистры, стробируемые от инверсного клока входной частоты, тогда их фронты сместятся на пол периода входной частоты, но расхождения по фазам будут минимальными.
DeC_NN
Если нужно сделать в схемном редакторе, то можно поделить на 2, потом на 5.
На 2 поделить например с помощью lpm_counter.
Схема деления на 5 с 50% скважностью есть в приаттаченом файле.
Шурила
Цитата(DeC_NN @ Jan 30 2009, 07:56) *
... можно поделить на 2, потом на 5.
Схема деления на 5 с 50% скважностью есть в приаттаченом файле.

Когда то давно в ж."Радио" (по мойму показывалось альтернативное включение ИЕ5)
для получения скважности 2, при делении на 10 -> сначала делим на 5, а потом на 2 rolleyes.gif
Ну а код, что привел cms и есть конкретное решение, к стати со скважностью выходов = 2. rolleyes.gif
cdg
Цитата(DeC_NN @ Jan 30 2009, 08:56) *
Если нужно сделать в схемном редакторе, то можно поделить на 2, потом на 5.
На 2 поделить например с помощью lpm_counter.
Схема деления на 5 с 50% скважностью есть в приаттаченом файле.

Ну уж если гланды удалять не через анус, а через горло, то сначала делим на 5 без извратов как учили, а потом делитель на 2 для полученя скважности 50, и по ресурсам будет меньше и проще как то, логичней smile.gif)))
Iptash
Цитата(foxit @ Jan 29 2009, 23:54) *
Доброго времени суток.

Есть высокостабильный сигнал 1 Мгц.
Из него необходимо получить 100 кГц, 10 кГц, 1 Гц, 0.1 Гц.

Я так понимаю нужно сделать делитель на 10.
Данный сабж нужно сделать на ПЛИС Altera max3000.

Помогите, в ПЛИСах не силен.


Я сам не давно пишу на SV(систем верилог).
До 1 сек просимулировал, нормально, на 0.1Гц не стал, очень долго ждать результатов.
Вот собственно программа, где clk вх. 1мГц и выхода наверное понятно.
Код влазит в EPM3064. Если нужно корректировать частоты, то делаешь в условиях.
Цитата
module del (
input clk,
output out_100kHz,
output out_10kHz,
output out_1Hz,
output out_01Hz
);
bit [3:0] count_100;
bit [3:0] count_10;
bit [13:0] count_1;
bit [3:0] count_01;

// Деление 1мГц на 10
always @(posedge clk) begin
if(count_100++ > 8) begin
out_100kHz = 1;
count_100 = 0;
end
else
out_100kHz = 0;
end
//---------------------------------------------
// Деление 100кГц на 10
always @(posedge out_100kHz) begin
if(count_10++ > 8) begin
out_10kHz = 1;
count_10 = 0;
end
else
out_10kHz = 0;
end
//----------------------------------------------
// Деление 10кГц на 10000
always @(posedge out_10kHz) begin
if(count_1++ > 9980) begin
out_1Hz = 1;
count_1 = 0;
end
else
out_1Hz = 0;
end
//----------------------------------------------
// Деление 1Гц на 10
always @(posedge out_1Hz) begin
if(count_01++ > 8) begin
out_01Hz = 1;
count_01 = 0;
end
else
out_01Hz = 0;
end
//----------------------------------------------
endmodule
Boris_TS
Цитата(Iptash @ Jan 30 2009, 13:33) *
До 1 сек просимулировал, нормально, на 0.1Гц не стал, очень долго ждать результатов.

А Вы моделируйте при большей входной частоте, так быстрее будет. Если будет правильно работать на 10МГц, то и на 1 МГц тоже всё будет хорошо... Можно и на большей "удобной" частоте промоделировать, которую вытянет Max3000 (25 МГц, 50 МГц, 100 МГц ??)
Iptash
Цитата(Boris_TS @ Jan 30 2009, 12:48) *
А Вы моделируйте при большей входной частоте, так быстрее будет. Если будет правильно работать на 10МГц, то и на 1 МГц тоже всё будет хорошо... Можно и на большей "удобной" частоте промоделировать, которую вытянет Max3000 (25 МГц, 50 МГц, 100 МГц ??)


Спасибо. Да я пробывал , быстрее конечно но всеравно долго, да и здесь программа простая, результат очевиден.
Кстати если на выходе нужна частота со скваженностью приблезительно 2, то нужно модернезировать немного к примеру вот один always:
Цитата
always @(posedge clk) begin
if(count_100++ > 8) begin
count_100 = 0;
end
else
out_100kHz = count_100[2];
// out_100kHz = 0;
end


т.е. на выход даешь со счетчика где то с середины диапозона. В других always таким же макаром.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.