FPGA学习笔记:verilog基础代码与modelsim仿真(三)

这篇具有很好参考价值的文章主要介绍了FPGA学习笔记:verilog基础代码与modelsim仿真(三)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

FPGA学习笔记:verilog基础代码与modelsim仿真(三)

1. 分频器——偶分频

方法1:

分频器modelsim,fpga,fpga开发,学习
分频器modelsim,fpga,fpga开发,学习


verilog代码实现:
module divider_six(
    input wire  sys_clk     ,
    input wire  sys_rst_n   ,
    
    
    output  reg      clk_out       
    
     
     
 );
 
 reg    [1:0]   cnt ; //00 01 10
 wire   [1:0]   max_cnt = 2'd2;
 
always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        cnt <= 2'b0;
    else if(cnt == max_cnt)
        cnt <= 2'b0;
    else
        cnt <= 2'd1 + cnt;
        
always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        clk_out <= 1'b0;
    else if(cnt == max_cnt)
        clk_out <= ~clk_out;
    else
       clk_out <= clk_out;
       
  
 endmodule
 




modelsim仿真波形图:

分频器modelsim,fpga,fpga开发,学习




方法2(推荐):

比起方法一直接使用计数器定义一个新的时钟波形,方法二使用flag_out作为分频变量从而实现分频器的功能。虽然二者都使用了计数器,但方法二显然更符合“分频”的定义,且此方法在告诉电路中更加稳定,所以在实际分频应用中更推荐这种方法。

分频器modelsim,fpga,fpga开发,学习



verilog代码实现:
 module divider_six(
    input wire  sys_clk     ,
    input wire  sys_rst_n   ,
    
    
    output  reg      flag_out       
    
     
     
 );
 
 reg    [2:0]   cnt ; //00 01 10
 wire   [2:0]   max_cnt = 3'd5;
 
always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        cnt <= 3'b0;
    else if(cnt == max_cnt)
        cnt <= 3'b0;
    else
        cnt <= 3'd1 + cnt;
        
