Speccy - наш выбор!

Speccy - наш выбор! (http://zx-pk.ru/index.php)
-   Unsorted (http://zx-pk.ru/forumdisplay.php?f=13)
-   -   Читабельный ФАПЧ (http://zx-pk.ru/showthread.php?t=16617)

ZEK 16th August 2011 19:57

Читабельный ФАПЧ
 
На углепати подымали вопрос про читаемость и легкость для понимания ФАПЧ по сыркам.
Ясен пень что табличные или перенесеным с схем на сумматорах с перетусоваными битами фапчи малопонятны.

Решил восполнить пробел и написать простенький фапч (коментов гораздо больше чем кода) на более менее читаемом языке

Code:

// синтезируемый
module phase_sync(
    input  wire        clk,  // 8mhz
    input  wire        rddat,
    output  reg        rclk,
    output  reg        rawr
    );
   
// *******************************************************
// формирование RAWR
// *******************************************************
   
// защелка где храним предыдущее состояние сигнала rddat с дисковода
// нужно для определния момента отрицательного фронта
reg oldrd;

// формируем rawr 125нс
always @ (posedge clk)
begin             
    // запоминаем текущее значение
    oldrd <= rddat;
    // формируем rawr если на предыдущем такте rddat =1 а на текущем =0
    rawr <= !(oldrd == 1'b1 && rddat == 1'b0); // тут oldrd еще содержит старое значение
end


// *******************************************************
// формирование RCLK
// *******************************************************

// счетчик для формирования меандра RCLK, один оборот счетчика это полуволна RCLK
reg [3:0] counter = 0;                   
// дельта в тактах от оптимальной точки расположения RAWR относительно RCLK
// RAWR в идельном случае долен находиться в середине полуволны RCLK
wire[3:0] delta = (8 - counter) +1;
// 8 середина полуволны,
// +1 для того что бы при совпадении фаз счетик инкреметировался а не стоял на месте
// можно полюдски написать 9-counter что то же самое

// знаково делим смещение пополам, будем приближаться к оптимальной точке на полшага перекоса фаз.
wire[3:0] shift = { delta[3], delta[3], delta[2:1] };

always @ (posedge clk)
begin               
    // RAWR = 0, значит сравниваем его положение с оптимальным
    // и если надо (delta >= 2 или delta =< 2) корректируем фазу RCLK
    if (rawr == 0)                         
        counter[3:0] <= counter + shift;
    else
        counter <= counter + 1;  // иначе просто инкрементируем счетчик
       
    // закончилась полуволна генерируем меандр
    if (counter == 15) rclk = ~rclk;
end

initial
begin
    rclk = 1'b0;
end

endmodule

Можно колво кода как уменьшить понизив читабельность, так и увеличив, выбрал нечто среднее

Где то так...

fifan 16th August 2011 21:02

Где будем испытывать? На Скорпионе?

lisica 16th August 2011 21:13

А кто это переведёт в VHDL?

Дмитрий 16th August 2011 21:38

fifan, где-где... там где ее ну ооооочень не хватает - на Пентэве :)

ZEK 17th August 2011 11:47

фапч 28мгц
 
пересчитал и пофиксил под 28мгц

Code:

// синтезируемый
module phase_sync28(
    input  wire        clk,  // 28mhz
    input  wire        rddat,
    output  reg        rclk,
    output  reg        rawr
    );
   
// *******************************************************
// формирование RAWR
// *******************************************************
   
// защелка где храним предыдущее состояние сигнала rddat с дисковода
// нужно для определния момента отрицательного фронта
reg oldrd; 
// сдвиговый регистр для формирования raclk 150нс
reg [3:0] rawr0;

// формируем rawr 150нс
always @ (posedge clk)
begin             
    // запоминаем текущее значение
    oldrd <= rddat;
    // формируем rawr если на предыдущем такте rddat =1 а на текущем =0
    // пишем в сдвиговый регистр, заодно сдвигаем его
    rawr0 <= { rawr0[2:0], !(oldrd == 1'b1 && rddat == 1'b0) };
   
    // если хоть один бит в сдвиговом регистре 0 тогда rawr =0, что при клоке свдига 28мгц, примерно 150нс
    rawr = !(rawr0 != 4'hF);
end


// *******************************************************
// формирование RCLK
// *******************************************************

// счетчик для формирования меандра RCLK, один оборот счетчика это полуволна RCLK
reg [5:0] counter = 0;                   
// дельта в тактах от оптимальной точки расположения RAWR относительно RCLK
// RAWR в идельном случае долен находиться в середине полуволны RCLK
wire[5:0] delta = (24 - counter) +1;
// 24 середина полуволны -4 (на столкьо тактов удлинили RAWR)
// +1 для того что бы при совпадении фаз счетик инкреметировался а не стоял на месте
// можно полюдски написать 25-counter что то же самое

// знаково делим смещение пополам, будем приближаться к оптимальной точке на полшага перекоса фаз.
wire[5:0] shift = { delta[5], delta[5], delta[4:1] };

always @ (posedge clk)
begin               
    // RAWR = 0, значит сравниваем его положение с оптимальным
    // и если надо (delta > 2 или delta < 2) корректируем фазу RCLK
    if (rawr0[0] == 0)                         
        counter <= counter + shift;
    else 
        // проверяем дошли ли мы до длины полуволны примерно в 2мкс
        // rclk тут что бы компенсировть хоть немного отклонение от 2мкс
        if (counter < (54+rclk))
            counter <= counter + 1; // есил
        else         
        begin           
            counter <= 0;
            rclk = ~rclk; 
        end

end

initial
begin
    rclk = 1'b0;
end

endmodule

И диаграмка сравнивающая 2 фапча на одних входных данных

fifan 17th August 2011 12:16

В какую ПЛИС предполагается запихнуть данное творение?

Дмитрий 17th August 2011 12:25

fifan, я вкорячиваю это в EP1K50, а вообще, как Дима говорит - творение занимает 8 макроячеек, так что влезет в любую, даже EPM3032.

solegstar 17th August 2011 12:31

Quote:

Originally Posted by Дмитрий (Post 408448)
fifan, где-где... там где ее ну ооооочень не хватает - на Пентэве :)

Если ФАПЧ заработает на Эве, мож я таки её себе и прикуплю! :)

Ewgeny7 17th August 2011 12:34

А что, на Эве дисковод плохо работает? Я просто не в курсе, использовал там дисковод всего пару раз, год назад :)

Дмитрий 17th August 2011 13:16

Quote:

Originally Posted by Ewgeny7 (Post 408566)
А что, на Эве дисковод плохо работает?

есть пачка дискет, которые Эва не хавает, хотя тот же Кай даже не поперхнулся (с одним и тем же дисководом).

---------- Post added at 11:16 ---------- Previous post was at 10:44 ----------

Собрал прошиву, если седни не нажрусь, то попробую :)


All times are GMT +4. The time now is 18:08.

Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.