牛客刷题<十>使用函数实现数据大小端转换

本文介绍了如何在VHDL中使用function实现数据的大小端转换。提供了四种不同的解法,包括直接赋值、循环反转、位拼接和直接赋值。function在VHDL中不能包含时间控制语句,不能启动task,但必须至少有一个输入参数并返回一个值。对比task,function只能描述组合逻辑,无时延,且不能调用task。

题目:使用函数实现数据大小端转换_牛客题霸_牛客网

注意:此题是时钟下降沿有效

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值