always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        flag_out <= 1'b0;
    else if(cnt == max_cnt -3'd1)
        flag_out <= 1'b1;
    else
       flag_out <= 1'b0;
       
  
 endmodule

仿真代码:
  `timescale 1ns/1ns
  module tb_divider_six();
  
  reg sys_clk;
  reg sys_rst_n;
  wire flag_out;
  
 
  initial
     begin
         sys_clk = 1'b1;
         sys_rst_n <= 1'b0;
         #20
         sys_rst_n <= 1'b1;
     end
  

 always #10 sys_clk = ~sys_clk; //clk frequency

 
 divider_six  divider_six_inst
 (
         .sys_clk  (sys_clk)   ,
         .sys_rst_n(sys_rst_n)   ,
         .flag_out  (flag_out) 
    
            
         
 );
     
 endmodule



modelsim仿真波形:

分频器modelsim,fpga,fpga开发,学习





2. 按键消抖


分频器modelsim,fpga,fpga开发,学习


分频器modelsim,fpga,fpga开发,学习



verilog代码实现:
 module key_filter
 
 #(
    parameter   CNT_MAX = 20'd999_999
 )
 
(
     input wire sys_clk     ,
     input wire sys_rst_n   ,
     input  wire key_in     ,
     
     output reg    key_flag    
   
     
 
     
     
 );
reg[19:0]   cnt_20ms     ;
always@(posedge sys_clk or  negedge sys_rst_n)

    if(sys_rst_n == 1'b0)
        cnt_20ms  <= 20'd0;
    else    if(key_in == 1'b1)
        cnt_20ms  <=  20'd0;
    else    if(cnt_20ms == CNT_MAX)
        cnt_20ms   <= cnt_20ms;
    else    
        cnt_20ms <= cnt_20ms + 20'd1;
        
always@(posedge sys_clk or  negedge sys_rst_n)

    if(sys_rst_n == 1'b0)
        key_flag  <=  1'b0;
    else    if(cnt_20ms == CNT_MAX - 1'd1)
        key_flag <=  1'd1;
    else
        key_flag <= 1'd0;
        
      
  
 endmodule
 

仿真代码:
  `timescale 1ns/1ns
  module tb_key_filter();
  
  reg sys_clk;
  reg sys_rst_n;
  reg  key_in;
  reg[7:0]  tb_cnt;
  wire key_flag;
  
 
  initial
     begin
         sys_clk = 1'b1;
         sys_rst_n <= 1'b0;
         #20
         sys_rst_n <= 1'b1;
     end
  
  

     
     
 always #10 sys_clk = ~sys_clk; //clk frequency

 always@(posedge  sys_clk   or negedge  sys_rst_n)
    if(sys_rst_n == 1'b0)
        tb_cnt  <=  8'd0;
    else if (tb_cnt == 8'd249)
        tb_cnt  <=  8'd0;
    else    
        tb_cnt  <=  tb_cnt + 8'd1;
 
 
 
 always@(posedge    sys_clk or negedge sys_rst_n)
        if(sys_rst_n == 1'b0)
            key_in  <= 1'b1;
        else if(((tb_cnt >=  8'd19) && (tb_cnt <= 8'd69))
                ||  ((tb_cnt >= 8'd149) &&(tb_cnt <= 8'd169)))
                key_in  <=  {$random} % 2 ;
        else  if (tb_cnt >= 8'd69 && tb_cnt <= 8'd149)
                key_in  <= 1'b0;
        else
                key_in  <=  1'b1;
                
 
 
 
 key_filter 
 #(
    .CNT_MAX(20'd24)
 )

 key_filter_inst
 (
         .sys_clk  (sys_clk)   ,
         .sys_rst_n(sys_rst_n)   ,
         .key_in(key_in)        ,
         .key_flag  (key_flag) 
    
            
         
 );
     
 endmodule



modelsim仿真波形:

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

到了这里,关于FPGA学习笔记:verilog基础代码与modelsim仿真(三)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • FPGA学习日记——verilog实现分频器

    主要思想是利用计数器实现分频器功能,其中按原理不同可分为分频和降频 一、先说分频。 1、第一种实现方式 输入信号为系统时钟50MHz,本例子先以偶数倍六分频为例实现分频的第一种方式:计数器对系统时钟的上升沿进行计数,最大计数M=5,即count取值范围为0~5,当计数

    2024年02月04日
    浏览(31)
  • 数字分频器设计(偶数分频、奇数分频、小数分频、半整数分频、状态机分频|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日
    浏览(36)
  • 数字分频器设计(偶数分频、奇数分频、小数分频、半整数分频、状态机分频|verilog代码|Testbench|仿真结果)

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

    2024年02月08日
    浏览(29)
  • FPGA_学习_04_Verilog基础语法和Modelsem仿真

    前言:对于以前学过C/C++/C#的作者来讲,Verilog的基础语法算是 特别简单 的。本文主要介绍Verilog的基础语法和Modelsem仿真。 FPGA开发是以模块为基础的,每个可 综合 的.v文件都是一个模块,模块由 module 和 endmodule 来声明。在这两个的内部,完成模块功能的实现。 在Vi

    2024年02月05日
    浏览(34)
  • 学习如何独立的使用Modelsim进行仿真验证?——编写verilog文件并查看仿真波形

    本篇记录如何独立的使用Modelsim进行仿真,便于之后查看。 Modelsim独立仿真的步骤: 创建工作文件夹——编译设计文件——导入及运行仿真——调试结果 具体的: 1、新建一个工程 指定工程名称、路径和默认库名称。一般情况下,设定Default Library Name默认库名称为work。 指定的

    2023年04月08日
    浏览(31)
  • 北邮22级信通院数电:Verilog-FPGA(3)实验“跑通第一个例程”modelsim仿真及遇到的问题汇总(持续更新中)

    北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 注意:本篇文章所有绝对路径的展示都来自上一篇博客 北邮22级信通院数

    2024年02月07日
    浏览(37)
  • FPGA【Verilog分频器】

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

    2024年02月20日
    浏览(33)
  • 【FPGA & Verilog】奇数分频器 (50%)

    2.1 设计输⼊ 1. 模块名称:FrequencyDivider 2. 输⼊输出:CLK、RSTn、CLK_15 2.2 引脚约束 1. 输⼊端 ⾃定义 2. 输出端 ⾃定义 2.3 设计要求 1. 输出时钟的周期是输⼊时钟的15倍(15分频器) 2. 分别实现 7/15 占空⽐和 50% 占空⽐两种分频⽅式 3. 使⽤RTL View分析电路的区别 2.4 电路仿真1.

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

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

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

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

    2024年02月08日
    浏览(29)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包