2008年8月5日 星期二

FullAdder:一位元全加器


一位元全加器的Verilog程式碼
//定義一位元全加器
module fulladder (sum , c_out, a , b , c_in)
//宣告輸出入埠
output sum,c_out;
input a, b, c_in;
//宣告內部接線
wire s1,c1,c2 ;
xor(sl, a,b) ;
and(c1, a,b);
xor (sum, s1, c_in) ;
and (c2, s1, c_in) ;
xor (c_out, c2, c1) ;
endmodule

真值表如下
ABC_INSUMC_OUT
00000
01010
10010
11001
00110
01101
10101
11111

6 則留言:

史丹利 提到...

另一個Gate Level的寫法,這個xor用比較少,gate count數應該會變少
module fadder(sum, cout, a, b, cin)
output sum,cout;
input a, b, cin;
xor u0(sum, a, b, cin);
and u1(net1, a, b);
and u2(net2, b, cin);
and u3(net3, cin, a);
or u4(cout, net1, net2, net3);
endmodule

史丹利 提到...

這個是Behavior Level的全加器
module fadder(sum, cout, a, b, cin)
output sum,cout;
input a, b, cin;
reg sum,cout;

always@(a or b or cin)
begin
sum=a^b^cin;
count=(a&b)|(b&cin)|(cin&a);
end
endmodule

Unknown 提到...

可以請問上面1bit全加器的test bench怎麼寫嗎???

sivs_ics 提到...

全加器cout輸出好像是用or閘不是xor閘?是否可以更正一下?

史丹利 提到...

cout的輸出用or閘或是xor閘做, 都可以喔.
以真值表來結果來看使用xor與使用or都可以得到相同的真值表結果.

比如:Cout 也可以換另成另一種
Cout=(A.B) + (B.C) + (A.C)
這也可以得到相同的真值表結果.

sivs_ics 提到...

是的,因為兩個半加器不可能同時進位,所以用or或xor都可以,但一般高職教科書都用or閘,所以原圖是可以的。

一個小故事讓我們明白資金流通的意義

“又是炎熱小鎮慵懶的一天。太陽高掛,街道無人,每個人都債台高築,靠信用度日。這時,從外地來了一位有錢的旅客,他進了一家旅館,拿出一張1000 元鈔票放在櫃檯,說想先看看房間,挑一間合適的過夜,就在此人上樓的時候---- 店主抓了這張1000 元鈔,跑到隔壁屠戶那裡支付了他欠的肉錢...