当前位置:   article > 正文

数据比较器在FPGA中的实现_fpga比较器的实现

fpga比较器的实现

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

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\{

CO=DI,S=0CO=CI,S=1DICI1
\right. CO=DI,S=0CO=CI,S=1DICI1

又有进位链的CYINIT接地,也就是说,判断的逻辑为:

  1. 首先判断[1:0]是否相等,如果相等则CO[0] = 0。如果不相等则判断大小:输出进位CO[0] = I_a[1:0] > I_b[1:0] ? 1 : 0。
  2. 然后判断[3:2]是否相等,如果相等则CO[1] = CO[0]。如果不相等则判断大小:输出进位CO[1] = I_a[3:2] > I_b[3:2] ? 1 : 0。
  3. 同理判断[5:4]。
  4. 最后判断[6:5]是否相等,如果相等,则根据之前的比较在CO[3]输出结果。如果不相等则CO[3] = I_a[6:5] > I_b[6:5] ? 1 : 0。
  5. 最终,如果I_a > I_b,则CO[3] == 1。否则等于0。
开始
I_a[1:0]==I_a[1:0] ?
CO[0] = 0
CO[0] = I_a[1:0] > I_b[1:0] ? 1 : 0
I_a[3:2]==I_a[3:2] ?
CO[1] = CO[0]
CO[1] = I_a[3:2] > I_b[3:2] ? 1 : 0
I_a[3:2]==I_a[5:4] ?
CO[2] = CO[1]
CO[2] = I_a[5:4] > I_b[5:4] ? 1 : 0
I_a[6:5]==I_a[6:5] ?
CO[3] = CO[2]
CO[3] = I_a[6:5] > I_b[6:5] ? 1 : 0
CO[3] = 1 ?
I_a > I_b
结束
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/467755
推荐阅读
相关标签
  

闽ICP备14008679号