Verilog功能模块——符号位扩展

一. 模块功能与应用场景

模块功能:符号位扩展

应用场景:DDR等存储器通常是32/64位的,数据需要转为合适的位数再存入。

二. 模块框图与使用说明

输入和输出都是二进制补码,补码的符号位扩展就是补最高位即符号位即可

三. 模块代码

/*
 * @Author       : Xu Dakang
 * @Email        : [email protected]
 * @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        : [email protected]
 * @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进制显示:

image-20210514230455760

有符号10进制显示:

image-20210514230534134

六. 工程分享

signExtension 符号位扩展模块 vivado 2020.2工程.7z

链接:https://pan.baidu.com/s/1kRQo_K1q3GQ8d0V2j1WG1w
提取码:2xiz

你可能感兴趣的:(Verilog,补码,符号位扩展,二进制,Verilog,verilog)