Есть два идентичных (за исключением первого периода) сигнала fb_l и fb_r, но второй имеет частотозависимую задержку d2 относительно первого. Требуется сформировать сигнал ctrl, который отстает от fb_l на время d3 = d2 - d1, где d1 некоторая постоянная величина (d1 < d2).
Моя программа работает некорректно - часть периодов ctrl формируется правильно, но остальные "слипаются" или пропускаются. Причем количество и положение испорченных периодов меняется рандомно.
Фрагмент сигнала (d1 = 0 для наглядности)
Код
Спойлер
Код: Выделить всё
module EPM240
(
input wire clk,
input wire in1,
input wire in2,
input wire in3,
input wire in4,
output wire out1,
output wire out2,
output wire out3,
output wire out4
);
localparam clk_freq = 50_000_000,
inter_coarse_freq = 10_000,
inter_coarse_value = clk_freq / inter_coarse_freq,
period_coarse_freq = 200_000,
period_coarse_value = clk_freq / period_coarse_freq,
start_pulse_value = period_coarse_value / 8;
reg[15:0] cnt = 0;
reg[8:0] d1 = 0,
d2 = 72,
d3 = 72;
reg[0:0] fb_l = 0,
fb_l_pre = 0,
fb_r = 0,
fb_r_pre = 0,
channel_1 = 0,
channel_2 = 0,
d2_inc_en = 0,
d3_dec_en = 0;
//----------
always @ (posedge clk)
begin
//----------
fb_l = in1;
fb_r = in2;
//----------
if (cnt != (inter_coarse_value - 1)) cnt = cnt + 1;
else cnt = 0;
//----------
if (d2_inc_en == 1) d2 = d2 + 1;
if (d3_dec_en == 1)
begin
if (d3 == 0)
begin
d3_dec_en = 0;
if (fb_l == 0) channel_2 = 0;
else channel_2 = 1;
end
else d3 = d3 - 1;
end
//----------| start | ----------
if (cnt == 0) channel_1 = channel_1 ^ 1;
if (channel_1 == 0) channel_2 = 0;
//----------| d2 & d3 | ----------
if ((fb_l_pre == 0)&&(fb_l == 1)) // fb_l __/--
begin
d3_dec_en = 1;
d2_inc_en = 1;
d3 = d2 - d1;
d2 = 0;
fb_l_pre = fb_l;
end
if ((fb_r_pre == 0)&&(fb_r == 1)) // fb_r __/--
begin
d2_inc_en = 0;
fb_r_pre = fb_r;
end
if ((fb_l_pre == 1)&&(fb_l == 0)) // fb_l --\__
begin
d3_dec_en = 1;
d2_inc_en = 1;
d3 = d2 - d1;
d2 = 0;
fb_l_pre = fb_l;
end
if ((fb_r_pre == 1)&&(fb_r == 0)) // fb_r --\__
begin
d2_inc_en = 0;
fb_r_pre = fb_r;
end
end
//----------
assign out1 = channel_1;
assign out2 = channel_2;
endmodule