Dream_cluster的个人空间 https://blog.eetop.cn/1573384 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

怎样编写可综合的分频器(任意时钟)

已有 1946 次阅读| 2017-10-11 12:17 |系统分类:硬件设计

前几天刚说十月份的大连秋高气爽、万里无云、适合玩耍,这两天就被冻得瑟瑟发抖,冰冷如狗。所以吧这个时代什么都变化的很快,不管是科技和还是天气。但是呢天气我们只能了解不能控制,而科技我们是可以掌握、控制和创造的。今天就来简单的说说在FPGA设计时的时钟问题。
我们都知道一般情况下一个FPGA芯片在PCB板上只有一颗晶振,而在FPGA内部需要的时钟可能有很多,不同模块的时钟频率不太一样,大到几百兆上吉赫兹,小到几千赫兹。这时我们一般会用到厂家提供的DCM(Digitai Clock Manager ) 数字时钟管理模块来产生所需要的时钟。但是这个模块不是说什么时钟都可以产生的,一般情况下可产生5M--500M之间的时钟,那么如果我们需要的时钟不在这个范围内或DCM产生不了怎么办呢?
下面介绍两种基础的可综合的分频方法;一种是1/2分频器,另一种是计数分频器:这些代码都是经过仿真后准确无误的;

//*************这部分代码一般都需要闭着眼睛脑子不转都能写出来的***********
//1:************ 1/2分频器********

module half_clk (
clk_in,
reset,
clk_out
);
//输入输出 端口定义
input clk_in;
input reset;
output clk_out;
//数据类型定义
reg clk_out;
//将输入时钟进行1/2分频
always @ (posedge clk_in) begin
if(!reset)
clk_out <= 1'b0;
else
clk_out <= ~clk_out;
end
endmodule

//测试模块的源代码
module half_clk_tb;
// 输入端口
reg clk_in;
reg reset;
// 输出端口
wire clk_out;

//实例化被测模块
half_clk  uut(
.clk_in(clk_in),
.reset(reset),
.clk_out(clk_out)
);
//测试程序主题部分
localparam T = 10; // 这里设置一个参数有利于对整个程序的控制,当然也可以不设
always #T clk_in = ~clk_in;
initial begin
reset = 1;
clk_in = 1;
#(10*T) reset = 0;
#(100*T) reset = 1;
end
endmodule


//2:******任意计数分频******

//****这里假如我们需要产生一个250K的时钟,其他时钟方法类似*****

//首先,我们通过DCM产生一个20M的时钟,然后将20M的时钟进行1/80分频,具体操作如下;
module cut_clk(
clk_20M,
reset,
clk_250K
);
//输入端口定义
input clk_20M;
input reset;
//输出端口定义
output clk_250K;
//端口类型定义
reg clk_250K;
reg [6:0] cnt; //这里定义一个计数器进行计数,因为要计到79所以至少需要7位
//将输入时钟进行1/80分频
always @ (posedge clk_20M)  begin
if(!reset) begin
clk_250K <= 0;
cnt <= 7'd0;
end
else begin
if(cnt==7'd79)  begin //该处注意是计到79而不是计到80,即0~79
clk_250K <= ~clk_250K;
cnt <= 7'd0;
end
else begin
clk_250K <= clk_250K;
cnt <= cnt + 1'b1;
end
   end
    end
endmodule
//测试模块的源代码
module cut_clk_tb;
// 输入端口
reg clk_20M;
reg reset;
// 输出端口
wire clk_250K;

//实例化被测模块
cut_clk  uut(
.clk_20M(clk_20M),
.reset(reset),
.clk_250K(clk_250K)
);
//测试程序主题部分
localparam T = 10; // 这里设置一个参数有利于对整个程序的控制,当然也可以不设
always #(5*T/2) clk_20M= ~clk_20M;
initial begin
reset = 1;
clk_20M = 1;
#(10*T) reset = 0;
#(100*T) reset = 1;
end
endmodule

这两种分频基本原理是一样的,只是第二种计数分频器需要定义一个计数器,这样就能准确得到相应的分频时钟。

点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 3

    粉丝
  • 0

    好友
  • 0

    获赞
  • 2

    评论
  • 1054

    访问数
关闭

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

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

GMT+8, 2024-4-26 17:17 , Processed in 0.023047 second(s), 14 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部