2015年12月30日 星期三

期末考


module top;
system_clock #400 clock1(a);
system_clock #200 clock1(a);
system_clock #100 clock1(a);
system_clock #50 clock1(a);
number n1(e,a,b,c,d);
endmodule
module number(e1,a,b,c,d);
input a,b,c,d;
output e1;
wire a1,b1,c1,d1,w1,w2,w3,w4,w5,h1,h2,h3,h4,h5,g1,g2,g3,g4,g5;
nand(a1,a,a);
nand(b1,b,b);
nand(c1,c,c);
nand(d1,d,d);
nand(h1,a1,b1,c);
nand(w1,h1,h1);
nand(h2,a,b1,c1);
nand(w2,h2,h2);
nand(h3,a,b,c1);
nand(w3,h3,h3);
nand(h4,a1,b,c1,d);
nand(w4,h4,h4);
nand(h5,a,b,c,d);
nand(w5,h5,h5);
nand(g1,w1,w1);
nand(g2,w2,w2);
nand(g3,w3,w3);
nand(g4,w4,w4);
nand(g5,w5,w5);
nand(e1,g1,g2,g3,g4,g5);
endmodule
module system_clock(clk);
parameter PERIOD=100;
output clk;
reg clk;
initial
clk=0;
always
begin
#(PERIOD/2)clk=~clk;
end
always@(posedge clk)
if($time>1000)
$stop;
endmodule

2015年11月25日 星期三

三位元全加法器

module fulladder (sum, c_out, a, b, c_in);
wire s1, c1, c2;
output sum;
output c_out;
input a, b, c_in;
xor g1(s1, a, b);
xor g2(sum, s1, c_in);
and g3(c1, a,b);
and g4(c2, s1, c_in) ;
xor g5(c_out, c2, c1) ;

endmodule

module adder3(sum, c_out, a, b, c_in);
wire [2:0] c;
output [2:0] sum;
output c_out;
input [2:0] a;
input [2:0] b;
input c_in;
fulladder fa1(sum[0], c[1], a[0], b[0], c_in) ;
fulladder fa2(sum[1], c[2], a[1], b[1], c[1]) ;
fulladder fa3(sum[2], c_out, a[2], b[2], c[2]) ;


endmodule

module main;
reg [2:0] a;
reg [2:0] b;
wire [2:0] sum;
wire c_out;

