function—— Verilog的函数

function —— Verilog的函数

在程序中经常看到一个function,之前对其不太了解,正好趁着这个例子来看一下verilog中的函数功能——function。

举个例子

先以如下function为例:

它的主要功能是判断输入的字符是否为数字(包含0~9,A~F,a~f);

如果是,就输出数字;如果不是,就将最MSB置位;

源码及注释为:

//***************************************************************************
// Tasks and Functions
//***************************************************************************

	// This function takes the lower 7 bits of a character and converts them
	// to a hex digit. It returns 5 bits - the upper bit is set if the character
	// is not a valid hex digit (i.e. is not 0-9,a-f, A-F), and the remaining
	// 4 bits are the digit
	function [4:0] to_val;
    	input [6:0] char;
	begin
    	if ((char >= 7'h30) && (char <= 7'h39)) // 0-9
    	begin
      		to_val[4]   = 1'b0;
			to_val[3:0] = char[3:0];
    	end else if (((char >= 7'h41) && (char <= 7'h46)) || // A-F
			((char >= 7'h61) && (char <= 7'h66)) )  // a-f
		begin
    		to_val[4]   = 1'b0;
    		to_val[3:0] = char[3:0] + 4'h9; // gives 10 - 15
    	end else begin
			to_val      = 5'b1_0000;
    	end
	end
	endfunction

功能还算比较易懂;

关于这个function,心中是有几个疑惑的;

  1. 这段代码在电路上是如何实现的?是像描述那样,完全的组合电路吗?
  2. 电路的复杂程度,需要考虑单周期内的电路延迟吗?
  3. 能否综合?

带着以上几个问题,开始拨开云雾,寻找答案;

开始寻找

此处省略寻找的过程(如何善用搜索引擎);

通过网上寻找,最后在《通信IC设计》一书中找到了合适的答案,刚好可以完美解释上面的几个问题;

接下来就进入解答环节:

function写法

function的标准写法如下:

function <返回值的类型或范围>(函数名);
    <端口说明语句>		// input XXX
    <变量类型说明语句>		// reg YYY
    ......
begin
    <语句>
    ......
    函数名 = ZZZ;			// 函数名就相当于输出变量;
end
endfunction

语法

函数的语法为:

  • 定义函数时至少要有一个输入参量;可以按照ANSI和module形式直接定义输入端口。例如:

    function[63:0] alu (input[63:0] a, b, input [7:0] opcode);
    
  • 在函数的定义中必须有一条赋值语句给函数名具备相同名字的变量赋值;

  • 在函数的定义中不能有任何的时间控制语句,即任何用#@wait来标识的语句。

  • 函数不能启动任务。

  • 如果描述语句是可综合的,则必须所有分支均赋值,不予存在不赋值的情况,只能按照组合逻辑方式描述。

function与触发器电路结合

function本身表述的是组合电路,但可以赋值给某个触发器;

module func_test(
    input 			rst_n,
    input 			clk,
    input [6:0] 	func_i,
    output reg [4:0] 	func_o
    );

//***************************************************************************
// Tasks and Functions
//***************************************************************************

	// This function takes the lower 7 bits of a character and converts them
	// to a hex digit. It returns 5 bits - the upper bit is set if the character
	// is not a valid hex digit (i.e. is not 0-9,a-f, A-F), and the remaining
	// 4 bits are the digit
	function [4:0] to_val;
    	input [6:0] char;
	begin
    	if ((char >= 7'h30) && (char <= 7'h39)) // 0-9
    	begin
      		to_val[4]   = 1'b0;
			to_val[3:0] = char[3:0];
    	end else if (((char >= 7'h41) && (char <= 7'h46)) || // A-F
			((char >= 7'h61) && (char <= 7'h66)) )  // a-f
		begin
    		to_val[4]   = 1'b0;
    		to_val[3:0] = char[3:0] + 4'h9; // gives 10 - 15
    	end else begin
			to_val      = 5'b1_0000;
    	end
	end
	endfunction


wire [4:0] func_wire;

assign func_wire = to_val(func_i);

always @ (posedge clk or negedge rst_n ) begin
	if ( !rst_n ) begin
		func_o <= 5'b0;
	end else begin
		func_o <= func_wire;
	end
end

endmodule

电路中,function对应的功能为判断输入字符是否为数字;而always描述数据的存储过程。

于是电路被清晰地划分为两部分:

  1. 计算函数部分,此部分为纯组合电路实现;
  2. D触发存储部分。

如果只是简单的上述组合逻辑,工作频率不高,是完全可以使用该语法的。

但考虑到函数的复杂程度,比如许多超越函数,就需要进行分解;

时序模型

先前的问题2中,就是关于这方面的思考,既然只有组合逻辑,就肯定要涉及到时序的问题;

这一部分内容,在通信IC设计中有详细的介绍。

电路负载模型与时延关系

在这里插入图片描述

因此,如果较为复杂的函数功能,就会出现时序无法满足的情况;

此时,可以通过如下的方法进行解决;

基于算法视角的时序优化

函数f(x)过大,就会需要进行函数拆解,从而使单个函数负载和掩饰控制在一定的范围内。

