【FPGA/verilog -入门学习1】verlog中的BUFGCE,BUFGMUX原语

这篇具有很好参考价值的文章主要介绍了【FPGA/verilog -入门学习1】verlog中的BUFGCE,BUFGMUX原语。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考:(详解)BUFG,IBUFG,BUFGP,IBUFGDS等含义以及使用 - 知乎

FPGA资源介绍——时钟资源(二)_fpga时钟资源-CSDN博客

1,BUFGCE

带有时钟使能端的全局缓冲。它有一个输入I、一个使能端CE和一个输出端O。只有当BUFGCE的使能端CE有效(高电平)时,BUFGCE才有输出。

bufg原语,verilog &FPGA,fpga开发

作用:防止竞争冒险现象

使用方法

bufg原语,verilog &FPGA,fpga开发

vlg_design

/
//FPGA系统时钟100MHz
//系统每秒进行一次数据的采集与处理,每次维持10ms,其余时间空闲
//希望系统空闲时,关闭100MHz的工作时钟
//使用BUFGCE原语实现此功能
 
/
`timescale 1ns/1ps
module vlg_design(
    input clk,//100M
    input rest_n,
    output reg clk_10ms_en,
    output reg o_clk_out_1, //自己产生是能
    output  o_clk_out_2 // 使用原语
    );
    
`define Debug 
`ifdef  Debug
localparam CNT_1S_MAX             =  1_000_000 -1 ;  //10ms
localparam CNT_10MS_MAX         =  1_000    -1;   //10us
`else
localparam CNT_1S_MAX             =  100_000_000  -1  ;//1s
localparam CNT_10MS_MAX         =  1_000_000  -1    ; //10ms
`endif

reg [27:0]r_cnt_10ms;   
wire  r_clk_out_1;
wire  r_clk_out_2;
 
 //产生1s的计数
 always @(posedge clk) begin
    if(!rest_n) r_cnt_10ms <='b0;
    else if (r_cnt_10ms < CNT_1S_MAX)  
              r_cnt_10ms <= r_cnt_10ms + 1'b1;
         else r_cnt_10ms <='b0;  
 end 
 
 //10ms以下是能
always @(posedge clk) begin
    if(!rest_n)    clk_10ms_en <='b0;
    else if(r_cnt_10ms <= CNT_10MS_MAX) clk_10ms_en <=1'b1;
        else clk_10ms_en <='b0;
end    
    
 //10ms以下clk_out_1 按clk 输出
 always @(*) begin
    if(!rest_n) o_clk_out_1 <='b0;
    else if(clk_10ms_en) 
         o_clk_out_1 <= clk ;
         else o_clk_out_1 <= 'b0;
end 
 
 
//使用原语例化代码
   BUFGCE BUFGCE_inst (
      .O(r_clk_out_2),   // 1-bit output: Clock output
      .CE(clk_10ms_en), // 1-bit input: Clock enable input for I0
      .I(clk)    // 1-bit input: Primary clock
   );

assign o_clk_out_2 = r_clk_out_2;


endmodule

testbench_top


`timescale 1ns/1ps
module testbench_top();
    

//参数定义

`define CLK_PERIORD        10        //时钟周期设置为10ns(100MHz)    


//接口申明
    

reg clk;
reg rest_n;
wire clk_10ms_en;
wire o_clk_out_1;
wire o_clk_out_2;
 
 
    
vlg_design        uut_vlg_design(
    .clk(clk),
    .rest_n(rest_n),
    .clk_10ms_en(clk_10ms_en),
    .o_clk_out_1(o_clk_out_1),
    .o_clk_out_2(o_clk_out_2)
    );    
    
//时钟和复位初始化、复位产生 
initial begin
clk <= 0;
rest_n <= 0;
#10;
rest_n <= 1;
end

//时钟产生
always #(`CLK_PERIORD/2) clk = ~clk;    
    
 
//测试激励产生
initial begin

    @(posedge rest_n);    //等待复位完成
    @(posedge clk);
    #1_000_000_000;
    #1_000_000_000;
    $stop;
end

endmodule







仿真结果输出

对比发现:使用自己产生的是能造成了竞争冒险

bufg原语,verilog &amp;FPGA,fpga开发

2,BUFGMUX

BUFGMUX

全局时钟选择缓冲,它有I0和I1两个输入,一个控制端S,一个输出端O。当S为低电平时输出时钟为I0,反之为I1。需要指出的是BUFGMUX的应用十分灵活,I0和I1两个输入时钟甚至可以为异步关系。

bufg原语,verilog &amp;FPGA,fpga开发

作用:

BUFGMUX的主要作用包括:

  1. 数据缓冲:BUFGMUX可以管理输入和输出缓冲区,用于存储待传输的数据。它提供了读写操作,以便在缓冲区中存储和检索数据。
  2. 间隙管理:在高速数据传输中,数据传输速率可能不匹配,导致接收方无法立即处理所有接收到的数据。BUFGMUX可以管理这些间隙,通过插入空闲周期或等待周期来匹配发送和接收之间的速率。
  3. 流量控制:BUFGMUX可以与上层协议(如PCIe、Ethernet等)进行通信,以实现流量控制。它可以根据接收方的处理能力来调整发送速率,以避免接收方过载。

