пересчитал и пофиксил под 28мгц
И диаграмка сравнивающая 2 фапча на одних входных данныхКод:// синтезируемый 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




Ответить с цитированием