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

上一篇 / 下一篇  2017-10-11 12:17:38

前几天刚说十月份的大连秋高气爽、万里无云、适合玩耍,这两天就被冻得瑟瑟发抖,冰冷如狗。所以吧这个时代什么都变化的很快,不管是科技和还是天气。但是呢天气我们只能了解不能控制,而科技我们是可以掌握、控制和创造的。今天就来简单的说说在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

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

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2017-10-21  
1234567
891011121314
15161718192021
22232425262728
293031    

数据统计

  • 访问量: 506
  • 日志数: 3
  • 建立时间: 2017-08-21
  • 更新时间: 2017-10-11

RSS订阅

Open Toolbar