注意:此题是时钟下降沿有效
functipon语法:function用于返回一个值
function<返回值范围><返回值类型>函数名(端口声明);
本地变量
过程块、语句组
endfunction
*注意 function中不能使用非阻塞赋值"<="以及连续赋值语句"assign xx=xx;",且function至少应该有一个输入
function调用
function隐含的声明了一个与function同名的变量,调用时返回该变量
目标变量 = function(输入变量);
function <返回值的类型或范围> (函数名)
<端口说明语句>
<变量类型说明语句>
begin
<语句>
...
end
endfunction
函数function的使用规则
1.函数的定义不能包含有任何时间控制语句,即任何用#,@,wait来标识的语句;
2.函数不能启动task;
3.定义函数时至少要有一个输入参量;
4.在函数的定义中必须有一条赋值语句给函数中的一个内部变量赋函数的结果值,该变量具有和函数名相同的名字。
2.1 function和task使用与对比
function和task的区别:
(1)任务能调用任务和函数,但是函数只能调用函数,不能调用任务;
(2)任务可以描述组合逻辑和时序逻辑,可以有时延;函数只能描述组合逻辑,仿真时延为0;
(3)任务可以有任意多个各种类型的输入;函数只能有input端口的输入参数,且至少输入一个参数;
(4)任务可以没有返回值;函数必须有一个返回值;
解法一
`timescale 1ns/1ns
module function_mod(
input clk,
input rst_n,
input [3:0]a,
input [3:0]b,
output [3:0]c,
output [3:0]d
);
assign c = data_rev(a);
assign d = data_rev(b);
function [3:0] data_rev;
input [3:0] data_in;
begin
data_rev[0] = data_in[3];
data_rev[1] = data_in[2];
data_rev[2] = data_in[1];
data_rev[3] = data_in[0];
end
endfunction
endmodule
解法二
`timescale 1ns/1ns
module function_mod(
input clk,
input rst_n,
input [3:0]a,
input [3:0]b,
output [3:0]c,
output [3:0]d
);
assign c = rst_n?data_rev(a):0;
assign d = rst_n?data_rev(b):0;
function [3:0] data_rev;
input [3:0] data_in;
integer i;
for(i=0;i<4;i=i+1)
begin:reverse
data_rev[i] = data_in[3-i];
end
endfunction
endmodule
解法三:位拼接
`timescale 1ns/1ns
module function_mod(
input clk,
input rst_n,
input [3:0]a,
input [3:0]b,
output [3:0]c,
output [3:0]d
);
assign c = rst_n?data_rev(a):0;
assign d = rst_n?data_rev(b):0;
function [3:0] data_rev;
input [3:0] data_in;
begin
data_rev = {data_in[0],data_in[1],data_in[2],data_in[3]};
end
endfunction
endmodule
解法四:易理解、最简单
`timescale 1ns/1ns
module function_mod(
input clk,
input rst_n,
input [3:0]a,
input [3:0]b,
output [3:0]c,
output [3:0]d
);
assign c = {a[0],a[1],a[2],a[3]};
assign d = {b[0],b[1],b[2],b[3]};
endmodule
本文介绍了如何在VHDL中使用function实现数据的大小端转换。提供了四种不同的解法,包括直接赋值、循环反转、位拼接和直接赋值。function在VHDL中不能包含时间控制语句,不能启动task,但必须至少有一个输入参数并返回一个值。对比task,function只能描述组合逻辑,无时延,且不能调用task。
446

被折叠的 条评论
为什么被折叠?



