Verilog中条件编译的使用(`ifdef-`elsif-`else-`endif)

这篇具有很好参考价值的文章主要介绍了Verilog中条件编译的使用(`ifdef-`elsif-`else-`endif)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Verilog中条件编译的使用(`ifdef、`elsif、`else、`endif)


  在Verilog程序的编写过程中,有一个疑问:在模块内部的程序编写时,我们可以用if-else if-else的语句进行判断在哪个条件下执行哪个操作,那么,对于模块的输入输出端口,是否有办法利用某个条件控制其输出或者是不输出呢?但是,if-else语句只可在谋爱内部代码的编写使用,于是,学习了 `ifdef- `elsif- `endif的条件编译语句

一、 概念

  一般情况下,Verilog HDL程序中,所有的程序都会参与编译。但是有时我们希望对其中的部分内容只有在条件满足时才进行编译,也就是对一部分的内容指定编译的条件,这就是“条件编译”。

二、格式

  条件编译的格式与条件语句的格式大致上是一致的,其格式如下所示。

2.1条件编译格式

`ifdef 宏名(标识符)
	程序段1
`elsif
	程序段2
`else
	程序段3
`endif

2.2条件语句

if(条件1)
	程序段1
else if(条件2)
	程序段2
else
	程序段3

三、应用示例

3.1顶层代码

  假如要将Data_Number个位宽为Data_Width并行输入的数据组合成一个数值,那么在这里数值的个数Data_Number是不确定的,我们可以设置一个控制信号来控制数据输入的个数,在这里用宏定义进行控制,具体代码如下。

`define		Data_Number_8		// or `define		Data_Number_16

