题解 | #使用函数实现数据大小端转换#

使用函数实现数据大小端转换

http://www.nowcoder.com/practice/74c0c19ad0c444959c436a049647a93c

题意整理

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

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

题解主体

在Verilog HDL中,函数的声明由关键字function开始,endfunction结束。对于函数中的语句需要用begin…end包含,即使只有一句。函数的声明模板如下:

       function [range-1:0] function_name ;

input_declaration ;

             other_declaration ;

procedural_statement ;

endfunction

函数在声明时,会隐式的声明一个宽度为 range、 名字为 function_id 的寄存器变量,函数的返回值通过这个变量进行传递。当该寄存器变量没有指定位宽时,默认位宽为 1。然后进行输入变量的声明和其它声明。

函数通过指明函数名与输入变量进行调用。函数结束时,返回值被传递到调用处。

函数调用格式如下:

function_name(input1, input2, …);

通过函数名调用函数,并在参数列表中填入输入参数。

要实现大小端转换,即将输入数值的最高位赋予输出的最低位,次高位赋予次低位,依次类推即可。

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

函数编写完成,则可以在多个位置进行调用,输入不同的参数,实现对不同数据的操作,完整的实现代码如下:

module function_mod(

       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 [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


全部评论
好像缺少了时钟信号和复位信号
点赞 回复 分享
发布于 2022-05-24 21:03

相关推荐

10-24 00:54
已编辑
门头沟学院 Java
牛客20646354...:这连小厂都找不到就离谱,只能说可能你根本没投什么小厂。说实话现在都要11月了,没什么岗位了。其实最好是在9月找,那时候暑假工刚走,岗位多的是,现在都占满了岗位了,秋招的秋招,顶替暑假工的也基本上都顶替了。 只能多投了,简历其实都差不多,你这都不是外卖+点评去找实习了,已经比好多人优秀了。实在找不到,可以降低一些标准的,能投到自研项目的小厂说实话可能比你去中大厂能学到更多东西。因为中大厂最多给你看一点点模块功能,小厂基本上全部代码甚至几个项目的代码都能拿到。
点赞 评论 收藏
分享
饿魔:看到在线简历了吧
点赞 评论 收藏
分享
评论
37
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务