adder3 DUT (sum, c_out, a, b, 1'b0);

initial
begin
  a = 4'b0101;
  b = 4'b0000;
end

always #50 begin
  b=b+1;
  $monitor("%dns monitor: a=%d b=%d sum=%d", $stime, a, b, sum);
end

initial #2000 $finish;

endmodule

2015年11月18日 星期三

一位元全多公器




module test_adder1;

 reg a,b;
 reg carry_in ;
 wire sum;
 wire carry_out;

 adder1_behavorial A1(carry_out, sum, a, b, carry_in);

 initial
  begin

    carry_in = 0; a = 0; b = 0;
    # 100 if ( carry_out !== 0 | sum !== 0)
                $display(" 0+0+0=00 sum is WRONG!");
              else
                $display(" 0+0+0=00 sum is RIGHT!");
    carry_in = 0; a = 0; b = 1;
    # 100 if ( carry_out !== 0 | sum !== 1)
               $display(" 0+0+1=01 sum is WRONG!");
              else
               $display(" 0+0+1=01 sum is RIGHT!");
    carry_in = 0; a = 1; b = 0;
    # 100 if ( carry_out !== 0 | sum !== 1)
               $display(" 0+1+0=01 sum is WRONG!");
              else
               $display(" 0+1+0=01 sum is RIGHT!");
    carry_in = 0; a = 1; b = 1;
    # 100 if ( carry_out !== 1 | sum !== 0)
                $display(" 0+1+1=10 sum is WRONG!");
              else
                $display(" 0+1+1=10 sum is RIGHT!");
    carry_in = 1; a = 0; b = 0;
    # 100 if ( carry_out !== 0 | sum !== 1)
                $display(" 1+0+0=01 sum is WRONG!");
              else
                $display(" 1+0+0=01 sum is RIGHT!");
    carry_in = 1; a = 0; b = 1;
    # 100 if ( carry_out !== 1 | sum !== 0)
                $display(" 1+0+1=10 sum is WRONG!");
              else
                $display(" 1+0+1=10 sum is RIGHT!");
    carry_in = 1; a = 1; b = 0;
    # 100 if ( carry_out !== 1 | sum !== 0)
                $display(" 1+1+0=10 sum is WRONG!");
              else
                $display(" 1+1+0=10 sum is RIGHT!");
    carry_in = 1; a = 1; b = 1;
    # 100 if ( carry_out !== 1 | sum !== 1)
                $display(" 1+1+1=11 sum is WRONG!");
              else
                $display(" 1+1+1=11 sum is RIGHT!");


    $finish;
  end
endmodule



module adder1_behavorial (carry_out, sum, a, b, carry_in);
 input a, b, carry_in;
 output carry_out, sum;
  assign sum = (~a&b&~carry_in)|(~carry_in&a&~b)|(a&b&carry_in)|(~a&~b&carry_in);
  assign carry_out = a&carry_in|a&b|b&carry_in;
endmodule

2015年11月4日 星期三

二位元 行為

  odule top;
  integer ia0,ia1,ib0,ib1,is;
  reg  a0,a1,b0,b1,s;
  wire out1,out2

  mux_behavioral mux1(out1,out2,a0,a1,b0,b1,s);

  initial
    begin
      for (ia0=0; ia0<=1; ia0 = ia0+1)
        begin
          a0 = ia0;
          for (ia1=0; ia1<=1; ia1 = ia1+ 1)
            begin
              a1 = ia1;
               for (ib0=0; ib0<=1; ib0 = ib0+1)
                 begin
                   b0 = ib0;
                   for (ib1=0; ib1<=1; ib1 = ib1+ 1)
                    begin
                     b1 = ib1;
                      for (is=0; is<=1; is = is + 1)
                       begin
                        s = is;
                 #100 $display("a0=%d a1=%d b0=%d b1=%d s=%d out1=%d out2=%d",a0,a1,b0,b1,s,out1,out2);
                       end
                    end
                  end
              end
         end
   end
endmodule

module mux_behavioral(OUT1,OUT2,A0,A1,B0,B1,SEL)
 output OUT1,OUT2;
 input A0,A1,B0,B1,SEL;
 wire  A0,A1,B0,B1,SEL;
 reg   OUT1,OUT2;

always @(A0 or A1 or B0 or B1 or SEL)
 begin
   OUT1 = (A0 & SEL)|(B0 & ~SEL );
   OUT2 = (A1 & SEL)|(B1 & ~SEL );
 end
endmodule

2015年10月28日 星期三

4位元多工器 不是合併的



module top;

wire A0, A1, A2, A3, B0, B1, B2, B3, OUT, SEL;

system_clock #12800 clock1(A0);
system_clock #6400  clock2(A1);
system_clock #3200  clock3(A2);
system_clock #1600  clock3(A3);
system_clock #800   clock4(B0);
system_clock #400   clock5(B1);
system_clock #200   clock6(B2);
system_clock #100   clock7(B3);
system_clock #50    clock8(SEL);

and a1 (c1,A0,SEL);
and a2 (c2,A1,SEL);
and a0 (c0,A2,SEL);
and a6 (c6,A3,SEL);
not N1 (cn,SEL);
and a3 (c3,cn,B0);
and a4 (c4,cn,B1);
and a5 (c5,cn,B2);
and a7 (c7,cn,B3);
or o0 (OUT1,c1,c3);
or o1 (OUT2,c2,c4);
or o2 (OUT3,c5,c0);
or o3 (OUT4,c6,c7);
endmodule
module system_clock(clk);
parameter PERIOD=100;
output clk;
reg clk;

initial clk=0;

always
 begin
#(PERIOD/2) clk=~clk;
 end

always@(posedge clk)
 if($time>1000)$stop;

endmodule

2015年10月21日 星期三

三位元多工器 1+2合併



module top;

wire [2:0]A, B, OUT;
wire SEL;
system_clock #3200 clock1(A[0]);
system_clock #1600 clock2(A[1]);
system_clock #800  clock3(A[2]);
system_clock #400  clock4(B[0]);
system_clock #200  clock5(B[1]);
system_clock #100  clock6(B[2]);
system_clock #50   clock7(SEL);


mux3 mi(OUT, A, B, SEL);

endmodule

module mux(OUT, A, B, SEL);
output OUT;
input A,B,SEL;
not I5 (sel_n, SEL);
and I6 (sel_a, A, SEL);
and I7 (sel_b, sel_n, B);
or I4 (OUT, sel_a, sel_b);
endmodule

module mux2(OUT, A, B, SEL);
output [1:0] OUT;
input [1:0] A,B;
input SEL;
mux hi (OUT[1], A[1], B[1], SEL);
mux lo (OUT[0], A[0], B[0], SEL);
endmodule



module mux3(OUT, A, B, SEL);
output [2:0] OUT;
input [2:0] A,B;
input SEL;
mux hi (OUT[1], A[1], B[1], SEL);
mux middle(OUT[2], A[2], B[2], SEL);
mux lo (OUT[0], A[0], B[0], SEL);
endmodule

module system_clock(clk);
parameter PERIOD=100;
output clk;
reg clk;

initial clk=0;

always
 begin
#(PERIOD/2) clk=~clk;
 end

always@(posedge clk)
 if($time>1000)$stop;


endmodule

2015年10月14日 星期三

二位元多工


module top;

wire A1, A0, B1, B0, SEL, OUT1, OUT2
system_clock #100 clock1(A1);
system_clock #200 clock2(A0);
system_clock #400 clock3(SEL);
system_clock #800 clock4(B1);
system_clock #1600 clock5(B0);

and a1 (c1,A1,SEL);
and a2 (c2,A0,SEL);
not N1 (cn,SEL);
and a3 (c3,cn,B1);
and a4 (c4,cn,B0);
or o1 (OUT1,c1,c3);
or o2 (OUT2,c2,c4);

endmodule

module system_clock(clk);
parameter PERIOD=100;
output clk;
reg clk;

initial clk=0;

always
 begin
#(PERIOD/2) clk=~clk;
 end

always@(posedge clk)
 if($time>1600)$stop;

endmodule

2015年10月7日 星期三

1位元


第三次上課

module top;

system_clock #400 clock1(A);

system_clock #200 clock2(B);

system_clock #100 clock3(SEL);

mux M1(OUT, A, B, SEL);

endmodule


module mux(OUT, A, B, SEL);

output OUT;

input A,B,SEL;

not I5 (sel_n, SEL) ;

and I6 (sel_a, A, SEL);

and I7 (sel_b, sel_n, B);

or I4 (OUT, sel_a, sel_b);

endmodule

module system_clock(clk);

parameter PERIOD=100;

output clk;

reg clk;

initial clk=0;

always

begin

#(PERIOD/2) clk=~clk;

end

always@(posedge clk)

if($time>1000)$stop;

endmodule           課本範例1                  2015.10.7

2015年9月23日 星期三

關於verilog

Verilog

在積體電路設計(特別是超大型積體電路的計算機輔助設計)的電子設計自動化領域中,Verilog是一種用於描述、設計電子系統(特別是數位電路)的硬體描述語言。Verilog是電氣電子工程師學會(IEEE)的1364號標準。
Verilog能夠在多種抽象級別對數位邏輯系統進行描述:既可以在電晶體級、邏輯閘級進行描述,也可以在暫存器傳輸級對電路訊號在暫存器之間的傳輸情況進行描述。除了對電路的邏輯功能進行描述,Verilog代碼還能夠被用於邏輯仿真、邏輯綜合,其中後者可以把暫存器傳輸級的Verilog代碼轉換為邏輯閘級的網表,從而方便在現場可程式邏輯門陣列上實現硬體電路,或者讓硬體廠商製造具體的特殊應用積體電路。設計人員還可以利用Verilog的擴展部分Verilog-AMS進行類比電路和混合訊號積體電路的設計。

來源:維基百科

CIC 數位IC認證

源起

  積體電路(IC)為通訊、資訊及消費性電子等3C產業朝向數位化、體積微小化之關鍵性零組件。歷年國內來諸多會議中,均將「提昇國內晶片設計之研究水準,培育晶片系統設計人才」列為重大議題。行政院科技部依據第四次全國科學技術會議之結論,於民國八十一年五月起推動「晶片設計製作中心」(Chip Implementation Center)籌設專案計畫,八十二年一月於新竹科學工業園區成立中心籌備工作小組。八十六年七月有鑑於科技發展趨勢,更名為「國家晶片系統設計中心」。為強化南部高科技研發環境,特於九十一年九月於台南科學工業園區設立南區辦公室,以發展與新竹科學園區相輔相成之前瞻研究,建立高科技技術及產業發展聚落。九十二年元月起為配合國家科學委員會所屬國家實驗室法人化作業,改隸於「財團法人國家實驗研究院」繼續推動各項業務工作。

中心目標

  本中心之設立宗旨為「培育積體電路晶片及系統設計人才、提昇積體電路晶片及系統設計技術」,期能強化我國積體電路晶片及系統設計能力。主要任務為:
(一) 建立積體電路晶片及系統設計環境。
(二) 提供積體電路晶片及系統設計雛型品之實作與測試服務。
(三) 推展積體電路晶片及系統設計之「產、學、研」合作研究,並將學術界之研究成果落實推廣至產業界。
(四) 推動國內外積體電路晶片及系統設計相關技術之合作與交流。

晶片及系統設計

  為了搭配學術研究需要以及產業未來發展,本中心引進多項產業界廣泛使用的晶片與系統設計的電腦輔助設計軟體,以及多項矽智財(IP)資料庫,免費提供學校申請使用,並分別針對前段設計、實體設計、快速雛形設計、系統技術設計、嵌入式軟體設計等的設計需求,整合設計軟體、規劃並建立完整的晶片及系統設計流程與環境,藉以提昇晶片及系統設計的效率,並且提供設計者於設計時所需的技術支援、訓練課程、快速雛形驗證環境與設計環境之維護等服務,包含了設計資料庫之整合、設計環境技術資料檔的建立、設計軟體之使用流程規劃與管理、軟體安裝更新與使用諮詢、 設計軟體與設計流程之訓練、伺服器之管理維護諮詢、快速雛形驗證設備之提供與技術支援、單晶片系統(System on a Chip)的整合設計環境、矽智財模組的規範與建立、軟硬體共同設計環境、驗證平台之建立、以及設計範例之提供等多項設計技術支援。

晶片製作及測試

  為達資源共享及有效節約成本,本中心自八十二年開始以「多計劃晶片」(Multi-Project Chip, MPC)方式,整合不同設計案於同一套光罩,並委由國內外晶圓廠製作後,依不同設計切割封裝,以提昇國內雛形品實作能力。為配合我國IC產業發展需求及培育晶片設計實作人才,本中心依年度規劃各類成熟及先進製程,建構製程相關之實作環境,進行相關軟體環境及元件庫驗證並提供下線諮詢服務,以協助教育性、前瞻性雛形品製作。因此,數位、類比或射頻晶片設計者皆可選擇適當之CMOS、BiCMOS或化合物半導體製程,以滿足各類晶片之設計需求。未來將進一步結合國外相關機構,推展國際性業務。 在晶片測試方面,為協助晶片雛形品驗證工作及降低測試設備重複投資,本中心設置有晶片測試實驗室,提供數位晶片、混合訊號及射頻晶片量測系統。目前擁有安捷倫(Agilent)93000測試系統供數位及混合信號晶片測試,以及MEMS測試環境: optical profiler, MEMS motion analyzer等。針對射頻電路設計,中心亦陸續建構高頻參數量測、射頻模型粹取、功率及雜訊量測及通訊晶片量測等系統,以提供元件至系統晶片之驗證。量測實驗室亦提供電路板雕刻機、打線機等後段製作服務。

教育訓練及推廣

  為培訓晶片及系統設計人才,中心每年利用寒暑假期針對各種不同設計方式對學術界分別開設Full Custom IC design、Cell-Based IC design、FPGA design、RF/MM design、CMOS MEMS、IC Testing、SoC design及 Embedded Software開發等訓練課程。除學術界訓練課程之外,亦開設E-Learning訓練課程,以減低人才培訓的成本,縮短學習曲線。另外也邀請國內外專家學者開設進階的訓練課程及研討會。此外中心定期出版相關刊物,供學術界與業界參考。為使各種資訊交流更為便利有效,本中心設有網站(http://www.cic.org.tw) 以提供技術諮詢與交流、晶片設計軟體申請與下載、 晶片製作申請與製程資料下載、儀器設備預約、上課報名… 等各類服務。另外也出版Enews、年報、各種訓練教材、晶片設計成果論文集、研討會論文集等出版品供各界參考使用。

未來展望

  過去幾年來「國家晶片系統設計中心」的工作重點在於協助學術界建立晶片及系統的設計與實作環境並提昇設計技術,主要偏重在基礎的技術開發與服務。未來除持續培育晶片系統設計優質人才與提昇晶片系統設計前瞻技術外,亦將配合產業未來發展需求,與各界合作研發晶片及系統設計相關的前瞻技術,使「國家晶片系統設計中心」成為「學術界研究、產業界發展的重要資源及具國際地位的技術研發機構」,達成世界級國家實驗室的願景,成為晶片系統設計研發與服務的重鎮。



來源:http://www.cic.narl.org.tw/aboutus/p1-about.jsp

Verilog 考證照

■ 考試費用:學科筆試與術科實作合報2000元(推廣期間業界人士八折優惠,學生六折優惠,團體報名另有優惠)
■ 證照重要性與舉辦目的:
    (1)考生具備熟悉數位電路邏輯設計之各種輔助工具與設計流程(包含Verilog coding, logic synthesis, simulation, DFT, FEC, STA, cell library…等等)。
    (2)考生具備Verilog硬體描述語言設計IC能力。
    (3)鑑定成績可提供各校參考做為未來學生畢業之條件。
    (4)鑑定成績可提供未來學生入學面試及工作面試的能力依據。
    (5)鑑定及格之考生可證明自己在數位IC設計上擁有基本的知識與專業能力。
 
■ 報考資格:
    (1)大專以上在學學生
    (2)業界人士(已經或想要從事設計相關產業之工程師)
 
■ 測驗內容:(詳細內容依簡章公告為主)
科目鑑定內容
學科筆試 以數位電路邏輯設計概念(包含大專院校教科書之Digital System, Logic Design, Logic Synthesis and Verification, VLSI Testing…等)、Verilog語法以及數位IC設計EDA工具流程為主;內容包含:
 1. Logic design
 2. Verilog coding
 3. Logic Synthesis
 4. Logic Verification
 5.Testing
 6.Power & Timing Analysis
術科實作由主辦單位提供指定題目、設計規格、設計方塊圖及相對應之測試向量,考生在考試時間內利用標準元件數位電路設計方式完成符合規格之晶片設計。
術科實作評分之4個主要項目為:
(A)Verilog coding須符合題目所要求之功能規格
(B)Verilog coding須通過主辦單位所提供之nLint rule檢查
(C)邏輯合成後之gate-level simulation驗證完全無誤
(D)電路合成軟體時序分析驗證須符合題目所要求之規格
 
■ 測驗題型:
測驗項目學科筆試術科實作
題數502
作答時間100分鐘300分鐘
測驗內容選擇 50 題基礎 1 題,進階 1 題
 
■ 合格標準:
筆試成績需達 80 分以上,術科成績需達 70 分以上,可取得授證資格。
■ 實作成績分佈說明:
實作成績說明

AND邏輯閘