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


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

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

    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)任务可以没有返回值;函数必须有一个返回值;

    解法一

    1. `timescale 1ns/1ns
    2. module function_mod(
    3. input clk,
    4. input rst_n,
    5. input [3:0]a,
    6. input [3:0]b,
    7. output [3:0]c,
    8. output [3:0]d
    9. );
    10. assign c = data_rev(a);
    11. assign d = data_rev(b);
    12. function [3:0] data_rev;
    13. input [3:0] data_in;
    14. begin
    15. data_rev[0] = data_in[3];
    16. data_rev[1] = data_in[2];
    17. data_rev[2] = data_in[1];
    18. data_rev[3] = data_in[0];
    19. end
    20. endfunction
    21. endmodule

     解法二

    1. `timescale 1ns/1ns
    2. module function_mod(
    3. input clk,
    4. input rst_n,
    5. input [3:0]a,
    6. input [3:0]b,
    7. output [3:0]c,
    8. output [3:0]d
    9. );
    10. assign c = rst_n?data_rev(a):0;
    11. assign d = rst_n?data_rev(b):0;
    12. function [3:0] data_rev;
    13. input [3:0] data_in;
    14. integer i;
    15. for(i=0;i<4;i=i+1)
    16. begin:reverse
    17. data_rev[i] = data_in[3-i];
    18. end
    19. endfunction
    20. endmodule

    解法三:位拼接

    1. `timescale 1ns/1ns
    2. module function_mod(
    3. input clk,
    4. input rst_n,
    5. input [3:0]a,
    6. input [3:0]b,
    7. output [3:0]c,
    8. output [3:0]d
    9. );
    10. assign c = rst_n?data_rev(a):0;
    11. assign d = rst_n?data_rev(b):0;
    12. function [3:0] data_rev;
    13. input [3:0] data_in;
    14. begin
    15. data_rev = {data_in[0],data_in[1],data_in[2],data_in[3]};
    16. end
    17. endfunction
    18. endmodule

    解法四:易理解、最简单

    1. `timescale 1ns/1ns
    2. module function_mod(
    3. input clk,
    4. input rst_n,
    5. input [3:0]a,
    6. input [3:0]b,
    7. output [3:0]c,
    8. output [3:0]d
    9. );
    10. assign c = {a[0],a[1],a[2],a[3]};
    11. assign d = {b[0],b[1],b[2],b[3]};
    12. endmodule

  • 相关阅读:
    PHP:矩阵旋转90°(附完整源码)
    交换排序详讲:冒泡排序+快速排序(多方法+思路+图解+代码)
    ObjectMapper - 实现复杂类型对象反序列化(天坑!)
    【Tomcat目录详解】关于Tomcat你还需要了解的详细内容
    PostgreSQL 基础--常用命令
    AKS for Gitpod
    2006-2021年上市公司社会责任报告基本信息数据
    【Java】接口
    217.贪心算法:加油站(力扣)
    常见的一些Linux命令
  • 原文地址:https://blog.csdn.net/mxh3600/article/details/126432124