1 RTL代码
module top_compare(
input I_sys_clk,
input I_reset_n,
input [3:0] I_a ,
input [3:0] I_b ,
output reg O_greater,
output reg O_less ,
output reg O_equal
);
always @(posedge I_sys_clk or negedge I_reset_n)
begin
if(~I_reset_n)
begin
O_greater <= 1'b0;
O_less <= 1'b0;
O_equal <= 1'b0;
end
else
begin
O_greater <= (I_a > I_b);
O_less <= (I_a < I_b);
O_equal <= (I_a == I_b);
end
end
endmodule
1.1 RTL级结构
1.2 synthesis后结构
当数据位宽较小,比如为4位时,直接用LUT实现:
原理比较简单,纯纯的查表。
当数据位宽较大,比如位8位时,使用LUT和Carry Logic实现:
以判断 I_a > I_b 为例,总共使用8个LUT4。
第1个LUT输入 I_a[6]、I_b[6]、I_b[7]、I_a[7] ,不管其他位,如果这几位可以判断出 I_a > I_b (比如 I_a[7] = 1 且 I_b[7] = 0)则输出1,否则输出0。
第2个LUT判断 I_a[4]、I_b[4]、I_b[5]、I_a[5] 。
第3个LUT判断 I_a[2]、I_b[2]、I_b[3]、I_a[3] 。
第4个LUT判断 I_a[0]、I_b[0]、I_b[1]、I_a[1] 。
以上4个LUT的输出对应carry logic的进位生成输入DI。
第5个LUT输入 I_a[6]、I_b[6]、I_b[7]、I_a[7] ,如果 I_a[6] = I_b[6] 且 I_a[7] = I_b[7] ,则输出1,否则输出0。
同理其他LUT判断剩余bit。
以上4个LUT的输出对应carry logic的进位传送输入S。
我们知道,carry logic的CO输出为:
{ C O = D I , S = 0 C O = C I , S = 1 D I 与 C I 不 同 时 取 1 \left\{ \begin{aligned} CO = DI \quad,S=0 \\ CO = CI \quad,S=1 \\ DI与CI不同时取1 \end{aligned} \right. ⎩⎪⎨⎪⎧CO=DI,S=0CO=CI,S=1DI与CI不同时取1
又有进位链的CYINIT接地,也就是说,判断的逻辑为:
- 首先判断[1:0]是否相等,如果相等则CO[0] = 0。如果不相等则判断大小:输出进位CO[0] = I_a[1:0] > I_b[1:0] ? 1 : 0。
- 然后判断[3:2]是否相等,如果相等则CO[1] = CO[0]。如果不相等则判断大小:输出进位CO[1] = I_a[3:2] > I_b[3:2] ? 1 : 0。
- 同理判断[5:4]。
- 最后判断[6:5]是否相等,如果相等,则根据之前的比较在CO[3]输出结果。如果不相等则CO[3] = I_a[6:5] > I_b[6:5] ? 1 : 0。
- 最终,如果I_a > I_b,则CO[3] == 1。否则等于0。