December 23, 2011

Demo 4 bits full adder and 4 bits multiplier by Verilog

◎ 4 bits full adder


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
31
32
33
method_1: step by step

module add_4_v (
    input  [3:0] a,
    input  [3:0] b,
    input        cin,
    output [3:0] s,
    output       co
);

wire [2:0] carry;

function fa_s(input a, input b, input cin); 
    fa_s = a ^ b ^ cin;
endfunction

function fa_co(input a, input b, input cin);
    fa_co = a & ci | a & b | b & cin;
endfunction

assign s[0]     = fa_s (a[0], b[0], cin);
assign carry[0] = fa_co(a[0], b[0], cin);

assign s[1]     = fa_s (a[1], b[1], carry[0]);
assign carry[1] = fa_co(a[1], b[1], carry[0]);

assign s[2]     = fa_s (a[2], b[2], carry[1]);
assign carry[2] = fa_co(a[2], b[2], carry[1]);

assign s[3]     = fa_s (a[3], b[3], carry[2]);
assign co       = fa_co(a[3], b[3], carry[2]);

endmodule



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
method_2: using Mega-function "lpm_add_sub"

module add_4_v (
    input  [3:0] a,
    input  [3:0] b,
    input        cin,
    output [3:0] s,
    output       co
);

lpm_add_sub # (.lpm_width(4))
u0 (
    .dataa(a);
    .datab(b);
    .result(s);
    .cout(co);
);

endmodule


◎ 4 bits multiplier


1
2
3
4
5
6
7
8
9
10
11
12
13
14
module m(a, b, y);

input [3:0] a, b;
output [7:0] s;
wire [3:0] to, t1, t2, t3;

assign to = (b[0]==1)? a : 4'h0;
assign t1 = (b[1]==1)? a : 4'h0;
assign t2 = (b[2]==1)? a : 4'h0;
assign t3 = (b[3]==1)? a : 4'h0;

assign s = t0+(t1<<1)+(t2<<2)+(t3<<3);

endmodule

December 2, 2011

array of pointer & pointer to array

int (*p)[10];  // This type is a "pointer to array" with 10 elements.
int *p[10];    // This type is an "array of pointer" with 10 elements.

Practice: write down how many bytes the following statements need

int **P;                        // 4 bytes
int *p[];                        // 4 * sizeof array bytes
int (*p)[10];                 // 4 bytes
int *p[10];                    // 40 bytes
int (*p)[20][30];           // 4 bytes

November 28, 2011

統一發票期望值計算(A、B版)


上圖是一般統一發票的格式及其對獎金額 (肆獎以上須扣所得稅 20%)。
PS. 這邊課的所得稅為政府舉辦之,且領獎時直接扣除稅額,因此不須再合併報繳綜合所得稅。

A (傳統版)、
0.00000001x1600000+     // 特獎
0.00000003x160000+      // 頭獎
0.00000027x32000+       // 貳獎
0.0000027x8000+         // 參獎
0.000027x3200+          // 肆獎
0.00027x1000+           // 伍獎
0.0027x200              // 陸獎 
=0.94744

B (含千萬特獎)、
0.00000001x8000000+     // 千萬特獎
0.00000001x1600000+     // 特獎
0.00000003x160000+      // 頭獎
0.00000027x32000+       // 貳獎
0.0000027x8000+         // 參獎
0.000027x3200+          // 肆獎
0.00027x1000+           // 伍獎
0.0027x200              // 陸獎 
=1.02744


以上,算錯還煩請指正!謝謝^^

November 9, 2011

blocking & non-blocking


顧名思義,所謂的blocking就是verilog大括號所刮起來的敘述中,每個敘述是必須依序執行的,例如: 

always @(a or b) begin 
a=#1 b; 
c=#2 a; 
end 

這邊在always使用的是=的operator,也就是blocking的敘述。這段程式碼模擬的時候,a會在b的值變動後的一個時間單位被賦予b的值,而c會在a被賦予b的值之後的兩個時間單位,被賦予a的值。也就是說c會在b的值變動後的三個時間單位才會被賦予b的值。這是因為blocking的敘述,將每個敘述都視為要依序執行的,因此必須等前一個敘述完成之後才會執行下一個敘述。 

那如果使用non-blocking的operator(<=),程式改寫如下 
always@(a or b)begin 
a<=#1 b; 
c<=#2 a; 
end 

這段程式碼,會在b的值變動的一個時間單位之後,將b的值賦予給a,不過在b的值變動的第二個時間單位之後,a的值就會傳給了c,而不會到第(1+2)個時間單位過後才給值。看得出來嗎? 差別就在使用non-blocing的敘述,括號內的所有敘述都是"同時"執行的,不會有先後關係。這主要是為了硬體的特性,軟體主要都是依序執行的,這種平行的觀念比較常在硬體出現。


ref: http://tinyurl.com/3takxyw

October 26, 2011

三個逗號俱樂部

《免責聲明》 本部落格不針對任何金融商品進行買賣建議, 內容來自公開資訊觀測站之分享與各大媒體之評論為主, 投資人應審慎評估並獨立判斷,切勿以本部落格資訊作為投資依據。 靜候 時機來臨;瞬間掌握重壓;享受 獲利奔馳。 -------------------------...