数字电路
德.摩根 定理 (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
对应的 Technology Map Viewer
典型的串行进位加法器,只需要 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
对应的 Technology Map Viewer(局部)
可以看到,消耗的 LUT资源 非常多 !!
所以,一般来说,写程序不用 查找表式的描述方式 。
注意: 这里的查找表式的语言描述方式,和FPGA内部逻辑资源(LUT)不是一个概念 。虽然无论怎么描述,最底层实现都是用 LUT ,但是这是两个概念 。
从上边的例子对比可以看出,第二种方式,编译器根本识别不出这是一个加法器。
文章评论(0条评论)
登录后参与讨论