一. 简介
在上次优化中,对各个部分都进行了一些微小的优化,门电路的使用 和 延时都下降了一点点。但是这还远远达不到设计的要求,还需要进一步的优化。本次的优化分享,主要在部分积的生成上进行优化。
二. 优化
在上个版本中,部分积的生成中,改用了标准的四选一的选择器和一个二选一的选择器。标准四选一选择器实现如下(二选一的选择器消耗的资源先忽略),一共消耗了13个门电路。所以一个部分积的生成就需要花费13*17 = 221个门电路。资源的消耗是巨大的。
//sel0 = 0 sel1 = 0 e = a
//sel0 = 1 sel1 = 0 e = b
//sel0 = 0 sel1 = 1 e = c
//sel0 = 1 sel1 = 1 e = d
module selector4_1(
input a,
input b,
input c,
input d,
input sel0,
input sel1,
output e
);
wire inv_sel0;
wire inv_sel1;
wire a_out;
wire b_out;
wire c_out;
wire d_out;
assign inv_sel0 = ~sel0;
assign inv_sel1 = ~sel1;
assign a_out = inv_sel0 & inv_sel1 & a;
assign b_out = sel0 & inv_sel1 & b;
assign c_out = inv_sel0 & sel1 & c;
assign d_out = sel0 & sel1 & d;
assign e = a_out | b_out | c_out |d_out;
endmodule
首先,对选择部分修改为one hot编码,编码如下(顺序不一定一样)。这样编码电路的资源消耗会增多一点点,可以忽略不计。经过这样的编码之后,二选一的选择器就不需要了。
A 1 0 0 0
-A 0 1 0 0
-2A 0 0 1 0
2A 0 0 0 1
0 0 0 0 0
然后选择电路就可以优化成如下,可以看出只需要消耗7个门电路了,一个部分积的生成只需要消耗 7 * 17 = 119个门电路。一共部分积的资源消耗就降低了100个门电路,八个部分积,就是800个门电路。所以经过这点小小的改动,就使门电路的消耗大大减少了。
// sel0 --> a
// sel1 --> b
// sel2 --> c
// sel3 --> d
module selector4_1_hp(
input a,
input b,
input c,
input d,
input sel0,
input sel1,
input sel2,
input sel3,
output e
);
wire sel_a;
wire sel_b;
wire sel_c;
wire sel_d;
assign sel_a = a & sel0;
assign sel_b = b & sel1;
assign sel_c = c & sel2;
assign sel_d = d & sel3;
assign e = sel_a | sel_b | sel_c | sel_d;
endmodule
当这是极限了嘛! 不 !! 这部分还可以进一步的优化。下篇再进行分享。