FPGA【Verilog分频器】

这篇具有很好参考价值的文章主要介绍了FPGA【Verilog分频器】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        在数字系统的设计中经常会碰到需要使用多个时钟的情况。时钟信号的产生通常具有两种方法,一种是使用PLL(Phase Locked Loop,锁相环),可生成倍频、分频信号;另一种则是使用硬件描述语言构建一个分频电路。

        分频器的设计通常分为以下三类:奇数分频器、偶数分频器及小数分频器。

1.偶数分频

        只是注意时钟翻转的条件是(N/2)还是(N/2)-1,非阻塞赋值在下一个时钟才会更新值

verilog分频器,fpga开发

(1)请使用D触发器设计一个同时输出2/4/8分频的50%占空比的时钟分频器,注意rst为低电平复位

`timescale 1ns/1ns

module even_div
    (
    input     wire rst,
    input     wire clk_in,
    output    wire clk_out2,
    output    wire clk_out4,
    output    wire clk_out8
    );
//*************code***********//
    reg clk_out2_r;
    reg clk_out4_r;
    reg clk_out8_r;
    //2分频
    always@(posedge clk_in or negedge rst)begin
        if(!rst)begin
            clk_out2_r <= 0;
        end
        else begin
            clk_out2_r <= ~clk_out2_r;
        end
    end
    //4分频
    always@(posedge clk_out2 or negedge rst)begin
        if(!rst)begin
            clk_out4_r <= 0;
        end
        else begin
            clk_out4_r <= ~clk_out4_r;
        end
    end
    //8分频
    always@(posedge clk_out4 or negedge rst)begin
        if(!rst)begin
            clk_out8_r <= 0;
        end
        else begin
            clk_out8_r <= ~clk_out8_r;
        end
    end
    assign clk_out2 = clk_out2_r;
    assign clk_out4 = clk_out4_r;
    assign clk_out8 = clk_out8_r;
//*************code***********//
endmodule

 (2)8分频

verilog分频器,fpga开发

verilog分频器,fpga开发

//8分频电路设计
module divider_8                //模块名
(
	input		sys_clk,	    //时钟(设定为 50MHz)
	input		sys_rst_n,	    //复位信号(n 表示低电平有效)
	
	output	reg	clk_8		    //输出8分频信号
);
 
reg [1:0]	cnt;                //reg 定义  
 
//计数模块
//从0计数到3共计4个时钟周期
always@(posedge sys_clk or negedge sys_rst_n)begin
	if(!sys_rst_n)
		cnt <= 2'd0;			//复位清零
	else if(cnt == 2'd3)		//从0开始计数,所以需要 -1
		cnt <= 2'd0;			//计满则清零
	else
		cnt <= cnt + 2'd1; 		//没记满就一直计数
end
 
//8分频时钟输出模块
//满足计数条件则对8分频时钟进行反转
//8分频时钟每隔4个周期反转一次,所以8分频的周期即为8个时钟周期
always@(posedge sys_clk or negedge sys_rst_n)begin
	if(!sys_rst_n)                  
		clk_8 <= 1'b0;          //复位清零
	else if(cnt == 2'd3)  		//记满4个时钟周期
		clk_8 <= ~clk_8;        //计满则输出反转
	else                            
		clk_8 <= clk_8; 		//没记满就保持原来状态
end
 
endmodule

testbench

`timescale 1ns/1ns		//时间刻度:单位1ns,精度1ns
 
module tb_divider_8();	//仿真模块
 
//输入reg 定义
reg	sys_clk;			
reg sys_rst_n;
 
//输出wire定义
wire clk_8;
 
//设置初始化条件
initial begin
	sys_clk = 1'b0;		//初始时钟为0
	sys_rst_n <= 1'b0;	//初始复位为0
	#10					//10个时间单位后
	sys_rst_n <= 1'b1;  //拉高复位(此时复位无效)
end
//always代表重复进行,#10代表每10个时间单位
//每10个时间单位反转时钟,即时钟周期为20个时间单位(20ns)
always #10 sys_clk = ~sys_clk;	
//例化被测试模块
divider_8 divider_8_inst
(
	.sys_clk 	(sys_clk ), 		
	.sys_rst_n 	(sys_rst_n ), 				
	.clk_8 		(clk_8 ) 		
);
	
endmodule

