基于FPGA数字锁相环源程序代码(已验证运行,超值).doc
《基于FPGA数字锁相环源程序代码(已验证运行,超值).doc》由会员分享,可在线阅读,更多相关《基于FPGA数字锁相环源程序代码(已验证运行,超值).doc(10页珍藏版)》请在冰豆网上搜索。
![基于FPGA数字锁相环源程序代码(已验证运行,超值).doc](https://file1.bdocx.com/fileroot1/2022-10/4/e9a162c7-1a35-4304-b797-481851b13217/e9a162c7-1a35-4304-b797-481851b132171.gif)
基于FPGA数字锁相环源程序代码(已验证运行,超值)
------------------------------------------------------------------------------------------------
基于FPGA数字锁相环源程序代码(已验证运行,超值)
基于FPGA数字锁相环源程序代码(已验证运行,超值)moduledpll_top(fin,fout,clk,reset,Kmode);
inputfin,clk;//clk时钟100ns(10MHZ)inputreset;//reset高电平复位,enable高电平有效input[2:
0]Kmode;//滤波计数器的计数模值设定outputfout;//fout是锁频锁
相输出
regfout;
reg[8:
0]Ktop;
reg[8:
0]Count;
wireinc,dec;
regdnup;
reginc_new,dec_new,inc_pulse,dec_pulse;
regdelayed,advanced,Tff;
regIDout;
reg[14:
0]count_N;
reg[15:
0]cnt;
regcnt_en;
regload;
wirecnt_clr;
//2.异或门鉴相器模块
——————————————————————————————————————
------------------------------------------------------------------------------------------------
always@(finorfout)
begin
dnup=fin^fout;
end
//3.K模计数器模块
always@(Kmode)
begin
case(Kmode)
3'b001:
Ktop<=7;
3'b010:
Ktop<=15;
3'b011:
Ktop<=31;
3'b100:
Ktop<=63;
3'b101:
Ktop<=127;
3'b110:
Ktop<=255;
3'b111:
Ktop<=511;
default:
Ktop<=15;
endcase
end
//根据鉴相器输出的加减控制信号dnup进行可逆计数器的加减运算
always@(posedgeclkorposedgereset)begin
if(reset)
——————————————————————————————————————
------------------------------------------------------------------------------------------------
Count<=0;
elseif(!
dnup)
begin
if(Count==Ktop)Count<=0;
else
Count<=Count+1;end
else
begin
if(Count==0)Count<=Ktop;
else
Count<=Count-1;end
end
//输出进位脉冲carry和借位脉冲borrowassign
inc=!
dnup&(Count==Ktop);assigndec=dnup&(Count==0);
//4.脉冲增减模块
always@(posedgeclk)
begin
if(!
inc)
begin
inc_new<=1;
inc_pulse<=0;end
elseif(inc_pulse)
——————————————————————————————————————
------------------------------------------------------------------------------------------------
begin
inc_new<=0;inc_pulse<=0;
end
elseif(inc&&inc_new)begin
inc_pulse<=1;inc_new<=0;
end
else
begin
inc_pulse<=0;
inc_new<=0;
end
end
always@(posedgeclk)
begin
if(!
dec)
begin
dec_new<=1;
dec_pulse<=0;
end
elseif(dec_pulse)
begin
dec_new<=0;
——————————————————————————————————————
------------------------------------------------------------------------------------------------
dec_pulse<=0;
end
elseif(dec&&dec_new)
begin
dec_pulse<=1;
dec_new<=0;
end
else
begin
dec_pulse<=0;
dec_new<=0;
end
end
always@(posedgeclk)
begin
if(reset)
beginTff<=0;delayed<=1;advanced<=1;endelse
begin
if(inc_pulse)
beginadvanced<=1;Tff<=!
Tff;endelse
if(dec_pulse)
begindelayed<=1;Tff<=!
Tff;endelseif(Tff==0)
——————————————————————————————————————
------------------------------------------------------------------------------------------------
begin
if(!
advanced)
Tff<=!
Tff;
elseif(advanced)
beginTff<=Tff;advanced<=0;end
end
else
begin
if(!
delayed)
Tff<=!
Tff;
elseif(delayed)
beginTff<=Tff;delayed<=0;end
end
end
end
always@(clkorTff)
begin
if(Tff)
IDout=0;
else
begin
if(clk)
——————————————————————————————————————
------------------------------------------------------------------------------------------------
IDout=0;
else
IDout=1;
end
end
//5.N分频参数控制模块
always@(posedgefin)//fin上升沿到的时候,产生各种标志以便后面控制begin
if(reset)
begin
cnt_en=0;
load=1;
end
else
begin
cnt_en=~cnt_en;
load=~cnt_en;
end
end
assigncnt_clr=~(~fin&load);
always@(posedgeclkornegedgecnt_clr)
begin
——————————————————————————————————————
------------------------------------------------------------------------------------------------
if(!
cnt_clr)
cnt=0;
elseif(cnt_en)
begin
if(cnt==65536)
cnt=0;
else
cnt=cnt+1;
end
end
always@(posedgeload)
begin
count_N=cnt/2;//这里取fin周期的一半end
//6.N分频器模块
integercount;
always@(posedgeIDout)
if(reset)
begin
fout=0;
count=0;
end
else
——————————————————————————————————————
------------------------------------------------------------------------------------------------
begin
if(count>=(count_N/2)-1)
beginfout<=~fout;count<=0;endelse
count<=count+1;
end
endmodule
——————————————————————————————————————