📄 two_float_align.v
字号:
/* ------------------------------------------------------------// MODULE: Two_Float_Align (no clock , two floating inputs alignment, for SM-Floating point)// Edition: one// Matlab Code: None// C Code: None// Architecture Diagram: add_sub_floating.ppt// Date: 2008/01/30
// Update: 2008/01/30 // ------------------------------------------------------------ */
module Two_Float_Align(data_1_in,data_2_in,data_1_sgnfc_out,data_2_sgnfc_out,exp_out);
/* ------------------------------------------------------------// Parameters definition// ------------------------------------------------------------ */
parameter data_lng=32,//data_in length
exp_lng=7,//data_in exponent part length
sgnfc_lng=25,//data_in significant part length
out_lng=30;//data_out signifcant part length
/* ------------------------------------------------------------// I/O declaration// ------------------------------------------------------------ */
input [data_lng-1:0]data_1_in,data_2_in; //include sgnfc and exp part
output [out_lng-1:0]data_1_sgnfc_out,data_2_sgnfc_out; // sgnfc part
output [exp_lng-1:0]exp_out;
/* ------------------------------------------------------------// Connection wire declaration// ------------------------------------------------------------ */
wire [exp_lng:0]ext_exp_1,ext_exp_2,exp1_sub_exp2;//signed extension exp parts for operation
wire [exp_lng-1:0]exp_1,exp_2,exp2_sub_exp1,
shitf_bit_numb;//shifter bit nubmer for alignment two data
wire swap_ctrl,//control signal for swapping data1 and data2
zero_ctrl; //control signal for minizal value of shifted data
wire [sgnfc_lng-1:0]swap_data_A,swap_data_B,swap_data_A_back,swap_data_B_back,//swap sgnfc part
sgnfc_1,sgnfc_2;
wire [2*sgnfc_lng-1:0]ext_swap_data_B; //only shift swap_data_B for low complexity
wire [sgnfc_lng-1:0]shift_data_B,real_shift_data_B; //shift for alignment
wire [out_lng-1:0]ext_swap_data_A_back; //extent swap_data_A_back
wire [out_lng-1:0]ext_swap_data_B_back; //extent swap_data_B_back
/* ------------------------------------------------------------// Module instance// ------------------------------------------------------------ */
//get the sgnfc parts
assign sgnfc_1=data_1_in[data_lng-1:exp_lng];
assign sgnfc_2=data_2_in[data_lng-1:exp_lng];
//get the exp parts
assign exp_1=data_1_in[exp_lng-1:0];
assign exp_2=data_2_in[exp_lng-1:0];
//signed extension
assign ext_exp_1={exp_1[exp_lng-1],exp_1};//use two adder is due to high-speed issue
assign ext_exp_2={exp_2[exp_lng-1],exp_2};
//compute alignment number
assign exp1_sub_exp2=ext_exp_1-ext_exp_2;
assign exp2_sub_exp1=exp_2-exp_1; //dont need to do sign-extension
assign swap_ctrl=exp1_sub_exp2[exp_lng];//control swap data1 and data2 or not
//swap data1 and data2 for low complexity
assign swap_data_A=(swap_ctrl)?sgnfc_2:sgnfc_1;
assign swap_data_B=(swap_ctrl)?sgnfc_1:sgnfc_2;
//choose aligned exp
assign exp_out=(swap_ctrl)?exp_2:exp_1;
//choose correct align value of exp part
assign shitf_bit_numb=(swap_ctrl)?exp2_sub_exp1:exp1_sub_exp2[exp_lng-1:0];
//signed extension for shifter
assign ext_swap_data_B={{(sgnfc_lng){swap_data_B[sgnfc_lng-1]}},swap_data_B};
//data shift (only shift B side)
assign shift_data_B=ext_swap_data_B>>shitf_bit_numb;
//minimal value control
//if shitf_bit_numb is bigger than sgnfc_lng, set the data value to zero
assign zero_ctrl=shitf_bit_numb>sgnfc_lng;
assign real_shift_data_B=(zero_ctrl)?{sgnfc_lng{1'b0}}:shift_data_B;
//swap back
assign swap_data_A_back=(swap_ctrl)?real_shift_data_B:swap_data_A;
assign swap_data_B_back=(swap_ctrl)?swap_data_A:real_shift_data_B;
assign ext_swap_data_A_back={{(out_lng-sgnfc_lng){swap_data_A_back[sgnfc_lng-1]}},swap_data_A_back};
assign ext_swap_data_B_back={{(out_lng-sgnfc_lng){swap_data_B_back[sgnfc_lng-1]}},swap_data_B_back};
assign data_1_sgnfc_out=ext_swap_data_A_back;
assign data_2_sgnfc_out=ext_swap_data_B_back;
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -