在线咨询 切换到宽版
eetop公众号 创芯大讲堂 创芯人才网

 找回密码
 注册

手机号码,快捷登录

手机号码,快捷登录

搜帖子
楼主: guanfree

最近小作:Verilog版的dpll

[复制链接]
发表于 2003-10-30 13:47:18 | 显示全部楼层

最近小作:Verilog版的dpll

顶!
回复 支持 反对

使用道具 举报

发表于 2003-11-5 11:14:32 | 显示全部楼层

最近小作:Verilog版的dpll

学习、提高、不亦乐乎
回复 支持 反对

使用道具 举报

发表于 2003-11-8 00:47:18 | 显示全部楼层

最近小作:Verilog版的dpll

我也想要分DPLL的资料,谢谢拉
plasc@163.com
回复 支持 反对

使用道具 举报

发表于 2003-11-18 15:20:32 | 显示全部楼层

最近小作:Verilog版的dpll

大侠上面的帖子挺长,我看到的注释都是乱码,程序还好
里面用了一些异步逻辑
这里有一个用状态机实现的全同步的dpll,时钟是数据的4倍,(按照原理很容易增加状态,从而使用16被的时钟,达到7/16--9/16的精度,)输出是占空比为25%的和输入同步的信号(通过分频高速的时钟,很容易作到50%)
前两个状态,是用数据线的两个跳变来启动dpll,         
当相位提前是,状态机通过5 7 6 1 和1 2 3 5
落后时,通过5 7 b 2 0 and 1 3 f 6 4
正常时,5 7 6 4 和 1 3 2 0。分别对应数据是1和0的情况
状态机在状态2和6输出一个时钟周期宽度的脉冲。
参考他人了他人的设计,非本人原创,大家比较一下,多交流啊
20_2_23.jpg
回复 支持 反对

使用道具 举报

发表于 2003-11-18 20:37:03 | 显示全部楼层

最近小作:Verilog版的dpll

多谢楼上!
回复 支持 反对

使用道具 举报

发表于 2003-11-18 22:28:55 | 显示全部楼层

最近小作:Verilog版的dpll



   
下面引用由guanfree2003/09/28 01:05pm 发表的内容:
由于我们的工作接近收尾,鉴定期马上就要来临,所以现在整天都忙于仿真和烧录,过一段时间再给大家作个解释吧。想给你一个不全的资料,但是由于文档太大(4。5M),这里放不下,等我忙完了眼前的工作再说吧。
to ...

忙完之后跟我说一声,我帮你把4.5M文件传上来,也可以放到bravelu的ftp上
回复 支持 反对

使用道具 举报

发表于 2003-11-19 20:20:03 | 显示全部楼层

最近小作:Verilog版的dpll

好东东,我正在研究这个,上面dpll例是usb1.0用48MHz同步12M信号采用的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-11-20 11:05:48 | 显示全部楼层

最近小作:Verilog版的dpll

回jackzhang:那个文件是我把扫描的图片放到word文档里的,很大但没多少东西,不过对于初学者还是很有意义的。这些照片全部扫描于《数字锁相环路原理与应用》/胡华春, 石玉编著。jackzhang老大你认为必要,就把它传上去。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-11-20 17:02:36 | 显示全部楼层

最近小作:Verilog版的dpll

alphame说的不错,我写的程序里面用了一些异步逻辑,其缺陷可能是致命的,另外,里面还有许多bugs,可以说前面的程序是一个不成熟的成果。我希望对这个程序感兴趣的人能发现其中bugs,并且拿出来与大家讨论,共同提高。如果可能的话,我也希望把它拿到联盟里去(如果联盟以后开展usb的讨论的话),作为usb的一部分来使用。下面,我把缺的注释补上。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-11-20 17:06:24 | 显示全部楼层

最近小作:Verilog版的dpll

