Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Подскажите по ПЛИС. Как сделать делитель на 5.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
georgy31
Подскажите уважаемые спецы как можно в графическом редакторе разделить клок на 5. Перпробовал все варианты из обычной логики, не получается. Причём на четное число делит прекрасно. Так же хотелось бы узнать, можно ли делить на дробное число.
sigmaN
Так и загуглил: делитель частоты на 5
http://www.google.ru/search?hl=ru&sour...51l1.8.5.5l19l0

вот один из результатов
http://www.chipinfo.ru/literature/radio/199907/p41.html

по идее всё это можно слепить на ПЛИС.
georgy31
Вот и я так подумал, просто перенести, а на деле получилось, что в ПЛИС можно пренести только чётное деление, при нечётном и дробном получается полная ерунда.
ae_
Счётчик SN7490 (К155ИЕ2) содержит два делителя, на 2 и на 5. Если его указать, как элемент схемы в ПЛИС, это сработает?
Вариант - сдвиговый регистр, 5 выход которого подключен на сброс регистра.
georgy31
Это я сделал в первую очередь, но на нечётное не делит, только на чётное число почему то.
Что то я зациклился, чтобы из 36 мгц получить 7.2мгц, надо же на 5 разделить?
Lmx2315
..смотря какая плис , в xilinx-се - можно блок DCM поставить - он делит на произвольное число .
Caruso
А вот такой делитель можно?
Где на вход первого тригера подается всегда 1.
Первый тригер имеет синхронный сброс и сбрасывается 1.
4 остальных имеют асинхронный сброс и сбрасываются 1, но только внешним каким - то сбросом.
Можно ли делать такие делители?
kovigor
Цитата(georgy31 @ Sep 10 2011, 20:47) *
Подскажите уважаемые спецы как можно в графическом редакторе разделить клок на 5. Перпробовал все варианты из обычной логики, не получается. Причём на четное число делит прекрасно. Так же хотелось бы узнать, можно ли делить на дробное число.


Книжка Лобанова, стр. 64. Там дана схема. Перед этим подробно расписано, как синтезировать счетчики:

http://lord-n.narod.ru/walla.html
georgy31
Странно, загружал все делители на 3 и на 5, какие там есть, на выходе полная ерунда. А на чётные числа делит нормально. Может ПЛИСка на нечётные не делит вообще? По крайней мере в графическом редакторе.
DSIoffe
Цитата
Может ПЛИСка на нечётные не делит вообще? По крайней мере в графическом редакторе.

Делит.
Вот так годится? Счётчик - какой подвернулся под руку.
georgy31
Спасибо, но это не смметричный меандр на 5, а 6 на 4, такой я сделал в первую очередь. На 5 оказалось всё намного серьёзней. Вот на 3 нашёл, теперь проблема как его на 5 переписать. Может кто подскажет, что поменять в программе?

module divide_by_3 (
clk_in , //Input Clock
reset , // Reset Input
clk_out // Output Clock
);
//-----------Input Ports---------------
input clk_in;
input reset;
//-----------Output Ports---------------
output clk_out;
//------------Internal Variables--------
reg [1:0] pos_cnt;
reg [1:0] neg_cnt;
//-------------Code Start-----------------
// Posedge counter
always @ (posedge clk_in)
if (reset) begin
pos_cnt <= 0;
end else begin
pos_cnt <= (pos_cnt == 2) ? 0 : pos_cnt + 1;
end
// Neg edge counter
always @ (negedge clk_in)
if (reset) begin
neg_cnt <= 0;
end else begin
neg_cnt <= (neg_cnt == 2) ? 0 : neg_cnt + 1;
end

assign clk_out = ((pos_cnt != 2) && (neg_cnt != 2));

endmodule

// Testbench to check the divide_by_3 logic
module test();
reg reset, clk_in;
wire clk_out;
divide_by_3 U (
.clk_in (clk_in),
.reset (reset),
.clk_out (clk_out)
);

initial begin
clk_in = 0;
reset = 0;
#2 reset = 1;
#2 reset = 0;
#100 $finish;
end

always #1 clk_in = ~clk_in;

endmodule

