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

什么是好的FPGA编码风格?(2)--多参考设计软件的语言模板(Language Templates)

什么是语言模板?

        不论是Xilinx的Vivado,还是Altera的Quartus II,都为开发者提供了一系列Verilog、SystemVerilog、VHDL、TCL、原语、XDC约束等相关的语言模板(Language Templates)。

        在Vivado软件中,按顺序点击Tools----Language Templates,即可打开设计模板界面。

        在Quartus II软件中,需要设计文件(.v文件等)的需要处点击右键,然后点击Inset Templates,即可打开模板界面。

设计模板有什么用?

        语言模板的内容还是非常丰富的,比如你可以看看xilinx推荐的文件头是什么样的:


// Company: <Company Name>
// Engineer: <Engineer Name>
//
// Create Date: <date>
// Design Name: <name_of_top-level_design>
// Module Name: <name_of_this_module>
// Target Device: <target device>
// Tool versions: <tool_versions>
// Description:
//    <Description here>
// Dependencies:
//    <Dependencies here>
// Revision:
//    <Code_revision_information>
// Additional Comments:
//    <Additional_comments>

         

        学一学(或者重温下)Verilog语法(逻辑运算符):

// The following logical operators are used in conditional TRUE/FALSE statements
// such as an if statement in order to specify the condition for the operation.
//
//    ! .... Not True
//    && ... Both Inputs True
//    || ... Either Input True
//    == ... Inputs Equal
//    === .. Inputs Equal including X and Z (simulation only)
//    != ... Inputs Not Equal
//    !== .. Inputs Not Equal including X and Z (simulation only)
//    < .... Less-than
//    <= ... Less-than or Equal
//    > .... Greater-than
//    >= ... Greater-than or Equal

        找不到原语使用方式的时候,也可以来这里查找(当然你也可以查xilinx的官方文档):

        有些时序约束语法不太好记,你可以用这个工具查找,比如:

# Set two clocks as asynchronous
set_clock_groups -asynchronous -group <clock_name_1> -group <clock_name_2>

        看看xililnx提供的宏XPM(Xilinx Parameterized Macro)是怎么用的,比如CDC这部分的:

   // xpm_cdc_async_rst: Asynchronous Reset Synchronizer// Xilinx Parameterized Macro, version 2023.2xpm_cdc_async_rst #(.DEST_SYNC_FF(4),    // DECIMAL; range: 2-10.INIT_SYNC_FF(0),    // DECIMAL; 0=disable simulation init values, 1=enable simulation init values.RST_ACTIVE_HIGH(0)  // DECIMAL; 0=active low reset, 1=active high reset)xpm_cdc_async_rst_inst (.dest_arst(dest_arst), // 1-bit output: src_arst asynchronous reset signal synchronized to destination// clock domain. This output is registered. NOTE: Signal asserts asynchronously// but deasserts synchronously to dest_clk. Width of the reset signal is at least// (DEST_SYNC_FF*dest_clk) period..dest_clk(dest_clk),   // 1-bit input: Destination clock..src_arst(src_arst)    // 1-bit input: Source asynchronous reset signal.);// End of xpm_cdc_async_rst_inst instantiation

        最最重要的一点是,它提供了很多典型电路的设计方法。

        由于各家FPGA的结构差异,可能相同的代码在不同的器件上生成的结构会存在很大差异。比如有时候,可能你想设计的是一个分布式DRAM,但是由于你的代码风格和综合工具的原因,它给你生成的事BRAM,那这样就和你的设计初衷相违背了(当然随着综合工具的发展,这类情况是越来越少了)。所以在设计相关电路时,请尽量参考xilinx提供的代码,以确保vivado能正确生成你想要的电路(Altera 的FPGA类似)。

parameter RAM_WIDTH = <ram_width>;parameter RAM_ADDR_BITS = <ram_addr_bits>;(* ram_style="distributed" *)reg [RAM_WIDTH-1:0] <ram_name> [(2**RAM_ADDR_BITS)-1:0];wire [RAM_WIDTH-1:0] <output_data>;<reg_or_wire> [RAM_ADDR_BITS-1:0] <read_address>, <write_address>;<reg_or_wire> [RAM_WIDTH-1:0] <input_data>;always @(posedge <clock>)if (<write_enable>)<ram_name>[<write_address>] <= <input_data>;assign <output_data> = <ram_name>[<read_address>];

总结

  • 语言模板可以学习HDL语言语法、综合属性等
  • 语言模板可以快速查找设计内容、模板
  • 语言模板提供的电路设计模板可以保证综合工具能正确推断出对应的电路


  • 📣您有任何问题,都可以在评论区和我交流📃!
  • 📣本文由 孤独的单刀 原创,首发于CSDN平台🐵,博客主页:wuzhikai.blog.csdn.net
  • 📣您的支持是我持续创作的最大动力!如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐!

  

相关文章:

  • 一文让你深入了解JavaSE的知识点
  • docker start一个容器之后,怎么进入这个容器界面
  • 米贸搜|Facebook海外企业户怎么引流到line上
  • 【开源视频联动物联网平台】视频接入网关的用法
  • Java第二十章多线程
  • Android自动化测试中使用ADB进行网络状态管理!
  • 游戏缺少d3dx9_43.dll修复方法分享,快速解决dll缺失问题
  • 浅学指针(3)
  • 宏定义中 ## 和 # 的作用
  • 中国信息通信研究院产业与规划研究所校招一面、二面内容
  • ChatGPT生成的一些有趣的文件管理用python小程序
  • Vue框架学习笔记——计算属性
  • 数据结构 | 二叉树的概念及前中后序遍历
  • 鸿蒙开发学习——应用程序框架
  • 增强静态数据的安全性
  • Brief introduction of how to 'Call, Apply and Bind'
  • HashMap剖析之内部结构
  • Java小白进阶笔记(3)-初级面向对象
  • JAVA之继承和多态
  • Kibana配置logstash,报表一体化
  • Laravel5.4 Queues队列学习
  • Linux中的硬链接与软链接
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Tornado学习笔记(1)
  • Vue实战(四)登录/注册页的实现
  • Webpack 4 学习01(基础配置)
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 判断客户端类型,Android,iOS,PC
  • 如何进阶一名有竞争力的程序员?
  • 首页查询功能的一次实现过程
  • 运行时添加log4j2的appender
  • nb
  • 说说我为什么看好Spring Cloud Alibaba
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​secrets --- 生成管理密码的安全随机数​
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #{} 和 ${}区别
  • #include
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • $().each和$.each的区别
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • $.each()与$(selector).each()
  • (1)Android开发优化---------UI优化
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • ./configure,make,make install的作用(转)
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET 8.0 中有哪些新的变化?
  • .NET NPOI导出Excel详解
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET 回调、接口回调、 委托