verilog 实现小数分频(小数分频器)代码.doc

上传人:大米 文档编号:557838898 上传时间:2022-10-21 格式:DOC 页数:4 大小:46.51KB
返回 下载 相关 举报
verilog 实现小数分频(小数分频器)代码.doc_第1页
第1页 / 共4页
verilog 实现小数分频(小数分频器)代码.doc_第2页
第2页 / 共4页
verilog 实现小数分频(小数分频器)代码.doc_第3页
第3页 / 共4页
verilog 实现小数分频(小数分频器)代码.doc_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《verilog 实现小数分频(小数分频器)代码.doc》由会员分享,可在线阅读,更多相关《verilog 实现小数分频(小数分频器)代码.doc(4页珍藏版)》请在金锄头文库上搜索。

1、verilog实现小数分频(小数分频器)小数分频无法做到1:1 的占空比。例如用77 分频得到16M时钟的生成原理如下:对于77 M的时钟,一个sts-12帧有9720拍。对于16M时钟,一个sts-12帧有32*8*8拍。即77M下每计数1215,16M下计数256.1215/256 =4.76 考虑到数字处理只能是整数,则需要在每m 个5拍扣一拍,每 n个4拍扣一拍。列方程为: m + n =2565m + 4n =1215得到 m= 191, n = 65, 即通过191个5分频和65个4分频实现16M的时钟。 小数分频是通过可变分频和多次平均的方法实现的。例如要实现4.7分频,需要在1

2、0次分频中做3次4分频和7次5分频就可以做到,再如实现 5.67分频,只要在100次分频中,做67次6分频,33次5分频即可。因为从N分频到N+1分频和从N+1分频到N分频的切换,会产生一个随时间增长 的相位移。考虑到小数分频中需要多次进行两种频率分频,必须将两种分频均匀,这种“均匀”工作是通过计数器完成的,这里仅给出一位小数的情况,下面简要介 绍这种混合的方法: 每进行一次分频,计数值为10减去分频系数的小数部分,各次计数值累加。若累加结果小于10,则进行 N +1 分频,若大于或等于10,则进行 分频。以8.7 分频为例进行设计时,需要进行3次 8分频,7次 9 分频。该例中计数值(10-

3、7)=3,前三次累加结果都小于10,所以为9分频,第四次累加结果为12,则去掉十位数后累加结果变为2,同时进行8分频,下表给出了该分频器的分频过程。 分频系数8.7-序号 累加结果 分频系数1 39269399412-10 =28559689711-10 =1884997910108以下是代码模块:/top modulemodule fd89bits( clkin,reset,a,clkout ); input clkin; input reset; input a; output reg clkout; wire clkout1,clkout2; fd8bits dut1(clkin,res

4、et,clkout1); fd9bits dut2(clkin,reset,clkout2); always(posedge clkin) begin if(a) clkout = clkout1; else clkout = clkout2; endendmoduletimescale 1ns / 1psmodule fd8bits( clk_in,reset,clk_out ); input clk_in; input reset; output reg clk_out; reg3:0 count; always(posedge clk_in) begin if(!reset) count

5、 = 0; else begin if(count 7) count = count + 1; else count = 0; end clk_out = count2;endendmodule/ 9 分频module fd9bits( clk_in,reset,clk_out ); input clk_in; input reset; output reg clk_out; reg3:0 count; always(posedge clk_in) begin if(!reset) count = 0; else begin if(count 8) count = count + 1; els

6、e count = 0; end clk_out = count2;endendmodule/ testbenchmodule testbench( ); reg clk_in; reg reset; reg a; wire clk_out; fd89bits dut(clk_in,reset,a,clk_out); initial begin clk_in= 0; reset = 0; #11; reset = 1; forever begin a = 1; #60; a = 0; #20; a = 1; #40; a = 0; #20; a = 1; #40; a = 0; #20; end endalways #10 clk_in = clk_in;endmodule/result

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号