Verilog语法之generate (for、 if、 case)用法

news2024/12/23 5:22:42

文章目录

  • 前言
  • 一、宏定义
  • 二、generate 方法
    • 1. generate-if 方法
    • 1. generate-case方法
  • 三、小知识(语法模板)


前言

对于同一功能多种不同实现方法的模块代码如何整合到一起呢?当然每种方法作为一个单独的模块使用一个.v 文件保存肯定是没有问题的,这个就不太便于后期的维护和使用。如果能将多种实现方法整合到一个模块保存在一个.v 文件,使用起来就更加的方便。方法肯定是有的,而且还不只一种。下面提供两种方式,宏定义法,和使用 generate -if 方法。

提示:以下是本篇文章正文内容,下面案例可供参考

一、宏定义

宏定义法相对比较好理解,通过不同的宏定义条件编译方式进行选择某种实现方式,实现的部分
代码如下。该种方法可通过修改模块代码的宏定义选择不同的方法,还算是比较方便的。

//`define AVERAGE //求平均法
//`define FORMULA //直接公式法
`define LUT //查找表法
module rgb2gray (
 clk,
 rst_n,
 rgb_valid,
 red_8b_i,
 green_8b_i,
 blue_8b_i,
 gray_8b_o,
 gray_valid
);
`ifdef AVERAGE //求平均法 GRAY=(R+B+G)/3=(R+B+G)*85)>>8
...//方法 1
`endif
`ifdef FORMULA //灰度转换公式 Gray = R*0.299+G*0.587+B*0.114
...//方法 2
`endif
`ifdef LUT//查找表方式
...//方法 3
`endif
endmodule

调用方法:
直接例化,使用哪个define将前面注释删除,其他define注释即可。

二、generate 方法

1. generate-if 方法

该种方式相对于宏定义条件编译来说更加方便,就是在模块被例化调用时,不管需要使用哪种方式都不需要去通过修改模块源代码方式去改变具体实现方法,直接在例化模块时就可通过重定义参数 PROC_METHOD 实现不同方法的设置。
模板如下:

   generate
      if (<condition>) begin: <label_1>
         <code>;
      end else if (<condition>) begin: <label_2>
         <code>;
      end else begin: <label_3>
         <code>;
      end
   endgenerate

代码如下(示例):

module rgb2gray
#(
 parameter PROC_METHOD = "AVERAGE" //"AVERAGE" :求平均法
 //or "FORMULA" :直接公式法
 //or "LUT" :查找表法
)
(
 clk,
 rst_n,
 rgb_valid,
 red_8b_i,
 green_8b_i,
 blue_8b_i,
 gray_8b_o,
 gray_valid
);
generate
 if (PROC_METHOD == "AVERAGE") begin: PROC_AVERAGE
//---------------------------------------------
//求平均法 GRAY = (R+B+G)/3=((R+B+G)*85)>>8
 //方法 1
//---------------------------------------------
 end
 else if (PROC_METHOD == "FORMULA") begin: PROC_FORMULA
//---------------------------------------------
//典型灰度转换公式 Gray = R*0.299+G*0.587+B*0.114=(R*77 + G*150 + B*29) >>8
 //方法 2
//---------------------------------------------
 end
 else if(PROC_METHOD == "LUT") begin: PROC_LUT
//---------------------------------------------
//查找表方式,可以省去公式法中乘法运算 Gray =(R*77 + G*150 + B*29) >>8,将 3 个分量乘以系数后的数值存储在 ROM 中
 //方法 3
//---------------------------------------------
 end
endgenerate
endmodule

调用方法:

 rgb2gray
 #(
 .PROC_METHOD("FORMULA") //"AVERAGE" :求平均法
 //or "FORMULA" :直接公式法
 //or "LUT" :查找表法
 )rgb2gray_average
 (
 .clk (clk ),
 . reset_p (reset_p ),
 .rgb_valid (rgb_valid ),
 .red_8b_i (red_8b_i ),
 .green_8b_i(green_8b_i),
 .blue_8b_i (blue_8b_i ),
 .gray_8b_o (gray_8b_o ),
 .gray_valid(gray_valid)
 );

1. generate-case方法

generate case和generate if作用上是差不多的,都是用于选择性综合电路,区别就是if语句和case语句的区别,如果你会用其中一个,那另一个也很简单,模板如下:

   generate
      case (<constant_expression>)
         <value>: begin: <label_1>
                     <code>
                  end
         <value>: begin: <label_2>
                     <code>
                  end
         default: begin: <label_3>
                     <code>
                  end
      endcase
   endgenerate

代码如下(示例):

module rgb2gray
#(
 parameter PROC_METHOD = "AVERAGE" //"AVERAGE" :求平均法
 //or "FORMULA" :直接公式法
 //or "LUT" :查找表法
)
(
 clk,
 rst_n,
 rgb_valid,
 red_8b_i,
 green_8b_i,
 blue_8b_i,
 gray_8b_o,
 gray_valid
);
generate
 case (PROC_METHOD )
    "AVERAGE": begin: PROC_AVERAGE
				//---------------------------------------------
				//求平均法 GRAY = (R+B+G)/3=((R+B+G)*85)>>8
				 //方法 1
				//---------------------------------------------
 				end
      "FORMULA"):begin: PROC_FORMULA
				//---------------------------------------------
				//典型灰度转换公式 Gray = R*0.299+G*0.587+B*0.114=(R*77 + G*150 + B*29) >>8
				 //方法 2
				//---------------------------------------------
				 end
       "LUT" :begin: PROC_LUT
				//---------------------------------------------
				//查找表方式,可以省去公式法中乘法运算 Gray =(R*77 + G*150 + B*29) >>8,将 3 个分量乘以系数后的数值存储在 ROM 中
				 //方法 3
				//---------------------------------------------
 				end
 endcase
endgenerate
endmodule

三、小知识(语法模板)

如果你是一个基于xilinx的开发者,可以使用vivado自带的语法模板:

1)打开语法模板
1
(2)搜索generate:
2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/514712.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL 高级(进阶) SQL 语句二

一、表连接查询 MYSQL数据库中的三种连接&#xff1a; inner join(内连接)&#xff1a;只返回两个表中联结字段相等的行&#xff08;有交集的值&#xff09;left join(左连接)&#xff1a;返回包括左表中的所有记录和右表中联结字段相等的记录right join(右连接)&#xff1a;…

区间合并(算法)

目录 题目代码实现注意点 题目 给定 n n n 个区间 [ l i , r i ] [l_i, r_i] [li​,ri​]&#xff0c;要求合并所有有交集的区间。 注意如果在端点处相交&#xff0c;也算有交集。 输出合并完成后的区间个数。 例如&#xff1a; [ 1 , 3 ] [1,3] [1,3] 和 [ 2 , 6 ] [2,…

【利用AI让知识体系化】深入浅出HTTP(近2w字)

思维导图 文章目录 思维导图1. HTTP基础知识HTTP简介URI和URLHTTP的请求和响应 2. HTTP请求请求方法请求头请求体 3. HTTP响应响应状态码响应头响应体 4. Cookies和SessionCookies的原理和应用Session机制使用Cookies和Session进行用户认证 5. HTTP缓存缓存概述浏览器缓存服务器…

Tomcat源码:连接器与Executor、Connector

前文&#xff1a; 《Tomcat源码&#xff1a;启动类Bootstrap与Catalina的加载》 《Tomcat源码&#xff1a;容器的生命周期管理与事件监听》 《Tomcat源码&#xff1a;StandardServer与StandardService》 《Tomcat源码&#xff1a;Container接口》 《Tomcat源码&#xff1a…

NHWC和NCHW数据排布及转换(模型部署)

1.概念 首先这是两种批量图片的数据存储方式&#xff0c;定义了一批图片在计算机存储空间内的数据存储layout。N表示这批图片的数量&#xff0c;C表示每张图片所包含的通道数&#xff0c;H表示这批图片的像素高度&#xff0c;W表示这批图片的像素宽度。其中C表示的通道数可能有…

被热议的DataOps,到底是什么?

近几年&#xff0c;DevOps的火热程度日渐高涨&#xff0c;同时涌现出了各种Ops&#xff0c;包括DevSecOps、GitOps、AIOps、NoOps、DataOps、MLOps、FeatureOps、ModelOps、FinOps等等。其中&#xff0c;对于企业来说&#xff0c;确保数据以高效和合规的方式使用&#xff0c;Da…

git commit 设置 eslint + pretter 格式化校验

系统版本 node 版本: v14.17.5 npm 版本: 6.14.14 vue-cli 版本: vue/cli 4.5.19 目录 系统版本 1. 新建一个 vue2.X 空项目 2. 安装插件 eslint ,并初始化 eslint 配置,根目录生成 .eslintrc 配置文件 3. 测试 eslint 配置 4. 安装 husky、lint-staged 5. 在package.j…

【Linux从入门到精通】了解冯诺依曼体系结构

本片文章会对冯诺依曼体系结构进行详解。同时&#xff0c;我们对冯诺依曼的理解&#xff0c;不能停留在概念上&#xff0c;要深入到对软件数据流理解上。本片文章同时也会对数据在冯诺依曼结构上的交互进行讲解。希望本篇文章会对你有所所帮助。 文章目录 一、简单认识冯诺依曼…

牛客网面试必刷:BM17 二分查找-I

牛客网面试必刷&#xff1a;BM17 二分查找-I 前言一、什么是二分查找&#xff1f;二、二分查找具体代码1.第一种写法&#xff1a;left < right2.第二种写法&#xff1a;left < right 三、复杂度分析 前言 二分查找是一个常见、基础、难度较低问题&#xff0c;本文记录了…

【JMeter入门】—— JMeter介绍

1、什么是JMeter Apache JMeter是Apache组织开发的基于Java的压力测试工具&#xff0c;用于对软件做压力测试。它最初被设计用于Web应用测试&#xff0c;但后来扩展到其他测试领域。 &#xff08;Apache JMeter是100%纯JAVA桌面应用程序&#xff09;Apache JMeter可以用于对静…

linux系统挂载硬盘

linux系统挂载硬盘 1、背景2、环境3、准备工作4、挂载分区4.1、查看分区信息4.2、创建分区4.3、设置分区格式4.4、创建挂载目录4.5、挂载分区4.6、设置开机自动挂载4.7、验证是否挂载成功 1、背景 日常使用过程中随着系统业务量的新增对磁盘的空间和性能提出了更高的要求&…

功能测试之设计语言测试:功能测试包含哪些测试?分别有什么作用

Web 设计语言版本的差异可以引起客户端或服务器端严重的问题&#xff0c;例如使用哪种版本的HTML 等。当在分布式环境中开发时&#xff0c;开发人员都不在一起&#xff0c;这个问题就显得尤为重要。除了HTML 的版本问题外&#xff0c;不同的脚本语言&#xff0c;例如Java、Java…

按照这6步学习测试,月薪不过万,我给你介绍测试工作

上周一刚入职不久&#xff0c;是在上海的一家软件公司&#xff0c;税前11K&#xff0c;五险一金&#xff0c;996的工作制&#xff0c;已经上班了一个月&#xff0c;说下自己的感受。 因为我专科毕业4年&#xff0c;之前一直在做电商运营&#xff0c;大专学的专业是电子商务&am…

Linux上Nacos基本使用:连接MySQL并修改密码、启动、停止命令等

Nacos如何连接MySQL并修改密码 说明如何将内嵌数据库Derby切换为MySQL数据库直接新建MySQL数据库: 必须是MySQL5.7及以上 如何修改密码启动、停止命令 说明 nacos默认&#xff1a; 使用内嵌的数据库&#xff08;Derby&#xff09;默认登录地址 ip:8848/nacos; 账号&#xff1…

Flutter组件——Getx入门01

前言 最近要正式开始写一个flutter项目了&#xff0c;我在浏览flutter如何进行框架设计的时候突然看到了一篇关于如何管理flutter状态的文章。flutter中的状态管理并不是很好理解&#xff0c;但是你需要在页面之间传值或者改变组件中的某个值的时候就必须更改状态。当我在这篇…

C生万物 | 字符串函数与内存函数解读【附英译中图解】

文章目录 求字符串长度一、strlen() 长度不受限制的字符串函数一、strcpy()二、strcat()三、strcmp() 长度受限制的字符串函数一、引入二、strncpy()三、strncat()四、strncmp() 字符串查找函数一、strstr()二、strtok() 错误信息报告函数一、strerror() 字符操作函数内存操作函…

从“能用”到“好用”:它的出现,解决你80%的转型困境【内含免费试用附教程】

免费试用地址&#xff1a;引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构引迈信息&#xff0c;提供快速开发平台、快速开发框架、低代码开发平台、低代码开发框架、0代码开发平台、0代码开发框架、零代码开发平台、零代码开发…

战略投资奥琦玮,微盟冲在餐饮复苏最前线

作者 | 辰纹 来源 | 洞见新研社 好起来了&#xff0c;一切都好起来了。 刚刚过去的五一假期&#xff0c;广州费大厨正佳广场店每天取号1000多桌&#xff0c;餐厅翻台率达到了1200%&#xff1b;长沙文和友单日最高排号超过1万&#xff0c;到店人数近6万&#xff1b;武汉主力龙…

OpenGL高级-帧缓冲

效果展示 知识点 颜色缓冲记录帧的颜色值&#xff0c;深度缓冲记录深度信息&#xff0c;模板缓冲允许我们基于一些条件丢弃指定片段。这几种缓冲结合起来叫做帧缓冲(FrameBuffer)&#xff0c;它被储存于内存中。  OpenGL给了我们自己定义帧缓冲的自由&#xff0c;我们可以选择…

Linux网络——shell脚本之正则表达式

Linux网络——shell脚本之正则表达式 一、概述二、基本的正则表达式三、实践操作1.匹配输出规定的电话号码2.匹配规定格式的邮箱 一、概述 正则表达式是对字符串操作的一种逻辑公式&#xff0c;就是用事先定义好的一些特定字符、及这些特定字符的组合&#xff0c;组成一个“规则…