|
Подскажите по ПЛИС. Как сделать делитель на 5. |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Sep 11 2011, 10:42
|

Частый гость
 
Группа: Участник
Сообщений: 88
Регистрация: 15-12-09
Пользователь №: 54 266

|
А вот такой делитель можно? Где на вход первого тригера подается всегда 1. Первый тригер имеет синхронный сброс и сбрасывается 1. 4 остальных имеют асинхронный сброс и сбрасываются 1, но только внешним каким - то сбросом. Можно ли делать такие делители?
Сообщение отредактировал Caruso - Sep 11 2011, 10:45
|
|
|
|
|
Sep 12 2011, 11:41
|

Дима
    
Группа: Свой
Сообщений: 1 683
Регистрация: 15-12-04
Из: Санкт-Петербург
Пользователь №: 1 486

|
Цитата Может ПЛИСка на нечётные не делит вообще? По крайней мере в графическом редакторе. Делит. Вот так годится? Счётчик - какой подвернулся под руку.
Эскизы прикрепленных изображений
--------------------
|
|
|
|
|
Sep 12 2011, 13:14
|
Местный
  
Группа: Свой
Сообщений: 464
Регистрация: 4-02-10
Пользователь №: 55 305

|
Спасибо, но это не смметричный меандр на 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
|
|
|
|
|
Sep 12 2011, 13:47
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Цитата(georgy31 @ Sep 10 2011, 20:47)  Подскажите уважаемые спецы как можно в графическом редакторе разделить клок на 5. Перпробовал все варианты из обычной логики, не получается. Причём на четное число делит прекрасно. Так же хотелось бы узнать, можно ли делить на дробное число. Когда работал с плис делали делители на 3 или 5 таким образом. Брали входной сигнал и пускали на один вход элемента xor. На второй пускали сигнал прошедший через элемент lcell (в плис altera элемент задержки). На выходе xor получали пики сигнала удвоенной частоты. Подавали на делитель на 5 который Вас не устраивал из-за несимметричности меандра. Несимметричный меандр подавали на триггер-делитель на 2. На выходе получали меандр исходной частоты делённый на 5. Работало в QUARTUSe и в железе.
|
|
|
|
|
Sep 13 2011, 07:26
|
Группа: Новичок
Сообщений: 2
Регистрация: 7-11-10
Пользователь №: 60 709

|
Цитата(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
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|