在这里插入图片描述

  1. 累加拆解(第一种拆解)
  2. 累乘拆解(第二种拆解)
  3. 函数嵌套模式拆解(第三种拆解)
函数与通用描述的转换方法

函数其本身性质为组合逻辑,那么也一定可以与通用的描述进行转换;

在这里插入图片描述

函数其实是一种抽象形式描述,是一种需要实例对象才能功能生效的描述。如果将函数的定义替换为always @ ( * ) ,然后定义必要的变量,就可以直接将其转化为实际的组合电路。

因此要讲函数转化为实际电路描述,可以采用always@直接例化的方法实现。

在这里插入图片描述

函数小结

站在Verilog综合器的角度,描述的任何一个组合电路块,或者组合always语句,以及所有赋值给D触发器之前的逻辑,都将抽象为多值函数:即多个输入与输出的组合。

前面的各种拆解方法,其目的都是为了优化时序,并便于让综合软件更加快速、更灵活地实现HDL到电路网表的转换。

原理图及仿真

Schematic

看一下Schematic,能明显看出是一堆组合逻辑的搭配:

在这里插入图片描述

vivado工程

vivado工程仿真:

在这里插入图片描述

判定0\~9

在这里插入图片描述

判定A\~F

在这里插入图片描述

判定a\~f

而且可以看出function本身耗时取决于函数功能的复杂程度;

工程文件

vivado 工程文件下载 ,设定的0积分,如果变动了,可以联系我修改;

After

That’s all.

  • 28
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: FPGA是一种可编程逻辑器件,可以通过编程实现各种功能。而Verilog是一种硬件描述语言,用于描述FPGA中的电路。Verilog基础语法包括模块定义、端口定义、信号定义、赋值语句、条件语句、循环语句等。模块定义是Verilog中最基本的语法,用于定义一个电路模块。端口定义用于定义模块的输入输出端口。信号定义用于定义模块内部的信号。赋值语句用于给信号赋值。条件语句用于根据条件执行不同的代码。循环语句用于重复执行一段代码。掌握Verilog基础语法是学习FPGA编程的基础。 ### 回答2: FPGA是一种可编程逻辑器件,它可以通过硬件描述语言来编写自定义的逻辑电路来实现各种功能。其中,Verilog是一种常用的硬件描述语言,有助于实现FPGA的功能。 Verilog语言主要由模块、端口、信号、语句和运算符五个基本部分组成。模块是Verilog中的最基本的语法单元,类似于传统程序语言中的函数,模块之间可以通过实例化进行连接。端口则是与外部世界进行通信的接口,可以分为输入端口(input)和输出端口(output)两种类型。信号是Verilog中表示数字信号的基本单元,可以是位向量、整数或实数。语句则是Verilog中描述操作和行为的语言,常用的语句包括赋值语句、分支语句和循环语句。运算符则是Verilog中用于进行操作的符号,包括算数运算符、逻辑运算符和位运算符。 在Verilog语言中,还有一些常用的结构体和命令可以帮助我们更方便地实现FPGA的功能。其中,常用的结构体包括always语句、case语句和module归档,常用的命令包括initial语句、wire语句和reg语句。always语句可以在指定的触发条件下执行某一段代码,case语句可以根据不同的条件执行不同的代码段,module归档则可以将多个模块合并为一个模块。initial语句可用于在仿真开始前初始化某些信号,wire语句则用于声明并连接信号,reg语句则用于声明并存储信号。 总体而言,了解FPGAVerilog基础语法可以帮助我们更好地理解FPGA技术的应用和实现。然而,理论知识只有结合实际操作和实验才能更好地掌握。所以,我们还需要结合实际项目来进行练习和实践,从而更好地掌握FPGAVerilog基础语法。 ### 回答3: FPGA(可编程门阵列)是一种可编程逻辑器件,可以用来创建定制的数字电路。Verilog是一种硬件描述语言,用于描述数字电路的结构和行为。 Verilog基础语法有以下几个部分: 1.模块定义:Verilog代码以模块的形式进行组织,每个模块都有一个名称和端口列表。模块定义以module关键字开始,以endmodule关键字结束。 2.端口声明:模块的端口是输入和输出连接到其他模块或FPGA芯片的引脚。端口可以是输入(input)、输出(output)或双向(inout)。端口声明在模块定义中。 3.信号声明:信号是描述数字电路中状态的变量。可以是单个位(wire)或多位(reg),在模块中声明。 4.赋值语句:用来为信号赋值,包括非阻塞赋值(<=)、阻塞赋值(=)和连续赋值(assign)。 5.条件分支语句:if, else if和else语句是用来控制程序流程,实现条件判断。 6.循环语句:Verilog支持for、while、do while和forever等类型的循环语句,可以在程序中实现迭代操作。 7.模块实例化:用来将其他模块作为子模块嵌入到当前模块中,从而实现复杂的数字电路。 除上述基本语法外,Verilog还有其他常用语法,如always块、initial块和function定义等。需要深入了解和使用Verilog,可以参考相关资料和教程。掌握了Verilog语法,可以使用FPGA搭建各种个性化的数字电路,用于嵌入式系统、数字信号处理、计算机网络等各种应用领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShareWow丶

前人栽树,分享知识,传播快乐。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值