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