alt

题目要求使用函数实现4bit数据大小端转换的功能,所谓大端,即数据的高位写在左侧,低位写在右侧。小端则反过来:高位写在右侧,低位写在左侧。实现N比特数的大小端转换,只需要把数据的N位赋值给0位,N-1位赋值给1位,依此类推。

在函数编写完成之后,实现对两个不同的输入分别转换,只需要调用两次函数,分别对两个输入进行转换即可。

`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] a;
        begin
            data_rev[0] = a[3];
            data_rev[1] = a[2];
            data_rev[2] = a[1];
            data_rev[3] = a[0];
        end
    endfunction

endmodule

function内部也可以使用for循环,for循环中的变量可以是reg类型或者integer类型。

`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] a;
        //reg [3:0] i;
        integer i;
        begin
            for(i = 0; i < 4; i = i + 1) begin: trans
                 data_rev[i] = a[3-i];
            end
        end
    endfunction

endmodule

function内部不要使用generate,而generate内部可以使用function。generate生成块是复制电路用的,而function是一块组合逻辑,应该是generate中嵌套function才合适。下面就是generate内部嵌套function的例子,综合编译是通过的,不过对于这一题的结果不对(因为没有按照这道题目的逻辑)。

`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
);
    
    genvar i;
    generate
        for(i = 0; i<4;i = i + 1) begin:trans
            assign c[i] = data_rev(a[i]);
            assign d[i] = data_rev(b[i]);
        end
    endgenerate
    
    
    function  data_rev;
        input  a;
        assign data_rev = a;
    endfunction

endmodule