0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FPGA延时Verilog HDL实现

ZYNQ 来源:ZYNQ 2024-11-05 11:26 次阅读

本章节简介:

可以在任意时刻启动,可以重复启动,延时时长可调,单位可切换(ms/us),在50MHz时钟下的延时范围是1ms-85899ms/1us-85899us。

源代码和modelsim仿真代码:

moduledelay



//#(parameterN)//可以延时N*1ms/us



(inputclk,rst_n,

inputstart,//start上升沿有效

inputdelay_unit,//延时单位,high:ms/low:us

outputfinish,finish_pose);//finish上升沿有效

regstart_reg0,start_reg1;//start两级缓存,用于边沿检测

regfinish_reg0,finish_reg1;//finish两级缓存

reg[31:0]cnt;//固定32位宽计数

reg[31:0]cnt_full;

regrestart;//重新开始

wirestart_pose,full;

always@(posedgeclkornegedgerst_n)

begin

if(!rst_n)

begin

cnt<= 32'd0;

                   cnt_full <= 32'd10; //避免一开始finish置位

                   restart <= 1'b0;

                   start_reg0 <= 1'b0; start_reg1 <= 1'b0; 

                   finish_reg0 <= 1'b0; finish_reg1 <= 1'b0;

               end

           else

              begin

                  start_reg0 <= start; start_reg1 <= start_reg0;

                  finish_reg1 <= finish_reg0;  

                  /**检测计时单位**/

                  if(delay_unit)  

                     cnt_full <= 32'd50_000*2-32'd2;  //计时2ms  实际例化时用N代替: 32'd50_000*N-32'd2

                  else

                     cnt_full <= 32'd50*2-32'd2;      //计时2us

                 /***************/

                /**是否重新开始**/

                if(start_pose)  //检测到起始时刻 

                    restart <= 1'b1;  

               /****计时完成****/

               else if(full)  //延时结束

                  begin

                      cnt <= 32'd0;  //cnt归零

                      finish_reg0 <= 1'b1;  //finish响应

                      restart <= 1'b0;

                  end

             /***************/

             /****计时开始****/

             else if(restart) 

                begin

                    finish_reg0 <= 1'b0;    //新一轮延时finish复位

                    cnt <= cnt+1'b1;

                end

           /***************/

           /**等待新一轮计时**/

           else 

              begin

                  cnt <= cnt;

                  finish_reg0 <= finish_reg0;

                  restart <= restart;

              end

    end  

end

 

  assign start_pose = (~start_reg1&start_reg0)?1'b1:1'b0;  //start上升沿检测

  assign finish_pose = (~finish_reg1&finish_reg0)?1'b1:1'b0;  //finish上升沿检测

  assign full = (cnt_full-cnt==0)?1'b1:1'b0;   //检测是否计满



  assign finish = finish_reg0;



endmodule



/**************************************************************************************************/                                     /***************************************modelsim********************************************/  



