原创 [博客大赛]数电基础

2014-3-21 15:19 947 13 13 分类: FPGA/CPLD 文集: 基础和模拟

数字电路

德.摩根 定理  (A+B)'=A'.B' 及 (A.B)'=A'+B'

最小项 :在n变量逻辑函数中,最小项有2^n 个;例如 两个输入 A ,B ,那么最小项分别有: A'B'、A'B、AB'、AB 共四个。

任何一个逻辑函数都能写成若干个最小项之和的形式,即用输入变量的与或非来表示

逻辑函数化简: 公式法 、 卡诺图

逻辑函数的表示方法: 真值表 、 函数式 、逻辑(电路)图 、波形图

 

EDA技术还没有出现时,设计数字电路,必须先把具体事件转变成 真值表 ,逻辑函数式,然后搭建逻辑电路图 ! 想想这该是多么复杂并具有挑战性的工作 !

有了硬件描述语言,我们只需要在编译器中写 行为级的代码即可 !!

 

例如一个 3bit的加法器, 在quartus中只需要写 c=a+b 就这么简单 ;当然,任何逻辑函数,都可以用真值表表示,也就意味着,都可以用查找表式硬件语言描述形式写代码,然后综合成电路,但是写这个真值表的查找表代码量很大,很容易出错,更重要的是,资源消耗非常大 。

下面以3bit加法器作为对比

module top( clk,a,b,c);
input clk;
input [2:0] a,b;
output   [3:0] c;

reg  [2:0]A,B;
always@(clk)
begin A<=a;B<=b; end

assign c=A+B;
endmodule

对应的 RTL

20140316112949967.jpg

对应的 Technology Map Viewer

20140316113044746.jpg

典型的串行进位加法器,只需要 4个 全加器,也就是只用了 4个 LUT资源 !

 

用查找表描述

module top( clk,a,b,c);
input clk;
input [2:0] a,b;
output reg  [3:0] c;

reg  [2:0]A,B;
always@(clk)
begin A<=a;B<=b; end

always@(A or B)
case({A,B})
6'b000000: c=4'b0000;
6'b000001: c=4'b0001;
6'b000010: c=4'b0010;
6'b000011: c=4'b0011;
6'b000100: c=4'b0001;
6'b000101: c=4'b0010;
6'b000110: c=4'b0011;
6'b000111: c=4'b0100;
6'b001000: c=4'b0010;
6'b001000: c=4'b0010;
6'b001001: c=4'b0011;
6'b001010: c=4'b0100;
6'b001011: c=4'b0101;
6'b001100: c=4'b0011;
6'b001101: c=4'b0100;
6'b001110: c=4'b0101;
6'b001111: c=4'b0110;
6'b010000: c=4'b0010;
6'b010001: c=4'b0011;
6'b100100: c=4'b1000;
6'b101101: c=4'b1010;
6'b110110: c=4'b1100;
6'b100001: c=4'b0101;
6'b111111: c=4'b1110;
  ......
endcase

endmodule

对应的 RTL

20140316113804957.jpg


对应的 Technology Map Viewer(局部)

20140316113851671.jpg

可以看到,消耗的 LUT资源 非常多 !!

所以,一般来说,写程序不用 查找表式的描述方式 。

 

注意: 这里的查找表式的语言描述方式,和FPGA内部逻辑资源(LUT)不是一个概念 。虽然无论怎么描述,最底层实现都是用 LUT ,但是这是两个概念 。

从上边的例子对比可以看出,第二种方式,编译器根本识别不出这是一个加法器。

 

 

 

文章评论0条评论)

登录后参与讨论
我要评论
0
13
关闭 站长推荐上一条 /2 下一条