На углепати подымали вопрос про читаемость и легкость для понимания ФАПЧ по сыркам.
Ясен пень что табличные или перенесеным с схем на сумматорах с перетусоваными битами фапчи малопонятны.
Решил восполнить пробел и написать простенький фапч (коментов гораздо больше чем кода) на более менее читаемом языке
Код:
// синтезируемый
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
Можно колво кода как уменьшить понизив читабельность, так и увеличив, выбрал нечто среднее
Где то так...