mempfis_
Цитата(georgy31 @ Sep 10 2011, 20:47) *
Подскажите уважаемые спецы как можно в графическом редакторе разделить клок на 5. Перпробовал все варианты из обычной логики, не получается. Причём на четное число делит прекрасно. Так же хотелось бы узнать, можно ли делить на дробное число.


Когда работал с плис делали делители на 3 или 5 таким образом.
Брали входной сигнал и пускали на один вход элемента xor.
На второй пускали сигнал прошедший через элемент lcell (в плис altera элемент задержки).
На выходе xor получали пики сигнала удвоенной частоты.
Подавали на делитель на 5 который Вас не устраивал из-за несимметричности меандра.
Несимметричный меандр подавали на триггер-делитель на 2.
На выходе получали меандр исходной частоты делённый на 5.
Работало в QUARTUSe и в железе.
Alex11
Для georgy31: Лучший радиолюбительский вариант Вам подсказали. Правильно в таком случае делать ФАПЧ. Для этого есть специальные блоки во многих ПЛИС. То, что Вы предложили в последнем посте может работать с иголками на выходе и, если Вам нужен именно клок, то лучше так не делать. Еще можно в случае Xilinx использовать его триггеры со срабатыванием по обоим фронтам и делать на них счетчик на 10 - это будет работать устойчиво.
vidokq
Цитата(georgy31 @ Sep 12 2011, 16:14) *
Спасибо, но это не смметричный меандр на 5, а 6 на 4, такой я сделал в первую очередь. На 5 оказалось всё намного серьёзней. Вот на 3 нашёл, теперь проблема как его на 5 переписать. Может кто подскажет, что поменять в программе?

module divide_by_3 (
clk_in , //Input Clock
reset , // Reset Input
clk_out // Output Clock
);
//-----------Input Ports---------------
input clk_in;
input reset;
//-----------Output Ports---------------
output clk_out;
//------------Internal Variables--------
reg [1:0] pos_cnt;
reg [1:0] neg_cnt;
//-------------Code Start-----------------
// Posedge counter
always @ (posedge clk_in)
if (reset) begin
pos_cnt <= 0;
end else begin
pos_cnt <= (pos_cnt == 2) ? 0 : pos_cnt + 1;
end
// Neg edge counter
always @ (negedge clk_in)
if (reset) begin
neg_cnt <= 0;
end else begin
neg_cnt <= (neg_cnt == 2) ? 0 : neg_cnt + 1;
end

assign clk_out = ((pos_cnt != 2) && (neg_cnt != 2));

endmodule

// Testbench to check the divide_by_3 logic
module test();
reg reset, clk_in;
wire clk_out;
divide_by_3 U (
.clk_in (clk_in),
.reset (reset),
.clk_out (clk_out)
);

initial begin
clk_in = 0;
reset = 0;
#2 reset = 1;
#2 reset = 0;
#100 $finish;
end

always #1 clk_in = ~clk_in;

endmodule


Цитата
вот так должно получиться кратно 5
Код
module divide_by_3 (
clk_in       , //Input Clock
reset        , // Reset Input
clk_out        // Output Clock
);
//-----------Input Ports---------------
input clk_in;
input  reset;
//-----------Output Ports---------------
output clk_out;
//------------Internal Variables--------
reg [2:0] pos_cnt;
reg [2:0] neg_cnt;
//-------------Code Start-----------------
// Posedge counter
always @ (posedge clk_in)
if (reset) begin
  pos_cnt <= 0;
end else begin
  pos_cnt <= (pos_cnt ==4) ? 0 : pos_cnt + 1;
end
// Neg edge counter
always @ (negedge clk_in)
if (reset) begin
  neg_cnt <= 0;
end else begin
  neg_cnt <= (neg_cnt ==4) ? 0 : neg_cnt + 1;
end

assign clk_out = ((pos_cnt != 3) && (neg_cnt !=3)&&(pos_cnt !=4) && (neg_cnt !=4));

endmodule
georgy31
Спасибо уважаемый. Отлично разделилось, и ресурса не много сьело. Сказка и песня одним словом.
Lmx2315
..пример не графический, пришлось кодить.
georgy31
Да, ужо енто понял. Мульён вариянтов перелопатил. Не думал, что всё так запущено. Ещё раз огромное спасибо. А нет ли универсальной делилки? Что бы только коэффициент деления менять надо было.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.