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


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

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

    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

  • 相关阅读:
    面试官: B 树和 B+ 树有什么区别?
    基于Android的二维码识别系统的研究与实现(eclipse开发)
    stm32——hal库学习笔记(定时器)
    Redis 命令工具
    Linux下的一些工具
    基于Matlab的车牌识别算法,Matlab实现
    我是如何使用Spring Retry减少1000 行代码
    Java项目-苍穹外卖-Day10-SpirngTask及WebSocket
    Python运维之 Flask + 宝塔运行小应用
    springboot2整合nacos云服务,配置基本类型和json类型
  • 原文地址:https://blog.csdn.net/mxh3600/article/details/126432124