题目要求使用函数实现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