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

Подскажите уважаемые спецы как можно в графическом редакторе разделить клок на 5. Перпробовал все варианты из обычной логики, не получается. Причём на четное число делит прекрасно. Так же хотелось бы узнать, можно ли делить на дробное число.
Книжка Лобанова, стр. 64. Там дана схема. Перед этим подробно расписано, как синтезировать счетчики:
http://lord-n.narod.ru/walla.html
georgy31
Sep 11 2011, 19:33
Странно, загружал все делители на 3 и на 5, какие там есть, на выходе полная ерунда. А на чётные числа делит нормально. Может ПЛИСка на нечётные не делит вообще? По крайней мере в графическом редакторе.
DSIoffe
Sep 12 2011, 11:41
Цитата
Может ПЛИСка на нечётные не делит вообще? По крайней мере в графическом редакторе.
Делит.
Вот так годится? Счётчик - какой подвернулся под руку.
georgy31
Sep 12 2011, 13: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
mempfis_
Sep 12 2011, 13:47
Цитата(georgy31 @ Sep 10 2011, 20:47)

Подскажите уважаемые спецы как можно в графическом редакторе разделить клок на 5. Перпробовал все варианты из обычной логики, не получается. Причём на четное число делит прекрасно. Так же хотелось бы узнать, можно ли делить на дробное число.
Когда работал с плис делали делители на 3 или 5 таким образом.
Брали входной сигнал и пускали на один вход элемента xor.
На второй пускали сигнал прошедший через элемент lcell (в плис altera элемент задержки).
На выходе xor получали пики сигнала удвоенной частоты.
Подавали на делитель на 5 который Вас не устраивал из-за несимметричности меандра.
Несимметричный меандр подавали на триггер-делитель на 2.
На выходе получали меандр исходной частоты делённый на 5.
Работало в QUARTUSe и в железе.
Alex11
Sep 12 2011, 15:02
Для georgy31: Лучший радиолюбительский вариант Вам подсказали. Правильно в таком случае делать ФАПЧ. Для этого есть специальные блоки во многих ПЛИС. То, что Вы предложили в последнем посте может работать с иголками на выходе и, если Вам нужен именно клок, то лучше так не делать. Еще можно в случае Xilinx использовать его триггеры со срабатыванием по обоим фронтам и делать на них счетчик на 10 - это будет работать устойчиво.
vidokq
Sep 13 2011, 07:26
Цитата(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
Sep 13 2011, 08:29
Спасибо уважаемый. Отлично разделилось, и ресурса не много сьело. Сказка и песня одним словом.
Lmx2315
Sep 13 2011, 09:19
..пример не графический, пришлось кодить.
georgy31
Sep 13 2011, 11:44
Да, ужо енто понял. Мульён вариянтов перелопатил. Не думал, что всё так запущено. Ещё раз огромное спасибо. А нет ли универсальной делилки? Что бы только коэффициент деления менять надо было.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.