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




Ответить с цитированием
Размещение рекламы на форуме способствует его дальнейшему развитию 