`timescale 1ns/1ps

module delay_tb();

   reg clk,rst_n;

   reg start;

   wire finish,finish_pose;

  

  delay delay_u0

  (.clk(clk),

   .rst_n(rst_n),

   .start(start),

   .delay_unit(1'b1),

   .finish(finish),

   .finish_pose(finish_pose));

   //defparam delay_u0.N = 2; //延时2ms

  

  initial

    begin

clk = 1'b0;

        rst_n = 1'b0;

        start = 1'b0;

#1000 rst_n = 1'b1;

#4010 start = 1'b1;                                                                                                                                                                 #50     start = 1'b0;                                                                                                                                                            end



  always #10 clk = ~clk;

endmodule

思路:

start端口给上升沿启动延时,延时结束端口finish置位(重新启动延时后复位)、finish的上升沿检测在模块内部已做好(端口finish_pose),直接调用即可,端口delay_unit置高选择ms,置低选择us,#(参数N )“是计时时长,例如计时8ms:”N = 8, .delay_unit(1'b1)“,实际例化时只需”defparam 例化名.N = 数值”。因为modelsim无法识别这种调用,所以直接用数值代替N进行测试。边沿检测会消耗两个时钟周期,所以cnt_full需要减2,并且将finish_reg0直接连到finish输出端口而不是用finish_reg1连接完成。

延时2ms测试的起始时刻(5010ns)和结束时刻(2005010ns):

f525039a-98c2-11ef-a511-92fbcf53809c.pngf554772e-98c2-11ef-a511-92fbcf53809c.png

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1624

    文章

    21608

    浏览量

    601086
  • 仿真
    +关注

    关注

    50

    文章

    4015

    浏览量

    133317
  • Verilog
    +关注

    关注

    28

    文章

    1343

    浏览量

    109913
  • 代码
    +关注

    关注

    30

    文章

    4717

    浏览量

    68199

原文标题:FPGA延时 Verilog HDL 实现

文章出处:【微信号:ZYNQ,微信公众号:ZYNQ】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    [推荐]cpld\fpga\verilog hdl视频教程

    教程目录: 入门篇:第1讲、FPGA设计基础(PDF、视频)第2讲、FPGA设计入门(视频、课后习题)第3讲、VerilogHDL基础(PDF、视频、课后习题)第4讲:Verilog HDL
    发表于 03-09 22:56

    [下载]cpld\fpga\verilog hdl视频教程

      cpld\fpga\verilog hdl视频教程入门篇:第1讲、FPGA设计基础(PDF、视频)第2讲、FPGA设计入门(视
    发表于 03-26 16:37

    FPGA双沿发送之Verilog HDL实现 精选资料推荐

    1.1 FPGA双沿发送之Verilog HDL实现1.1.1 本节目录1)本节目录;2)本节引言;3)FPGA简介;4)
    发表于 07-26 06:20

    FPGA双沿采样之Verilog HDL实现 精选资料分享

    1.1 FPGA双沿采样之Verilog HDL实现1.1.1 本节目录1)本节目录;2)本节引言;3)FPGA简介;4)
    发表于 07-26 07:44

    FPGA的编译之二、Verilog HDL语言的FPGA快速

    This manual describes the Verilog portion of Synopsys FPGACompiler II / FPGA Express application
    发表于 07-23 10:01 79次下载

    基于Verilog HDL语言的FPGA设计

    采用 Verilog HDL 语言在Altera 公司的FPGA 芯片上实现了RISC_CPU 的关键部件状态控制器的设计,以及在与其它各种数字逻辑设计方法的比较下,显示出使用
    发表于 08-21 10:50 69次下载

    Verilog HDL语言在FPGA/CPLD开发中的应用

    摘 要:通过设计实例详细介绍了用Verilog HDL语言开发FPGA/CPLD的方法,并通过与其他各种输入方式的比较,显示出使用Verilog H
    发表于 06-20 11:51 1959次阅读
    <b class='flag-5'>Verilog</b> <b class='flag-5'>HDL</b>语言在<b class='flag-5'>FPGA</b>/CPLD开发中的应用

    Verilog HDL与VHDL及FPGA的比较分析

    Verilog HDL与VHDL及FPGA的比较分析. Verilog HDL优点:类似C语言,上手容易,灵活。大小写敏感。在写激励和建模方
    发表于 01-11 10:45 1347次阅读

    PLD/FPGA硬件语言设计verilog HDL

    在我国使用Verilog HDL的公司比使用VHDL的公司多。从EDA技术的发展上看,已出现用于CPLD/FPGA设计的硬件C语言编译软件,虽然还不成熟,应用极少,但它有可能会成为继VHDL和
    发表于 03-12 11:21 1768次阅读

    _Verilog_HDL的基本语法

    Verilog_HDL语言的学习,为FPGA编程打下坚实的基础
    发表于 05-19 16:40 12次下载

    基于FPGA Verilog-HDL语言的串口设计

    基于FPGA Verilog-HDL语言的串口设计
    发表于 02-16 00:08 35次下载

    Verilog HDL入门教程之Verilog HDL数字系统设计教程

    本文档的主要内容详细介绍的是Verilog HDL入门教程之Verilog HDL数字系统设计教程。
    发表于 09-20 15:51 83次下载
    <b class='flag-5'>Verilog</b> <b class='flag-5'>HDL</b>入门教程之<b class='flag-5'>Verilog</b> <b class='flag-5'>HDL</b>数字系统设计教程

    Verilog HDL作为现在最流行的FPGA开发语言 是入门的基础

    Verilog HDL作为现在最流行的FPGA开发语言,当然是入门基础。
    发表于 02-18 14:47 1w次阅读

    数字设计FPGA应用:Verilog HDL语言基本结构

    本课程以目前流行的Xilinx 7系列FPGA的开发为主线,全面讲解FPGA的原理及电路设计、Verilog HDL语言及VIVADO的应用,并循序渐进地从组合逻辑、时序逻辑的开发开始
    的头像 发表于 12-02 07:10 3139次阅读
    数字设计<b class='flag-5'>FPGA</b>应用:<b class='flag-5'>Verilog</b> <b class='flag-5'>HDL</b>语言基本结构

    Verilog HDL入门教程-Verilog HDL的基本语法

    Verilog HDL入门教程-Verilog HDL的基本语法
    发表于 01-07 09:23 176次下载