当前位置: 首页 > news >正文

verilog语法进阶,时钟原语

概述:

内容

1. 时钟缓冲

2. 输入时钟缓冲

3. ODDR2作为输出时钟缓冲

1. 输入时钟缓冲 BUFGP

verilog c代码,clk作为触发器的边沿触发,会自动将clk综合成时钟信号。

module primitive1(input clk,input a,output reg y);
always @ (posedge clk)y <= a;endmodule

verilog原语代码


module primitive1 (clk, a, y
);input clk;input a;output y;wire a_IBUF_1;wire clk_BUFGP_3;wire y_OBUF_5;FD   y_1 (.C(clk_BUFGP_3),.D(a_IBUF_1),.Q(y_OBUF_5));IBUF   a_IBUF (.I(a),.O(a_IBUF_1));OBUF   y_OBUF (.I(y_OBUF_5),.O(y));BUFGP   clk_BUFGP (.I(clk),.O(clk_BUFGP_3));
endmodule

时钟信号可以去驱动触发器,时钟信号需要走时钟线路,通过一个BUFGP或者IBUFG进入时钟线路。通过时钟缓冲后,就可以去驱动触发器FD的时钟.C端口了。

RTL结构图,这是一个简单的时钟驱动触发器fd的示例

技术原理图

2. 输入时钟缓冲 IBUFG

原语代码


module primitive1 (clk, a, y
);input clk;input a;output y;wire a_IBUF_1;wire clk_BUFGP_3;wire y_OBUF_5;FD   y_1 (.C(clk_BUFGP_3),.D(a_IBUF_1),.Q(y_OBUF_5));IBUF   a_IBUF (.I(a),.O(a_IBUF_1));OBUF   y_OBUF (.I(y_OBUF_5),.O(y));IBUFG  clk_BUFGP (.I(clk),.O(clk_BUFGP_3));
endmodule

技术原理图,在输入端口除了可以用BUFGP外,还可以使用IBUFG

3. 输出时钟缓冲 ODDR2

ODDR2的工作原理

代码

module primitive1(input clk,output clk_o);ODDR2 #(.DDR_ALIGNMENT("NONE"), // Sets output alignment to "NONE", "C0" or "C1" .INIT(1'b0),    // Sets initial state of the Q output to 1'b0 or 1'b1.SRTYPE("SYNC") // Specifies "SYNC" or "ASYNC" set/reset) ODDR2_inst (.Q(clk_o),   // 1-bit DDR output data.C0(clk),   // 1-bit clock input.C1(~clk),   // 1-bit clock input.CE(1'b1), // 1-bit clock enable input.D0(1'b1), // 1-bit data input (associated with C0).D1(1'b0), // 1-bit data input (associated with C1).R(1'b0),   // 1-bit reset input.S(1'b0)    // 1-bit set input);endmodule

原语代码,使用GND原语产生一个地线,使用VCC原语产生一个电源线,用于绑定固定点位输入端口。ODDR2有两个输入数据端口,两个时钟端口,时钟端口有180度相位差。时钟同时作为选择器输入端口,分别将两个触发器的输出选择输出出去。在输出端口就可以看到双速率输出的数据,这里把双速率输出的数据作为方波时钟使用。


module primitive1 (clk, clk_o
);input clk;output clk_o;wire N0;wire N1;wire ODDR2_inst_not0000;wire clk_BUFGP_4;wire clk_o_OBUF_6;GND   XST_GND (.G(N0));VCC   XST_VCC (.P(N1));ODDR2 #(.DDR_ALIGNMENT ( "NONE" ),.SRTYPE ( "SYNC" ),.INIT ( 1'b0 ))ODDR2_inst (.D0(N1),.D1(N0),.C0(clk_BUFGP_4),.C1(ODDR2_inst_not0000),.CE(N1),.R(N0),.S(N0),.Q(clk_o_OBUF_6));OBUF   clk_o_OBUF (.I(clk_o_OBUF_6),.O(clk_o));BUFGP   clk_BUFGP (.I(clk),.O(clk_BUFGP_4));INV   ODDR2_inst_not00001_INV_0 (.I(clk_BUFGP_4),.O(ODDR2_inst_not0000));
endmodule

RTL结构图,使用了一个ODDR2原语模块。

技术原理图

4. 总结

1. 时钟原语包含输入时钟原语与输出时钟原语,其中输出时钟原语使用ODDR2作为输出,官方说这个性能更加优越

2. 时钟用于驱动触发器的时钟,他需要走专门的时钟线,通过时钟缓冲输入到时钟线中。

http://www.lryc.cn/news/261427.html

相关文章:

  • 案例069:基于微信小程序的计算机实验室排课与查询系统
  • C语言:将三个数从大到小输出
  • 基于Hadoop的铁路货运大数据平台设计与应用
  • Java基础题2:类和对象
  • 冒泡排序学习
  • LeetCode(65)LRU 缓存【链表】【中等】
  • 网站提示“不安全”
  • 【Linux】驱动
  • Java研学-HTML
  • SpringBoot之响应的详细解析
  • redis:四、双写一致性的原理和解决方案(延时双删、分布式锁、异步通知MQ/canal)、面试回答模板
  • 智能优化算法应用:基于动物迁徙算法3D无线传感器网络(WSN)覆盖优化 - 附代码
  • illuminate/database 使用 五
  • 武汉灰京文化:益智游戏的教育与娱乐完美结合
  • arcgis api for js 中的query实现数据查询
  • AcWing 1250. 格子游戏(并查集)
  • CSS对文本的简单修饰
  • C++17中if和switch语句的新特性
  • 极坐标下的牛拉法潮流计算57节点MATLAB程序
  • 软件设计师——计算机网络(三)
  • 【ArkTS】循环控制与List的使用
  • 条款3:尽量使用const
  • Chromadb词向量数据库总结
  • Gin之GORM 操作数据库(MySQL)
  • 二十七、读写文件
  • flutter 代码混淆
  • 05 Vue中常用的指令
  • Mr. Cappuccino的第67杯咖啡——MacOS通过PD安装Win11
  • 【云原生kubernets】Service 的功能与应用
  • docker安装Prometheus