реклама на сайте
подробности

 
 
> Проблемы с генератором ПСП
elzaro
сообщение Aug 10 2013, 11:06
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 26-11-10
Пользователь №: 61 201



Делаю имитатор сигнала глонасс на плисе от xilinx.
Естественно в проекте нужен генератор ПСП. И вот столкнулся с проблемой, что если в проект пихнуть, например, десять таких генераторов, то из десяти два-три работать не будут. ПСП на выходе будет неправильная.

В результате чтения отчета Place & Route выяснил, что не работают те генераторы, у которых больший перекос по тактовой цепи чем у остальных. Например, если перекос всего 2 ns, то генератор может не работать. После задания ограничения MAXSKEW = "0.9 ns" вроде бы все заработало. Но меня не покидает ощущение, что это неправильный костыль.
Может подскажете в чем дело и как правильно делать?

Есть подозрения, что надо как-то описать тактовую цепь генератора ПСП, но как непонятно. Её частота поидее всего ~511 кГц, фронт естественно гуляет шагами кратными 10 ns, т.к. сделана она из старшего разряда аккумулятора обычного на 32 разряда работающего на 100 МHz.

Генераторов ПСП перепробовал кучу, результат примерно одинаков, всегда найдутся косячные.

Генератор тактовой частоты ПСП работает на 100 МГц. На неё установлен констрэйн в UCF файле PERIOD = "8.75 ns". Цепь заведена на BUFG. Больше никаких настроек не делал.

Далее код из проекта.

Генератор ПСП:

Код
module prs_sa_gl( clk, rst, prs_out, prs_sync );
(* maxskew = "0.9 ns" *)
    input clk;
    input rst;
    output prs_out;
    output prs_sync;
    
    parameter sr_init = 9'b111111111;
    
    reg [8:0] sr = sr_init;
    reg prs_sync = 0;
    
    assign prs_out = sr[6];
    
    wire rst_net;
    
    strobe s(
        .clk(clk    ),
        .i  (rst    ),
        .o  (rst_net)
    );
    
    always @(posedge clk) begin
        sr <= rst_net ? sr_init : {sr[7:0], (sr[4] ^ sr[8])};
        prs_sync <= (sr == sr_init);
    end
    
endmodule


Генератор тактовой частоты для ПСП:

Код
module prs_cnt( clk, value, wr, clk_out, phase, rst );
    input clk;
    input [31:0] value;
    input wr;
    output clk_out;
    output [31:0] phase;
    input rst;
    
    reg [31:0] index = 0;
    reg [31:0] incr = 32'h00000000;
    reg [31:0] incr0 = 32'h00000000;
    
    wire wr_net;
    
    assign phase = index;
    assign clk_out = index[31];
    
    always @(posedge clk or posedge rst) begin
        if (rst) begin
            index <= 0;
        end
        else begin
            index <= index + incr;
        end
    end
    
    strobe s(
        .clk(clk   ),
        .i  (wr    ),
        .o  (wr_net)
    );
    
    always @(posedge clk) begin
        incr0 <= wr_net ? value : incr0;
        incr <= incr0;
    end

endmodule


Синхронизатор импульсов сброса/записи:

Код
module strobe( clk, i, o );
    input clk;
    input i;
    output o;
    
    reg clr = 0;
    reg o = 0;
    
    always @(posedge i or posedge o) begin
        clr <= o ? 0 : 1;
    end
    
    always @(negedge clk) begin
        o <= clr;
    end
    
endmodule
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Kuzmi4
сообщение Aug 10 2013, 13:48
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



2 Maverick
тут DCM избыточен..

2 elzaro
Гляньте clock-report, всё сразу станет понятно sm.gif
Думаю что "clock_enable" должен спасти отца русской демократии cool.gif в этой ситуации
Go to the top of the page
 
+Quote Post
Maverick
сообщение Aug 11 2013, 00:34
Сообщение #3


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(Kuzmi4 @ Aug 10 2013, 16:48) *
2 Maverick
тут DCM избыточен..

полностью согласен если б ТС сразу и четко написал, что

Цитата(elzaro @ Aug 10 2013, 16:49) *
...код частоты надо постоянно переписывать, частота должна меняться...


по поводу

Цитата(elzaro @ Aug 10 2013, 18:23) *
Что сделать то надо, добавить в модуль сигнал CE?

примеры на основе D Flip flop
Код
   always @(posedge <clock> or posedge <reset>)
      if (<reset>) begin
         <reg> <= 1'b0;
      end else if (<clock_enable>) begin
         <reg> <= <signal>;
      end

и
Код
   always @(posedge <clock>)
      if (<reset>) begin
         <reg> <= 1'b0;
      end else if (<clock_enable>) begin
         <reg> <= <signal>;
      end


в чем отличия описаний думаю догадаетесь сами sm.gif

P.S. <...> - уберете и вставите свои имена сигналов


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 20:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01398 секунд с 7
ELECTRONIX ©2004-2016