码迷,mamicode.com
首页 > 其他好文 > 详细

MiS603开发板 第三章 多路分频器设计

时间:2015-09-13 11:43:28      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:

作者:MiS603开发团队

日期:20150911

公司:南京米联电子科技有限公司

论坛:www.osrc.cn

网址:www.milinker.com

网店:http://osrc.taobao.com

EAT博客:http://blog.chinaaet.com/whilebreak

博客园:http://www.cnblogs.com/milinker/

技术分享

MiS603开发板 第三章 多路分频器设计

设计思想:利用FPGA内部的逻辑单元对FPGA输入的50MHZ高频时钟信号进行计数分频,得到2分频、3分频、4分频、8分频和频率1HZ的时钟。其中为了使chipscope进行信号抓取,能有效检测到边沿,3分频是在2分频的基础上,使用2分频得到的时钟进一步设计出的。具体设计流程参考下图。

3.1 硬件分析

FPGA输入全局时钟50MHZ,定义合适的分频计数器,得到对应的时钟。通过chipscope来抓取2分频、3分频、4分频和8分频结果,通过板子上的LED灯,来显示1HZ的时钟。设计总体框图如下所示。

技术分享

3. 2 时序设计

? 定义寄存器div2_o_r,检测输入时钟上升沿,每次上升沿寄存器div2_o_r反转一次,实现2分频。

? 定义寄存器pos_cnt[1:0],neg[1:0],分别检测div2_o_r的上升沿和下降沿,检测到上升沿和下降沿时,两个寄存器分别累加。计数到2’d2时,寄存器清零。另定义两个div3_o_r0和div3_o_r1,当两个计数器小于2’d1时,div3_o_r0和div3_o_r1均赋值为1,其他情况赋值为0。由div3_o_r0和div3_o_r1组合逻辑相或即为div2_o_r进一步进行3分频所得的结果。

? 定义位宽为2的寄存器div_cnt[1:0],检测输入时钟上升沿,div_cnt==2’b00或2’b01,4分频输出寄存器div4_o_r反转,div_cnt==2’b00时,8分频输出寄存器div8_o_r反转。

? 由于输入时钟50MHZ,为得到1HZ的时钟,需要定义计数器至少50000000/1=50000000。在此定义一个26位位宽的div1hz_cnt计数器。检测输入时钟上升沿,div1hz_cnt==26’d24_999999或div1hz_cnt==26’d49_999999时,1HZ输出寄存器div1hz_o_r反转。

? 有Timedesigner设计的时序图如下所示。根据时序图,即可编写verilog代码。

技术分享

3.3 程序源码

`timescale 1ns / 1ps

//-----------------------------------------------------------------------------------------------------

/*

* 文件名字:water_lights

* 程序描述:

* 作 者:

* 修改日期:

* 版 本 号:

* 版权所有:南京米联电子科技有限公司

*/

//-----------------------------------------------------------------------------------------------------

module water_lights(

    input clk_i,

    input rst_n_i,

    output [7:0] led_o

);

//1s计数参数

parameter HOLD_1S=26‘d49_999999; //for project

//parameter HOLD_1S=26‘d49;        //for simulation

reg [25:0] div_cnt;

reg [7:0] led_o_r;

always@(posedge clk_i or negedge rst_n_i)

begin

if(!rst_n_i)

div_cnt<=0;

else if(div_cnt==HOLD_1S)

div_cnt<=0;

else

div_cnt<=div_cnt+1‘b1;

end

//LED灯初始化为8‘h01,每秒1次进行循环移位

always@(posedge clk_i or negedge rst_n_i)

begin

if(!rst_n_i)

led_o_r<=8‘h01;

else if(div_cnt==HOLD_1S)

led_o_r<=led_o_r<<1;

else if(led_o_r==8‘h00)

led_o_r<=8‘h01;

else

led_o_r<=led_o_r;

end

assign led_o=~led_o_r;

endmodule

3.4 综合布线前仿真时序

根据RTL代码,设计testbench,进行多路分频器的功能仿真。其仿真图如下所示。从图中可以看出,div2_o是clk_i的2分频,div3_o是div2_o的三分频,div4_o、div8_o分别是4分频和8分频。div1hz_o由于分频计数太大,无法在modelsim中体现出来,将通过后续LED显示出来。

技术分享

3.5 Chipscope在线逻辑分析仪仿真

设置好逻辑分析仪,需要抓取的信号为div2_o_r,div3_o_r,div3_o_r0,div3_o_r1,div4_o_r,div8_o_r。Chipscope抓取的信号如下图所示。跟modelsim仿真对比可以看出,与设计的要求想符合。

技术分享

3.6输出结果

将程序下载到板子上,以看到核心板的LED灯以每秒1次的进行闪烁,符合设计的1Hz频率。核心板上另外一个LED灯由于分频后频率依然很高,保持高亮状态,肉眼无法辨识。

3.7小结

计数分频是verilog入门学习最简单的一个例子,但其重要性不言而喻。后续的很多设计,都得使用各种计数分频器,来得到我们想要的频率。

MiS603开发板 第三章 多路分频器设计

标签:

原文地址:http://www.cnblogs.com/milinker/p/4804149.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!