此外,BUFGMUX还可以用于构建文件存储和分发服务,实现文件共享功能,并作为应用开发的基础组件,帮助开发者快速构建文件存储功能等。

使用方法

bufg原语,verilog &amp;FPGA,fpga开发

vlg_design

/
/*FPGA系统时钟100MHz
FPGA系统快速时钟100MHz,慢速时钟1MHz
系统每秒进行一次数据的采集与处理,每次维持10ms,其余时间空闲
数据采集与处理时,FPGA工作在100MHz快时钟(10ms/s)
系统空闲时, FPGA工作在1MHz慢时钟(990ms/s)
使用Xilinx BUFGMUX原语实现此功能
编写Verilog代码
编写测试脚本,搭建仿真平台
运行仿真,查看波形

 */
/
`timescale 1ns/1ps
module vlg_design(
    input clk_in1,//100M
    input clk_in2,//1M
    input rest_n,
    output reg clk_10ms_en,
    output reg o_clk_out_1, //自己产生是能
    output  o_clk_out_2 // 使用原语
    );
    
`define Debug 
`ifdef  Debug
localparam CNT_1S_MAX             =  1_000_000 -1 ;  //10ms
localparam CNT_10MS_MAX         =  1_000    -1;   //10us
`else
localparam CNT_1S_MAX             =  100_000_000  -1  ;//1s
localparam CNT_10MS_MAX         =  1_000_000  -1    ; //10ms
`endif

reg [27:0]r_cnt_10ms;   
wire  r_clk_out_1;
wire  r_clk_out_2;
 
 //产生1s的计数
 always @(posedge clk_in1) begin
    if(!rest_n) r_cnt_10ms <='b0;
    else if (r_cnt_10ms < CNT_1S_MAX)  
              r_cnt_10ms <= r_cnt_10ms + 1'b1;
         else r_cnt_10ms <='b0;  
 end 
 
 //10ms以下是能
always @(posedge clk_in1) begin
    if(!rest_n)    clk_10ms_en <='b0;
    else if(r_cnt_10ms <= CNT_10MS_MAX) clk_10ms_en <=1'b1;
        else clk_10ms_en <='b0;
end    
    
 //10ms以下clk_out_1 按clk 输出
 always @(*) begin
    if(!rest_n) o_clk_out_1 <='b0;
    else if(clk_10ms_en) 
         o_clk_out_1 <= clk_in1 ;
         else o_clk_out_1 <= clk_in2;
end 
 
 
 
//使用原语例化代码
   BUFGMUX    BUFGMUX_inst (
      .O(o_clk_out_2),   // 1-bit output: Clock output
      .I0(clk_in2), // 1-bit input: Clock input (S=0) 低脉冲
      .I1(clk_in1), // 1-bit input: Clock input (S=1) 高脉冲
      .S(clk_10ms_en)    // 1-bit input: Clock select
   );

 


endmodule

testbench_top


`timescale 1ns/1ps
module testbench_top();
    

//参数定义

`define CLK_PERIORD        10        //时钟周期设置为10ns(100MHz)    


//接口申明
    
reg clk_in1;
reg clk_in2;
reg rest_n;
wire clk_10ms_en;
wire o_clk_out_1;
wire o_clk_out_2;
 
 
    
vlg_design        uut_vlg_design(
    .clk_in1(clk_in1),
    .clk_in2(clk_in2),
    .rest_n(rest_n),
    .clk_10ms_en(clk_10ms_en),
    .o_clk_out_1(o_clk_out_1),
    .o_clk_out_2(o_clk_out_2)
    );    
    
//时钟和复位初始化、复位产生 
initial begin
clk_in1 <= 0;
clk_in2 <= 0;
rest_n <= 0;
#10;
rest_n <= 1;
clk_in1 <= 1;
clk_in2 <= 1;
end

//时钟产生
always #(`CLK_PERIORD/2) clk_in1 = ~clk_in1;    
always #(`CLK_PERIORD*100/2) clk_in2 = ~clk_in2;    
    
 
//测试激励产生
initial begin

    @(posedge rest_n);    //等待复位完成
    @(posedge clk_in1);
    #1_000_000_000;
    #1_000_000_000;
    $stop;
end

endmodule

仿真结果输出

bufg原语,verilog &amp;FPGA,fpga开发

问题

bufg原语,verilog &amp;FPGA,fpga开发

使用原语例化的时候,

en=1,out 没有立刻等于in1.而是多等了半个in2 时钟

bufg原语,verilog &amp;FPGA,fpga开发

en =0时,out也没有立刻等于in2,而是多等了半个in1时钟文章来源地址https://www.toymoban.com/news/detail-833705.html

