偶分频和奇分频 FPGA verilog 基础练习4

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

偶分频和奇分频 FPGA verilog 基础练习4

发现问题,用技术解决问题。兴趣是自己的源动力 !

前言

分频器的练习就是计数器的一个应用分支,用设立来检验自己对计数器的使用使用熟练。真实上板代码,都是使用IP核来进行的。核心的点就是要明白计数器使用的两个关键:

  • 清零条件
  • 递增条件

一、偶数分频

1.1 分频方案

偶数分频,计数器具有对称性,如果要实现6分频,则计数器只需要计数3个周期即可,即0~2,然后对输出取反。

1.1.1 功能代码

module divider_six
(
input wire sys_clk , //系统时钟50MHz
input wire sys_rst_n , //全局复位

output reg clk_out //对系统时钟6分频后的信号

);

 reg [1:0] cnt; //用于计数的寄存器

 //cnt:计数器从0到2循环计数
 always@(posedge sys_clk or negedge sys_rst_n)
 if(sys_rst_n == 1'b0)
 cnt <= 2'b0;
 else if(cnt == 2'd2)
 cnt <= 2'b0;
 else
 cnt <= cnt + 1'b1;

 //clk_out:6分频50%占空比输出
 always@(posedge sys_clk or negedge sys_rst_n)
 if(sys_rst_n == 1'b0)
 clk_out <= 1'b0;
 else if(cnt == 2'd2)
 clk_out <= ~clk_out;

 endmodule

1.1.2 仿真代码

module tb_top();

reg sys_clk;
reg sys_rst_n;

wire clk_out;

//初始化系统时钟、全局复位
 initial begin
 sys_clk = 1'b1;
 sys_rst_n <= 1'b0;
 #20
 sys_rst_n <= 1'b1;
 end

 //sys_clk:模拟系统时钟,每10ns电平翻转一次,周期为20ns,频率为50MHz
 always #10 sys_clk = ~sys_clk;

 //--------------------divider_sixht_inst--------------------
 divider_six divider_six_inst
 (
 .sys_clk (sys_clk ), //input sys_clk
 .sys_rst_n (sys_rst_n ), //input sys_rst_n

 .clk_out (clk_out ) //output clk_out

 );

 endmodule

1.1.3 仿真结果

偶分频和奇分频 FPGA verilog 基础练习4,FPGA verilog编码实战系列,fpga开发

1.2 降频方案

为什么需要降频呢,因为你分频后的时钟其实一般不直接使用的,一般是使用全局时钟网络的时钟,这其实和时钟的布局布线有关(为了时钟到达所有的节点的时间几乎一样)。

1.2.1 功能代码

就是使用系统时钟来输出一个flag信号,这个flag信号的输出就是分频后的输出,且占空比不是50%。注意flag。这里的代码需要注意计数器的清零条件和递增条件。(代码中有注释)

module divider_six
(
input wire sys_clk , //系统时钟50MHz
input wire sys_rst_n , //全局复位

output reg clk_flag //指示系统时钟6分频后的脉冲标志信号

);

 reg [2:0] cnt; //用于计数的寄存器

 //cnt:计数器从0到5循环计数
 always@(posedge sys_clk or negedge sys_rst_n)
 if(sys_rst_n == 1'b0)
 cnt <= 3'b0;
 else if(cnt == 3'd5)
 cnt <= 3'b0;
 else
 cnt <= cnt + 1'b1;

 //clk_flag:脉冲信号指示6分频
 always@(posedge sys_clk or negedge sys_rst_n)
 if(sys_rst_n == 1'b0)
 clk_flag <= 1'b0;
 else if(cnt == 3'd4)  // 注意:这里是4,不是5,因为flag会延迟一拍被时钟采样
 clk_flag <= 1'b1;
 else
 clk_flag <= 1'b0;

 endmodule

1.2.2 tb代码

`timescale 1ns/1ns
module tb_top();

reg sys_clk;
reg sys_rst_n;

wire clk_out;

//初始化系统时钟、全局复位
 initial begin
 sys_clk = 1'b1;
 sys_rst_n <= 1'b0;
 #20
 sys_rst_n <= 1'b1;
 end

 //sys_clk:模拟系统时钟,每10ns电平翻转一次,周期为20ns,频率为50MHz
 always #10 sys_clk = ~sys_clk;

 //-----------------------divider_five_inst------------------------
 divider_five divider_five_inst
 (
 .sys_clk (sys_clk ), //input sys_clk
 .sys_rst_n (sys_rst_n ), //input sys_rst_n

 .clk_flag (clk_out ) //output clk_out

 );

 endmodule

1.2.3 仿真结果

偶分频和奇分频 FPGA verilog 基础练习4,FPGA verilog编码实战系列,fpga开发

二、奇数分频

实现一个5分频的方法。如果占空比不要求50%,则很好设计,如下图。(这种使用降频的方法就不展示了,参照偶数分频)
偶分频和奇分频 FPGA verilog 基础练习4,FPGA verilog编码实战系列,fpga开发但是,如果占空比要求50%,5分频那就是,2.5个时钟周期一个高电平,2.5个时钟周期一个低电平。

因此如何实现2.5个时钟周期呢?这就是要学习的地方了

  • 使用时钟的上升沿和下降沿。

2.1 分频方案

可以看下图去理解。
偶分频和奇分频 FPGA verilog 基础练习4,FPGA verilog编码实战系列,fpga开发

理解:要在一个5clk,里面实现两个2.5clk的高电平和2.5clk的低电平。实现2.5clk,本质就是利用上升沿和下降沿的时间差0.5clk。

2.1.1 分频代码

	

module divider_five
(
input wire sys_clk , //系统时钟50MHz
input wire sys_rst_n , //全局复位

output wire clk_out //对系统时钟5分频后的信号

);

 reg [2:0] cnt;
 reg clk1;
 reg clk2;

 //cnt:上升沿开始从0到4循环计数
 always@(posedge sys_clk or negedge sys_rst_n)
 if(sys_rst_n == 1'b0)
 cnt <= 3'b0;
 else if(cnt == 3'd4)
 cnt <= 3'b0;
 else
 cnt <= cnt + 1'b1;

// 因为是分频5个clk,如何实现2.5个clk呢?可以这里理解 2.5 = 2+0.5,只需要实现两个时钟相加就可以了
 //clk1:上升沿触发,这里先实现一个 2 clk 的低电平,3clk的高电频
 always@(posedge sys_clk or negedge sys_rst_n) begin
	if(sys_rst_n == 1'b0)
		clk1 <= 1'b1;
	else if(cnt == 3'd2)
		clk1 <= 1'b0;
	else if(cnt == 3'd4)
		clk1 <= 1'b1;
	else
		clk1 <= clk1;
 end
 //clk2:下降沿触发,这里先实现一个 2 clk 的低电平,注意是下下降沿,因为要和上升沿错开,获得一个0.5 clk周期
 always@(negedge sys_clk or negedge sys_rst_n) begin
	if(sys_rst_n == 1'b0)
		clk2 <= 1'b1;
	else if(cnt == 3'd2)
		clk2 <= 1'b0;
	else if(cnt == 3'd4)
		clk2 <= 1'b1;
	else
		clk2 <= clk2;
 end	
 
 //clk_out:5分频50%占空比输出
 assign clk_out = clk1 & clk2;

 endmodule

2.1.2 tb代码

`timescale 1ns/1ns
module tb_top();

reg sys_clk;
reg sys_rst_n;

wire clk_out;

//初始化系统时钟、全局复位
 initial begin
 sys_clk = 1'b1;
 sys_rst_n <= 1'b0;
 #20
 sys_rst_n <= 1'b1;
 end

 //sys_clk:模拟系统时钟,每10ns电平翻转一次,周期为20ns,频率为50MHz
 always #10 sys_clk = ~sys_clk;

 //-----------------------divider_five_inst------------------------
 divider_five divider_five_inst
 (
 .sys_clk (sys_clk ), //input sys_clk
 .sys_rst_n (sys_rst_n ), //input sys_rst_n

 .clk_out (clk_out ) //output clk_out

 );

 endmodule

2.1.3 仿真结果

偶分频和奇分频 FPGA verilog 基础练习4,FPGA verilog编码实战系列,fpga开发

小结:实现2.5个时钟周期,核心只需要记住一点:上升沿和下降沿之间,就是差了0.5个周期,抓住这个点,其他的设计就只需要注意清零条件和拉高条件即可

总结

  • 核心思想:明白如何使用计数器来实现特定的功能,主要是对计数器练习的一个目的
  • 知识点总结:
    1. 如何使用奇分频和偶分频:要点是计数器的清零条件
    2. 全局时钟的理解
    3. 如何产生一个0.5clk
  • 欢迎一起交流学习,如有错误之处,还请各位指正。

参考资料

[1] FPGA系列教学文章来源地址https://www.toymoban.com/news/detail-764927.html

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

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

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

相关文章

  • FPGA实现Verilog 2分频:从原理到代码实现

    FPGA实现Verilog 2分频:从原理到代码实现 在数字电路设计中,2分频是一种常见的电路实现方式,可以将输入信号的频率减半。在FPGA设计中,我们可以利用Verilog语言快速实现2分频电路。本文将从原理出发,结合代码介绍FPGA实现2分频电路的方法。 原理及实现 2分频电路通常采

    2024年02月02日
    浏览(36)
  • 【FPGA Verilog开发实战指南】初识Verilog HDL-基础语法

    就是用代码来描述硬件结构 语言有VHDL与Verilog HDL Verilog HDL 是从C语言来的,学的快 ###例子 也叫保留字,一般是小写 module 表示模块的开始 endmodule 模块的结束 模块名 一般与.v文件的名字一致 输入信号 input 输出信号 output 既做输入也做输出 inout 需要一些变量和参数对输

    2024年02月21日
    浏览(34)
  • 【FPGA】Verilog:时序电路设计 | 二进制计数器 | 计数器 | 分频器 | 时序约束

    前言: 本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载 示例:计数器与分频器   ​​ 功能特性: 采用 Xilinx Artix-7 XC7A35T芯片  配置方式:USB-JTAG/SPI Flash 高达100MHz 的内部时钟速度  存储器:2Mbit SRAM   N25Q064A SPI Flash(样图旧款为N25Q032A) 通用

    2024年02月02日
    浏览(49)
  • Verilog基础:时序调度中的竞争(二)(创建分频时钟时,使用阻塞赋值)

    相关阅读 Verilog基础 https://blog.csdn.net/weixin_45791458/category_12263729.html?spm=1001.2014.3001.5482         作为一个硬件描述语言,Verilog HDL常常需要使用语句描述并行执行的电路,但其实在仿真器的底层,这些并行执行的语句是有先后顺序的,然而Verilog标准并没有将这些事件调度的

    2024年02月05日
    浏览(31)
  • 【FPGA】Verilog:编码器 | 实现 4 到 2 编码器

    0x00 编码器(Encoder) 编码器与解码器相反。当多台设备向计算机提供输入时,编码器会为每一个输入生成一个与设备相对应的信号,因此有多少比特就有多少输出,以数字形式表示输入的数量。 例如,如果有四个输入,就需要一个两位二进制数来表示 0 至 3,这样就有四个输

    2024年02月04日
    浏览(42)
  • FPGA设计开发(基础课题):分频器设计

    一、设计目的 1、掌握分频器的设计原理; 2、用HDL语言设计分频器。 二、设计原理 分频器与计数器类似,也是要对时钟脉冲进行计数,但其输出的不是对时钟脉冲个数的计数值,而是其频率与时钟的频率成固定比例关系的脉冲信号。整数分频是所有分频器中最简单,最容易

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

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

    2024年02月01日
    浏览(33)
  • Verilog编程:8线-3线优先编码器FPGA

    Verilog编程:8线-3线优先编码器FPGA 基于FPGA的数字电路设计是当前领域中的关键技术之一,因为这种设计具有高速、可编程、可重构等优点。在数字电路设计中,编码器是常见的模块,尤其是8线-3线优先编码器,可以实现将八个输入信号中最先出现的一个编码输出到三位二进制

    2024年02月08日
    浏览(25)
  • 【FPGA】Verilog 实践:优先级编码器 | Priority encoder

    0x00 优先级编码器(Priority encoder) \\\"能将多个二进制输入压缩成更少数目输出的电路或算法的编码器\\\" 优先级编码器是一种编码器,它考虑了两个或更多输入位同时变为 1 但没有收到输入的情况。当输入进来时,优先级编码器会按照优先级顺序进行处理。 通常,它按升序或降

    2024年01月18日
    浏览(45)
  • 【FPGA】Verilog 编码实现:与非门 | 或非门 | 异或门 | NAND/NOR/XOR 行为验证

    写在前面: 本章主要内容为了解和确认 NAND/NOR/XOR 门的行为,并使用Verilog实现,生成输入信号后通过模拟,验证每个门的操作,并使用 FPGA 来验证 Verilog 实现的电路的行为。 本章目录: Ⅰ. 前置知识 0x00 与非门(NAND) 0x01 或非门(NOR) 0x02 异或门(XOR) Ⅱ. 练习(Assignmen

    2024年02月03日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包