列表

详情


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

描述

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

请用函数实现一个4bit数据大小端转换的功能。实现对两个不同的输入分别转换并输出。
程序的接口信号图如下:

使用Verilog HDL实现以上功能并编写testbench验证。


输入描述

clk:系统时钟
rst_n:异步复位信号,低电平有效
a,b:4bit位宽的无符号数

输出描述

c,d:8bit位宽的无符号数

原站题解

Verilog 解法, 执行用时: 0ms, 内存消耗: 0KB, 提交时间: 2022-08-06

`timescale 1ns/1ns
module function_mod(
	input [3:0]a,
	input [3:0]b,
	input clk,rst_n,
	output [3:0]c,
	output [3:0]d
);
    function [3:0] rev(input [3:0] data);
        integer i;
        for(i = 0;i < 4;i=i+1)
             rev[i] = data[3-i];
    endfunction
    
    assign c = rev(a);
    assign d = rev(b);
endmodule

Verilog 解法, 执行用时: 0ms, 内存消耗: 0KB, 提交时间: 2022-08-06

`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
);
    function [3:0] data_rev;
        input [3:0] a;
        data_rev = {a[0],a[1],a[2] ,a[3]};
    endfunction
    assign c = data_rev(a);
    assign d = data_rev(b);
endmodule

Verilog 解法, 执行用时: 0ms, 内存消耗: 0KB, 提交时间: 2022-08-06

`timescale 1ns/1ns
module function_mod(
	input [3:0]a,
	input [3:0]b,
    input clk,
    input rst_n,
	
	output [3:0]c,
	output [3:0]d
);
    reg[3:0] c;
    reg[3:0] d;
    always@( clk or negedge rst_n)
        if(~rst_n)
            begin
             c<=0;
             d<=0;
             end
    else begin
        c<=inv(a);
        d<=inv(b);
        
    end

    function[3:0] inv;
        input[3:0] e;
     
        integer i; 
        
            for(i=0; i<4; i=i+1)
          begin 
              inv[i]=e[3-i];
        end
    endfunction
endmodule

Verilog 解法, 执行用时: 0ms, 内存消耗: 0KB, 提交时间: 2022-08-06

`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
);

    function [3:0] begin_end;
    input [3:0] data_in;
    begin
        begin_end[0] = data_in[3];
        begin_end[1] = data_in[2];
        begin_end[2] = data_in[1];
        begin_end[3] = data_in[0];
    end 
endfunction

assign c = begin_end(a);
assign d = begin_end(b);
endmodule

Verilog 解法, 执行用时: 0ms, 内存消耗: 0KB, 提交时间: 2022-08-06

`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] 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

上一题