一. 模块功能与应用场景
模块功能:符号位扩展
应用场景:DDR等存储器通常是32/64位的,数据需要转为合适的位数再存入。
二. 模块框图与使用说明
输入和输出都是二进制补码,补码的符号位扩展就是补最高位即符号位即可。
三. 模块代码
/*
* @Author : Xu Dakang
* @Email : XudaKang_up@qq.com
* @Date : 2021-05-14 09:50:48
* @LastEditors : Xu Dakang
* @LastEditTime : 2021-05-14 22:59:16
* @Filename : signExtension.v
* @Description : 符号位扩展模块
*/
/*
* 思路: 输入数据为二进制补码,判断输入数据的最高位,为1则高位补1,为0则高位补0;
*/
module signExtension
#(
parameter INPUT_WIDTH = 24,
parameter OUTPUT_WIDTH = 32
)(
input wire signed [INPUT_WIDTH-1 : 0] input_number,
output wire signed [OUTPUT_WIDTH-1 : 0] output_number
);
assign output_number = {{(OUTPUT_WIDTH - INPUT_WIDTH){input_number[INPUT_WIDTH-1]}}, input_number};
endmodule
四. testbench
/*
* @Author : Xu Dakang
* @Email : XudaKang_up@qq.com
* @Date : 2021-05-14 19:40:46
* @LastEditors : Xu Dakang
* @LastEditTime : 2021-05-14 22:58:24
* @Filename : signExtension_tb.sv
* @Description : testbench of signExtension
*/
module signExtension_tb();
timeunit 1ns;
timeprecision 10ps;
parameter INPUT_WIDTH = 24;
parameter OUTPUT_WIDTH = 32;
logic signed [INPUT_WIDTH-1 : 0] input_number;
logic signed [OUTPUT_WIDTH-1 : 0] output_number;
signExtension signExtension_inst(.*);
// 生成时钟
localparam CLKT = 2;
logic clk;
initial begin
clk = 0;
forever #(CLKT / 2) clk = ~clk;
end
initial begin
input_number = 12;
#CLKT;
input_number = 88;
#CLKT;
input_number = -18;
#CLKT;
input_number = -300;
#CLKT;
input_number = 24'hXX8CX2;
#CLKT;
$stop;
end
endmodule
五. 仿真验证
仿真工具:Vivado 2020.2 Simulator。
以16进制显示:
以有符号10进制显示:
六. 工程分享
signExtension 符号位扩展模块 vivado 2020.2工程.7z
链接:https://pan.baidu.com/s/1kRQo_K1q3GQ8d0V2j1WG1w
提取码:2xiz