K可变模计数器的源代码如下:
module KCounter(rst,clk,ud,Kmode,INC_plus,DEC_plus);
       input rst,clk,ud;
   input [2:0] Kmode;
   output INC_plus,DEC_plus;
   reg [8:0] CounterINC,CounterDEC;
   reg [8:0] Kvalue;
       //K变模
   always@(Kmode)
   begin
   case(Kmode)
   3'b001:Kvalue<=9'b000000111;
       3'b010:Kvalue<=9'b000001111;
   3'b011:Kvalue<=9'b000011111;
   3'b100:Kvalue<=9'b000111111;
   3'b101:Kvalue<=9'b001111111;
   3'b110:Kvalue<=9'b011111111;
   3'b111:Kvalue<=9'b111111111;
   default:Kvalue<=9'b000001111;
   endcase
   end
      
   //计数器的下一个数值(加1或减1)
   wire [8:0] INC_cnt,DEC_cnt;
   assign INC_cnt=CounterINC+1;
       assign DEC_cnt=CounterDEC-1;
      
   //形成置位和清零脉冲(带有毛刺)
   wire E_Kvalue,E_zero;
   assign E_Kvalue=(CounterINC==Kvalue)?1:0;
       assign E_zero=(CounterDEC==0)?1:0;
   wire C_set,C_clr;
   assign C_clr=E_Kvalue&~ud;
   assign C_set=E_zero&ud;
      
   //形成置位和清零标志(没有毛刺)
       reg clr_flag;
       reg set_flag;
   always@(posedge rst or negedge clk)
   begin
     if(rst)   clr_flag<=1'b0;
else      clr_flag<=C_clr;
   end
   always@(posedge rst or negedge clk)
   begin
     if(rst)   set_flag<=1'b0;
else      set_flag<=C_set;
   end
       //以下是形成加减脉冲的辅助电路,使其可以保持3个clk

   reg [2:0] INCshift,DECshift;
   always@(posedge rst or negedge clk)
   begin
     if(rst)   INCshift[2:0]<=3'b000;
else   begin
           INCshift[2]<=clr_flag;
                   INCshift[1]<=INCshift[2];
                   INCshift[0]<=INCshift[1];
end
   end
   always@(posedge rst or negedge clk)
   begin
     if(rst)   DECshift[2:0]<=3'b000;
else   begin
           DECshift[2]<=set_flag;
                   DECshift[1]<=DECshift[2];
                   DECshift[0]<=DECshift[1];
end
   end

       reg clrINC,clrDEC;
   always@(posedge rst or negedge clk)
   begin
     if(rst)   clrINC<=1'b0;
else      clrINC<=INCshift[0];
   end
   always@(posedge rst or negedge clk)
   begin
     if(rst)   clrDEC<=1'b0;
else      clrDEC<=DECshift[0];
   end
      //以下是加脉冲和减脉冲的形成,它们保持4个clk(必须是4个)
   reg INC_plus,DEC_plus;
   always@(posedge rst or posedge set_flag or posedge clrDEC)
   begin
     if(rst)              DEC_plus<=1'b0;
else  if(set_flag)   DEC_plus<=1'b1;
else                 DEC_plus<=1'b0;
   end
   always@(posedge rst or posedge clr_flag or posedge clrINC)
   begin
     if(rst)              INC_plus<=1'b0;
else  if(clr_flag)   INC_plus<=1'b1;
else                 INC_plus<=1'b0;
   end
       ///以下是两个计数器(其实不可逆)
   wire INC,DEC;
   assign INC=~ud&clk;
   assign DEC=ud&clk;
   always@(posedge rst or negedge DEC or posedge set_flag)
   begin
     if(rst)                  CounterDEC<=9'b000000000;
else  if(set_flag)       CounterDEC<=Kvalue;
else                     CounterDEC<=DEC_cnt;
   end
   always@(posedge rst or negedge INC or posedge clr_flag)
   begin
     if(rst)                  CounterINC<=9'b000000000;
else  if(clr_flag)       CounterINC<=9'b000000001;
else                     CounterINC<=INC_cnt;
   end
endmodule
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


手机版| 小黑屋| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-9-14 07:27 , Processed in 0.017332 second(s), 4 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表