Verilog学习之数据大小端转换设计


前言

今天我们做的是第十道题——使用函数实现数据大小端转换,这道题其实也比较简单,就是逆向输出一个数据,但我们需要知道如何去定义一个函数并合理的调用它。接下来让我们看看如何去写这道题。使用函数实现数据大小端转换


一、题目描述

在数字芯片设计中,经常把实现特定功能的模块编写成函数,在需要的时候再在主模块中调用,以提高代码的复用性和提高设计的层次,分别后续的修改。

请用函数实现一个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

总结

以上就是我在做这道题时的思路,以及代码的编写,如果还有更多更好的解法,欢迎读到这篇文章的朋友们在评论区告诉我,共同进步嘛。

  • 0
    点赞
  • 2
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个默默无闻的小程序员

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值