module data_convert
#(
	parameter	Data_Width  = 8  ,
	parameter	Data_Number = 16 
)
(	
	input						clk,
	input						rst_n,
	input						start,
	`ifdef Data_Number_8
	input	[Data_Width-1:0]	data_1  ,
	input	[Data_Width-1:0]	data_2  ,
	input	[Data_Width-1:0]	data_3  ,
	input	[Data_Width-1:0]	data_4  ,
	input	[Data_Width-1:0]	data_5  ,
	input	[Data_Width-1:0]	data_6  ,
	input	[Data_Width-1:0]	data_7  ,
	input	[Data_Width-1:0]	data_8  ,
	`elsif Data_Number_16
	input	[Data_Width-1:0]	data_1  ,
	input	[Data_Width-1:0]	data_2  ,
	input	[Data_Width-1:0]	data_3  ,
	input	[Data_Width-1:0]	data_4  ,
	input	[Data_Width-1:0]	data_5  ,
	input	[Data_Width-1:0]	data_6  ,
	input	[Data_Width-1:0]	data_7  ,
	input	[Data_Width-1:0]	data_8  ,
	input	[Data_Width-1:0]	data_9  ,
	input	[Data_Width-1:0]	data_10 ,
	input	[Data_Width-1:0]	data_11 ,
	input	[Data_Width-1:0]	data_12 ,
	input	[Data_Width-1:0]	data_13 ,
	input	[Data_Width-1:0]	data_14 ,
	input	[Data_Width-1:0]	data_15 ,
	input	[Data_Width-1:0]	data_16 ,
	`endif
	
	output	[Data_Number*Data_Width-1:0]	data_out
);

reg		[Data_Number*Data_Width-1:0]	data_out_reg;


always @(posedge clk or negedge rst_n)
	if(!rst_n)
		data_out_reg <= 0;
	else if(start)begin
		`ifdef Data_Number_8
		data_out_reg[1  *Data_Width-1-:Data_Width] <= data_1  ;
		data_out_reg[2  *Data_Width-1-:Data_Width] <= data_2  ;
		data_out_reg[3  *Data_Width-1-:Data_Width] <= data_3  ;
		data_out_reg[4  *Data_Width-1-:Data_Width] <= data_4  ;
		data_out_reg[5  *Data_Width-1-:Data_Width] <= data_5  ;
		data_out_reg[6  *Data_Width-1-:Data_Width] <= data_6  ;
		data_out_reg[7  *Data_Width-1-:Data_Width] <= data_7  ;
		data_out_reg[8  *Data_Width-1-:Data_Width] <= data_8  ;		
		
		`elsif Data_Number_16
		data_out_reg[1  *Data_Width-1-:Data_Width] <= data_1  ;
		data_out_reg[2  *Data_Width-1-:Data_Width] <= data_2  ;
		data_out_reg[3  *Data_Width-1-:Data_Width] <= data_3  ;
		data_out_reg[4  *Data_Width-1-:Data_Width] <= data_4  ;
		data_out_reg[5  *Data_Width-1-:Data_Width] <= data_5  ;
		data_out_reg[6  *Data_Width-1-:Data_Width] <= data_6  ;
		data_out_reg[7  *Data_Width-1-:Data_Width] <= data_7  ;
		data_out_reg[8  *Data_Width-1-:Data_Width] <= data_8  ;
		data_out_reg[9  *Data_Width-1-:Data_Width] <= data_9  ;
		data_out_reg[10 *Data_Width-1-:Data_Width] <= data_10 ;
		data_out_reg[11 *Data_Width-1-:Data_Width] <= data_11 ;
		data_out_reg[12 *Data_Width-1-:Data_Width] <= data_12 ;
		data_out_reg[13 *Data_Width-1-:Data_Width] <= data_13 ;
		data_out_reg[14 *Data_Width-1-:Data_Width] <= data_14 ;
		data_out_reg[15 *Data_Width-1-:Data_Width] <= data_15 ;
		data_out_reg[16 *Data_Width-1-:Data_Width] <= data_16 ;		

		`endif
	end

assign		data_out = data_out_reg;

endmodule

3.2Test Bench

`timescale 1ns/1ps
`define		Data_Number_8		// or `define		Data_Number_16

module tb_data_convert();
parameter	Data_Width  = 8  ;
parameter	Data_Number = 8 ;   // 如果要修改为16个数,则这里也需要修改
reg		clk,rst_n,start;
reg		[Data_Width-1:0]	data_1,data_2,data_3,data_4,data_5,data_6,data_7,data_8,data_9,data_10,data_11,data_12,data_13,data_14,data_15,data_16;
wire	[Data_Number*Data_Width-1:0]	data_out;

initial begin
	clk = 1;
	start <= 0;
	rst_n = 0;
	
	data_1  <= 'd1 ;
	data_2  <= 'd2 ;
	data_3  <= 'd3 ;
	data_4  <= 'd4 ;
	data_5  <= 'd5 ;
	data_6  <= 'd6 ;
	data_7  <= 'd7 ;
	data_8  <= 'd8 ;
    data_9  <= 'd9 ;
    data_10 <= 'd10;
    data_11 <= 'd11;
    data_12 <= 'd12;
    data_13 <= 'd13;
    data_14 <= 'd14;
    data_15 <= 'd15;
    data_16 <= 'd16;
	
	#20
	rst_n = 1;
	#40
	start <= 1;
	
end

always #10 clk = ~clk;

data_convert
#(
	.Data_Width (Data_Width ),
	.Data_Number(Data_Number) 
)
data_convert_inst
(	
	.clk	(clk	),
	.rst_n	(rst_n	),
	.start	(start	),
	`ifdef Data_Number_8
	.data_1  (data_1  ),
	.data_2  (data_2  ),
	.data_3  (data_3  ),
	.data_4  (data_4  ),
	.data_5  (data_5  ),
	.data_6  (data_6  ),
	.data_7  (data_7  ),
	.data_8  (data_8  ),
 	`elsif Data_Number_16
	.data_1  (data_1  ),
	.data_2  (data_2  ),
	.data_3  (data_3  ),
	.data_4  (data_4  ),
	.data_5  (data_5  ),
	.data_6  (data_6  ),
	.data_7  (data_7  ),
	.data_8  (data_8  ),
	.data_9  (data_9  ),
	.data_10 (data_10 ),
	.data_11 (data_11 ),
	.data_12 (data_12 ),
	.data_13 (data_13 ),
	.data_14 (data_14 ),
	.data_15 (data_15 ),
	.data_16 (data_16 ),
	`endif
	
	.data_out(data_out)
);

endmodule

3.3仿真结果

verilog 条件编译,# 基础语法篇,fpga开发

注:以上仅为个人学习笔记,如有不妥之处,欢迎评论区探讨交流,如有帮助,请给个赞吧!文章来源地址https://www.toymoban.com/news/detail-560323.html

到了这里,关于Verilog中条件编译的使用(`ifdef-`elsif-`else-`endif)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • stm32中代码#ifdef __cplusplus extern “C“ {#endif的用途

      在大部分开源项目的stm32中,我们常常会看到这段代码: #ifdef __cplusplus extern \\\"C\\\" { #endif 这是一段 C/C++ 代码中常见的条件编译指令,用于处理 C++ 中的外部链接性问题。 #ifdef __cplusplus : 这是一个条件预处理指令,用于检查是否定义了宏 __cplusplus 。在 C++ 编译环境中,这个宏会

    2024年04月16日
    浏览(22)
  • 无涯教程-Perl - if...elsif...else语句函数

    if 语句后可以跟可选的 elsif ... else 语句,这对于使用单个 if ... elsif 语句测试各种条件非常有用。 Perl编程语言中的 if ... elsif...else 语句的语法是- 在这里,我们使用等于运算符==,用于检查两个操作数是否相等。如果两个操作数相同,则返回true,否则返回false。 Perl 中的 if

    2024年02月13日
    浏览(32)
  • Verilog 不完整if-else和case产生锁存latch

    写这篇文章是因为本小白在刷题过程中看到答主的代码总是不把if-else写全,而我又记得不写全是可能产生latch的,对此很迷惑,仔细看过之后发现只有组合逻辑(电平触发)电路中的不完整if-else和case才会产生锁存器latch。简单记录一下。 参考文章: 1、https://blog.csdn.net/ainu

    2024年02月13日
    浏览(52)
  • ASIC-WORLD Verilog(8)if-else语句和case语句

            在自己准备写一些简单的verilog教程之前,参考了许多资料----Asic-World网站的这套verilog教程即是其一。这套教程写得极好,奈何没有中文,在下只好斗胆翻译过来(加了自己的理解)分享给大家。         这是网站原文:Verilog Tutorial         这是系列导航:

    2024年02月01日
    浏览(36)
  • Macbook M1使用vscode+iverilog+gtkwave实现Verilog代码的编译与运行

    最近在研究FPGA的开发,于是需要用到Verilog。但是手头上只有一台M1芯片的Macbook air,Vivado和Quatus在MacOS上似乎不太方便使用,险些陷入无尽的对于购买macbook的后悔中… 随后我在网上查找了大量的关于MacOS平台如何实现verilog的开发与编写的相关博客,都提到了使用 vscode+iveril

    2024年02月04日
    浏览(28)
  • Vivado开发FPGA使用流程、教程 verilog(建立工程、编译文件到最终烧录的全流程)

    目录 一、概述 二、工程创建 三、添加设计文件并编译 四、线上仿真 五、布局布线 六、生成比特流文件 七、烧录 一、概述 vivado开发FPGA流程分为创建工程、添加设计文件、编译、线上仿真、布局布线(添加约束文件)、生成比特流文件、烧录等步骤,下文将按照这些步骤讲

    2024年02月09日
    浏览(25)
  • 【随手查】Verilog编译报错

    Quartus编译、Vavido编译、ModelSim等的一些报错的记录,方便日后查找,持续更。。。 🚀Quartus编译报错 Error (10028) Error: Error (10028): Can’t resolve multiple constant drivers for net “counter[5]” at Stopwatch_1.v(44) Solve: 不能在多个模块中对同一个变量赋值 Error (10079) Error: Error (10079): Veril

    2024年02月08日
    浏览(16)
  • uni-app判断是否是小程序/app/h5 onLoad(){     //     MP  代表所有小程序     #ifdef MP     //如果是小程序  例如显示返回按钮     this.showBack = false     // #endIf   } 在data中定义showBack data() {     return {         // #ifndef MP         showBack: true.         // #endif     } }  

    ///======= APP: /*#ifdef APP-PLUS*/             top:0;             /*#endif*/ H5             /*#ifdef H5*/             top:88rpx;             /*#endif*/ MP:小程序             /*#ifdef MP*/             top:0;             /*#endif*/

    2024年02月03日
    浏览(63)
  • FPGA模块使用Verilog调用另一个Verilog模块

    FPGA模块使用Verilog调用另一个Verilog模块 在FPGA设计中,常常需要将一个大的模块分解成多个子模块来实现。而这些子模块通常由Verilog代码编写而成。在设计中,我们需要通过调用这些子模块来实现整体的功能。本文将介绍如何使用Verilog调用另一个Verilog模块。 为了说明这个过

    2024年02月07日
    浏览(35)
  • Verilog中#的使用与理解

    我在verilog中test_bench中遇到这样的问题,记录一下。 基本知识:1ns=1000ps 含义为:时延单位为1ns,时延精度为1ps。 简而言之,前面是总时间,后面是每个单元的时间间隔。 #是延时的意思,跟timescale中的时延单位有关。 这里的#1就是时延1ns,跟timescale后面之前的数字单位保持

    2024年02月11日
    浏览(15)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包