前言
今天我们做的是第十道题——使用函数实现数据大小端转换,这道题其实也比较简单,就是逆向输出一个数据,但我们需要知道如何去定义一个函数并合理的调用它。接下来让我们看看如何去写这道题。使用函数实现数据大小端转换
一、题目描述
在数字芯片设计中,经常把实现特定功能的模块编写成函数,在需要的时候再在主模块中调用,以提高代码的复用性和提高设计的层次,分别后续的修改。
请用函数实现一个4bit数据大小端转换的功能。实现对两个不同的输入分别转换并输出。
程序的接口信号图如下:
输入描述:
clk:系统时钟
rst_n:异步复位信号,低电平有效
a,b:4bit位宽的无符号数
输出描述:
c,d:8bit位宽的无符号数
二、实现思路
1.函数的概念
在 Verilog 中,可以利用任务(关键字为 task)或函数(关键字为 function),将重复性的行为级设计进行提取,并在多个地方调用,来避免重复代码的多次编写,使代码更加的简洁、易懂。
函数只能在模块中定义,位置任意,并可以在模块的任何地方引用,但作用范围也局限于此模块。函数主要有以下几个特点:
1)不含有任何延迟、时序或时序控制逻辑
2)至少有一个输入变量
3)只有一个返回值,且没有输出
4)不含有非阻塞赋值语句
5)函数可以调用其他函数,但是不能调用任务
Verilog 函数声明格式如下:
function [range-1:0] function_id ;
input_declaration ;
other_declaration ;
procedural_statement ;
endfunction
函数在声明时,会隐式的声明一个宽度为 range、 名字为 function_id 的寄存器变量,函数的返回值通过这个变量进行传递。当该寄存器变量没有指定位宽时,默认位宽为 1。
函数通过指明函数名与输入变量进行调用。函数结束时,返回值被传递到调用处。
函数调用格式如下:
function_id(input1, input2, …);
2.具体思路
题中要求我们把数据的大小端进行转换,即将给出的4位宽数据逆向输出,所以我们的函数体也比较简单,一个for循环即可,用函数的返回值来存储逆向输出的数据,然后赋给我们的输出数据。
三、代码展示
`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 = rst_n?convert(a):0;
assign d = rst_n?convert(b):0;
function [3:0] convert;
input [3:0] data_in;
integer i;
for (i=0;i<4;i=i+1)
begin :converse
convert[i] = data_in[3-i];
end
endfunction
endmodule
总结
以上就是我在做这道题时的思路,以及代码的编写,如果还有更多更好的解法,欢迎读到这篇文章的朋友们在评论区告诉我,共同进步嘛。