Intel® Quartus® Prime Software
Intel® Quartus® Prime Design Software, Design Entry, Synthesis, Simulation, Verification, Timing Analysis, System Design (Platform Designer, formerly Qsys)
Announcements
Intel Support hours are Monday-Fridays, 8am-5pm PST, except Holidays. Thanks to our community members who provide support during our down time or before we get to your questions. We appreciate you!

Search our FPGA Knowledge Articles here.
15312 Discussions

## PI loop filter logic in Verilog

Honored Contributor I
1,004 Views

Hello, the attached photo with the verilog code is taken from the attached article.

There are two variables, integral and proportional when clk=1 thenintegral decreases ,when clk=0 then it decreases.Proportional toggles from negative to positive with the FILT amplitude.and both of them goes into vtcl with is the factor controlling the period of the VCO.how this logic represnt PID loop filter?Thanks
3 Replies
Honored Contributor I
208 Views

Your input is the phase error (either + or -)

The PI filter is just an accumultor of this error : accum <= accum + error (the result can lso be divided as a fraction=leaky accumulator)

The Proportional term is just part of error sample added to accum, How much P is added is up to testing

Note that you are mistaken about clock edge. The error is either + or - tested on same clock edge
Honored Contributor I
208 Views

Hello, i am trying to build a test bench for a PI conntroller based on the attached article.

whole code is playing with coefficient for the last line.

how do you recooment to represent the coefficients in the testbench?

Thanks

[VHDL]

always# ((t0-vctl*kphi)/2) vco<=~vco;

[/VHDL]

[VHDL]

module loop_filter(t0,clk,integral,proportional,filt_i,filt_p,vtcl,kptl,vtcl,vco);

input t0,smpclk,integral,proportional,filt_i,filt_p,vtcl,kptl,vtcl;

output vco;

reg integral=4'b0;

reg proportional=4'b0;

always @(posedge smpclk)

begin

if (pdup==1'b1) begin

integral=integral+filt_i;

proportional=filt_p;

end

else if (pdup==1'b0)

begin

integral=integral-filt_i;

proportional=-filt_p;

end

else begin

proportional=0;

end

always# ((t0-vctl*kphi)/2) vco<=~vco;

end

endmodule

[/VHDL]
Honored Contributor I
208 Views

You should not follow that paper as it seems to me it is out of date and the author doesn't seem to know that you can use signed values instead of "pdup" logic. He assumed magnitude then applying for difference sense in logic.

For proper PLL you need to design a frequency generator inside your rtl. Then input another close frequency that you can vary its frequency or phase slightly. You compare the two frequencies (input and reference) and you may add dividers as well if you want more advanced PLL. The comparator will output the signed value of difference which you take to the integral and accumulator directly without the logic proposed in that paper. Then apply filtered output on the input frequency phase.