到了这里,关于【FPGA/verilog -入门学习1】verlog中的BUFGCE,BUFGMUX原语的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【FPGA/verilog -入门学习10】verilog 查表法实现正弦波形发生器

    用查找表设计实现一个正弦波形发生器 寻址的位宽是10位,数据量是1024个,输出的数据是16位 数据量是1024个: x = linspace(0,2*pi,1024) 输出数据是16位: y范围:0~2^16 -1 = 0~65535 y =( sin(x)+1)*65535/2 寻址的位宽是10位 输入是0~1023 1023 占用10位 操作步骤 1,使用matlab 生成数据,制作

    2024年02月05日
    浏览(69)
  • FPGA以太网入门(二)——ARP测试实验(基于紫光同创,含原语介绍)

    此篇为专栏《紫光同创FPGA开发笔记》的 第六篇 ,同时也是 FPGA 以太网入门 的 第二篇 ,记录我的学习 FPGA 的一些开发过程和心得感悟,刚接触 FPGA 的朋友们可以先去此博客 《FPGA零基础入门学习路线》来做最基础的扫盲。 本篇内容基于笔者实际开发过程和正点原子资料撰写

    2024年02月20日
    浏览(58)
  • FPGA/Verilog HDL/AC620零基础入门学习——第一个项目按键控制LED

    最近要考试了,所以我赶紧补习FPGA,我们用的是小梅哥的AC620开发板,软件是Quartus。推荐看这个视频教程:零基础轻松学习FPGA,小梅哥FPGA设计思想与验证方法视频教程 用按键控制LED灯的亮灭就是一个二选一多路器,两个IO,a、b,可以是高电平,也可以是低电平。 输入按键

    2024年02月05日
    浏览(57)
  • 【FPGA】设计一个简单CPU—Verlog实现

    目录 设计成果 CPU的简单介绍 CPU设计思路 Verlog实现 仿真验证 小结 先展示一下成果,目前的CPU设计较为简单,后续会加以优化。连接有指令存储器和数据存储器的CPU综合电路图如图1.1 图1.1(CPU综合电路图)   要设计一款简单的CPU,首先,我们要了解一个CPU的结构组成和工作

    2024年02月04日
    浏览(29)
  • Verilog语法(六)——常用原语及UDP

    在Verilog中,原语是一种用于建立数字电路的基本构建块。它们是预定义的逻辑功能,可以直接用于电路设计中,而无需进一步的描述或定义。 以下是几个常用的Verilog原语及其用法: AND原语 AND原语实现了逻辑与运算。它通常采用以下方式使用: 其中,out是输出信号,in1和

    2024年02月10日
    浏览(24)
  • 【FPGA】Verilog设计入门——时序模块及其Verilog表述

    目录 1.边沿触发型触发器及其Verilog表述 2.电平触发型锁存器及其Verilog表述  3.含异步复位/时钟使能型触发器及其Verilog表述 4.同步复位型触发器及其Verilog表述  5.异步复位型锁存器及其Verilog表述 6.Verilog的时钟过程表述的特点和规律   7.异步时序模块的Verilog表述  8.4位二进制

    2024年02月07日
    浏览(41)
  • FPGA时钟和原语

             大型设计一般推荐使用同步时序电路。同步时序电路基于时钟触发沿设计,对时钟的周期、占空比、延时和抖动提出了更高的要求. 为了满足同步时序设计的要求,一般在FPGA设计中采用全局时钟资源驱动设计的主时钟,以达到最低的时钟抖动和延迟.        

    2024年02月05日
    浏览(36)
  • 【FPGA入门】第一篇、Verilog基本语法常识

    目录 第一部分、不同的变量类型 1、wire和reg的区别  2、如何对变量进行赋值呢? 3、什么是阻塞?什么是非阻塞? 第二部分、变量位宽的定义 1、各种系统默认情况 2、变量位宽声明方式 3、表明位宽的情况下,赋值方式 4、两个模块之间例化,不定义变量直接用的方式 5、常

    2024年02月04日
    浏览(52)
  • FPGA中的流水线设计(含Verilog范例)

    在高速通信系统设计中,如何提高系统的工作速度至关重要,通常使用的方法有两种: 1. 并行方式设计:可减少模块间的延时; 2. 流水线设计:流水线设计如同生产线一样,将整个执行过程分解为若干个工作段,从流水线的起点连续输入,各操作段以重叠方式执行。使得运

    2023年04月21日
    浏览(35)
  • 【FPGA基础入门实践】Verilog 基本项目操作逐步演示

    0x00 回顾:AND/OR/NOT 逻辑的特性 AND: 与门可以具有两个或更多的输入,并返回一个输出。当所有输入值都为 1 时,输出值为 1。如果输入值中有任何一个为 0,则输出值为 0。 OR: 或门可以具有两个或更多的输入,并返回一个输出。如果输入值中至少有一个为 1,则输出值为

    2024年02月12日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包