2.奇数分频

        奇数分频比偶数分频复杂一些,当不要求分频的占空比时,对输入时钟clk上升沿计数,可以设置两个计数的翻转点,一个是(N-1)/2,一个是(N-1),计数到(N-1)时输出时钟翻转且将计数器清零,假设计数器计数0~(N-1)/2区间输出低电平,则输出时钟的低电平有(N-1)/2 + 1个clk周期,高电平的计数是(N-1)/2+1 ~ (N-1),共(N-1)/2个clk周期,可见不是50%占空比。

verilog分频器,fpga开发

         当要求占空比为50%时,对输入时钟clk的上升沿和下降沿分别计数,根据两个计数器得到两个错位输出的时钟,将两个时钟做“或”运算可以弥补相差的时钟,达到50%占空比

verilog分频器,fpga开发文章来源地址https://www.toymoban.com/news/detail-828356.html

/********************************************
          计数器实现 7 分频
*********************************************/
module Odd_Divider(
         inputclk,
         inputrst_n,
         outputclk_divider
);
 
reg [2:0] count_p;    //上升沿计数
reg [2:0] count_n;    //下降沿计数
reg clk_p;                   //上升沿分频
reg clk_n;                   //下降沿分频
 
//上升沿计数
always @ ( posedge clk or negedge rst_n )
begin
         if(!rst_n )
                  count_p<= 3'b0;
         elseif( count_p == 3'd6 )
                   count_p<= 3'b0;
         else 
                   count_p<= count_p + 1'b1;
end
 
//上升沿分频
always @ ( posedge clk or negedge rst_n )
begin
         if(!rst_n ) begin
                   clk_p<= 1'b0;
         end
         elsebegin
                   if(count_p == 3'd3 || count_p == 3'd6 ) begin
                            clk_p<= ~clk_p;
                   end
         end
end
 
//下降沿计数
always @ ( negedge clk or negedge rst_n )
begin
         if(!rst_n )
                   count_n<= 3'b0;
         elseif( count_n == 3'd6 )
                   count_n<= 3'b0;
         else 
                   count_n<= count_n + 1'b1;
end
 
//下降沿分频
always @ ( negedge clk or negedge rst_n )
begin
         if(!rst_n ) begin
                   clk_n<= 1'b0;
         end
         elsebegin
                   if(count_n == 3'd3 || count_n == 3'd6 ) begin
                            clk_n<= ~clk_n;
                   end
         end
end
 
assign clk_divider = clk_p | clk_n;
 
endmodule

判断条件需要确认一下,计数器为上升沿触发开始计数,上升沿触发为记完结束,下降沿触发为一半

3.小数分频

/********************************************
   计数器实现 3.5 分频,N=3,2N=6
*********************************************/
moduleNpoint5_Divider(
         input clk,
         input rst_n,
         output clk_divider
);
 
reg[2:0] count_p;    //上升沿计数
reg[2:0] count_n;    //下降沿计数
regclk_p;                                      //上升沿分频
regclk_n;                                      //下降沿分频
 
//上升沿计数
always @( posedge clk or negedge rst_n )
begin
         if( !rst_n )
                   count_p <= 3'b0;
         else if( count_p == 3'd6 )
                   count_p <= 3'b0;
         else 
                   count_p <= count_p + 1'b1;
end
 
//上升沿分频
always  @ ( posedge clk or negedge rst_n )
begin
         if( !rst_n ) begin
                   clk_p <= 1'b0;
         end
         else begin
                   if( count_p == 3'd4 ||count_p == 3'd0 ) begin
                            clk_p <= ~clk_p;
                   end
         end
end
 
//下降沿计数
always @( negedge clk or negedge rst_n )
begin
         if( !rst_n )
                   count_n <= 3'b0;
         else if( count_n == 3'd6 )
                   count_n <= 3'b0;
         else 
                   count_n <= count_n + 1'b1;
end
 
//下降沿分频
always  @ ( negedge clk or negedge rst_n )
begin
         if( !rst_n ) begin
                   clk_n <= 1'b1;
         end
         else begin
                   if( count_n == 3'd4 ||count_n == 3'd1 ) begin
                            clk_n <= ~clk_n;
                   end
         end
end
 
assignclk_divider = clk_p & clk_n;
 
endmodule

到了这里,关于FPGA【Verilog分频器】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • verilog---分频器设计

    //设计分频器 将50MHZ信号分频产生1HZ的秒脉冲,输出信号占空比为50%。 //设计思路:用计数器设计,N分频:当计数到(N/2)-1个数时,输出时钟翻转一次 //50*10^6次分频:计数到24 999 999(需要25bit)时,输出信号翻转。 //无法用vmf仿真,因为endtime最大为10us,实际最少需要1000000u

    2024年02月04日
    浏览(35)
  • Verilog手撕代码(6)分频器

    分频就是生成一个新时钟,该新时钟的频率是原有时钟频率的整数分之一倍,新周期是原有周期的整数倍。 再简单来说,让你手撕一个四分频电路,就是写代码生成一个周期是原来四倍的时钟,如果手撕一个三分频电路,就是写代码生成一个周期是原来三倍的时钟。 如图为

    2024年02月08日
    浏览(41)
  • 【实验室学习】时钟分频器,2、3、4、8分频 verilog实现

    记录时钟分频器的Verilog代码编写,主要掌握分频器设计思路 2、4、8分频设计较为容易: 2分频—设计一个1位的寄存器,当原时钟上升沿时取反即可 代码展示: 4分频与8分频—设计一个两位的计数器,4分频只需在计数器计数到00B或者10B时跳变电平即可,8分频只需在计数器计

    2024年02月11日
    浏览(43)
  • 数字分频器设计(偶数分频、奇数分频、小数分频、半整数分频、状态机分频|verilog代码|Testbench|仿真结果)

    目录 一、前言 二、偶数分频 2.1 触发器级联法 2.2 计数器法 2.3 verilog代码 2.4 Testbench 2.5 仿真结果 三、奇数分频 3.1 占空比非50%奇数分频 3.2 占空比50%奇数分频 3.3 Verilog代码 3.4 Testbench 3.5 仿真结果 四、小数分频 4.1 双模前置分频法 4.2 Verilog代码 4.3 Testbench 4.4 仿真结果 五、半整

    2024年02月04日
    浏览(48)
  • 数字分频器设计(偶数分频、奇数分频、小数分频、半整数分频、状态机分频|verilog代码|Testbench|仿真结果)

    数字IC经典电路设计 经典电路设计是数字IC设计里基础中的基础,盖大房子的第一部是打造结实可靠的地基,每一篇笔者都会分门别类给出设计原理、设计方法、verilog代码、Testbench、仿真波形。然而实际的数字IC设计过程中考虑的问题远多于此,通过本系列希望大家对数字I

    2024年02月08日
    浏览(45)
  • FPGA——分频器

    野火学习备忘录——FPAG分频 时钟对于 FPGA 是非常重要的,但板载晶振提供的时钟信号频率是固定的,不一定满 足工程需求,所以分频和倍频还是很有必要的。这里通过计数的方式来实现分频。 1.通过计数器来实现6分频。两种方式。第一种直接通过计数方式直接获取获取。输

    2024年02月10日
    浏览(42)
  • FPGA 多路分频器实验

    1 概述         在 FPGA 中,时钟分频是经常用到的。本节课讲解 2 分频、3 分频、4 分频和 8 分频的 Verilog 实现并且学习 generate 语法功能的应。 2 程序设计思路         1)整数倍分频,为 2、4、8,这种 2^n 次方倍数倍数关系的分频最容易实现,所以我们可以把这 3 种分

    2024年01月19日
    浏览(38)
  • FPGA学习——实现任意倍分频器(奇数/偶数倍分频器均可实现)

    在FPGA(可编程逻辑门阵列)中,分频器是一种用于将时钟信号的频率降低的电路或模块。它可以根据输入的时钟信号生成一个较低频率的输出时钟信号。 常见的分频器可以按照固定比例来进行分频,例如将输入时钟频率除以2、除以4等。因此,如果输入时钟信号的频率为10

    2024年02月05日
    浏览(41)
  • FPGA基础设计(二):任意分频器(奇数,偶数,小数)

    FPGA开发板上一般只有一个晶振,即一种时钟频率。数字系统设计中,时间的计算都要以时钟作为基本单元,对基准时钟进行不同倍数的分频而得到各模块所需时钟频率,可通过Verilog代码实现;倍频可通过锁相环【PLL】实现。 把输入信号的频率变成成倍的低于输入频率的输出

    2024年02月01日
    浏览(42)
  • 实验二 基于FPGA的分频器的设计(基本任务:设计一个分频器,输入信号50MHz,输出信号频率分别为1KHz、500Hz及1Hz。拓展任务1:用按键或开关控制蜂鸣器的响与不响。拓展任务2:用按键或开)

    1. 实验目的: (1) 掌握QuartusⅡ软件的层次型设计方法; (2) 掌握元件封装及调用方法; (3) 熟悉FPGA实验平台,掌握引脚锁定及下载。 2. 实验任务: (1) 基本任务:设计一个分频器,输入信号50MHz,输出信号频率分别为1KHz、500Hz及1Hz。 (2) 拓展任务1:用按键或开关

    2024年02月06日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包