วันพุธที่ 27 พฤษภาคม พ.ศ. 2558

การทดลองที่ 6 ใช้ IP core สำหรับ 16x2 LCD ที่มีอยู่บนบอร์ด FPGA เพื่อแสดงข้อความ "Hello World!"

ซอฟท์แวร์ที่ใช้
1. Altera Quartus II 13.1 (32-bit) Web Edition- ModelSim 
2. Altera 10.1d (Quartus II 13.1)



อุปกรณ์
1. บอร์ด Altera FPGA (WARRIOR CYCLONE3 DEV) ชิปหมายเลข EP3C10E144C8  1 บอร์ด
2. สายดาวน์โหลด ByteBlaster II Cable หรือ สายดาวน์โหลดUSB Blaster Cab              1 ชุด
3. เครื่องคอมพิวเตอร์                                                                                                 2 ชุด
4. ออสซิลโลสโคป                                                                                                 1 เครื่อง



ขั้นตอนการทดลอง
1.เข้า web Opencores.org  เพื่อ ดาวน์โหลด IP core 
2.ทำการแก้ไขเพื่อให้แสดงข้อความ  "Hello World!" โดยใช้รหัส ASCII
3.คอมไพล์โค้ดที่แก้ไขเสร็จแล้ว จากนั้นทำการ assignment pin ของ 16x2 LCD ตามเอกสาร datasheet







Code VHDL  (ส่วนที่แสดงผลบนจอ)





Code VHDL  (LCD ที่ทำเป็น bit IP)





ผลการสังเคราห์วงจร




Pin Planer






ขั้นตอนการทดลองและผลการทำงาน  
รูปภาพการทดลอง



วันพฤหัสบดีที่ 30 เมษายน พ.ศ. 2558

การทดลองที่ 5 ออกเเบบวงจรดิจิทัลสำหรับส่งตัวอักษร 'a' ผ่าน UART ไปยังคอมพิวเตอร์


โจทย์ปฎิบัติ
         สร้างวงจรดิจิทัลเพื่อส่งตัวอักษร 'a' ผ่าน UART ไปยังคอมพิวเตอร์ เมื่อกดปุ่มแล้วปล่อยในแต่ละครั้ง โดยใช้ค่า baudrate เท่ากับ 9600 (เน้นส่งข้อมูลไบต์จาก FPGA ไปยังคอมพิวเตอร์เท่านั้น ยังไม่ต้องรับข้อมูล)


อุปกรณ์
1. บอร์ด Altera FPGA (WARRIOR CYCLONE3 DEV) ชิปหมายเลข EP3C10E144C8   1 บอร์ด
2. สายดาวน์โหลด ByteBlaster II Cable หรือ สายดาวน์โหลดUSB Blaster Cab              1 ชุด
3. เครื่องคอมพิวเตอร์                                                                                            2 ชุด
4. ออสซิลโลสโคป                                                                                               1 เครื่อง
5. USB to TLL                                                                                                    1 ชุด



ซอฟท์แวร์ที่ใช้
1. Altera Quartus II 13.1 (32-bit) Web Edition- ModelSim 
2. Altera 10.1d (Quartus II 13.1)
3. PuTTY


เเนวความคิด





กำหนดให้ baudrate = 1/9600 s และหารด้วยคาบของ CLK = 1/50MHz
จะได้ baudrate ประมาณ  5200 ซึ่งเป็นช่วงในการส่งข้อมูล 1 bit
ในการส่งข้อมูลจะเรึ่มส่งจาก start bit  ซึ่งเท่ากับ logic 0 ตามด้วย ตัวอักษร a (10000110 ตามลาดับ) แล้วส่ง stop bit ซึ่งเท่ากับ logic 1


Code VHDL 




Code VHDL Test branch






ผลการจำลองการทำงานด้วย Modelsim





รูปที่ 1
จากรูปที่ 1 
เมื่อกดปุ่มกดเเล้วปล่อยปุ่มกดจะเเสดง 0(start bit)1000110(ตัวอักษร a เเบบ)1(stop bit) ตามลำดับ



ผลการสังเคราห์วงจร



Pin Planer


ขา I/O ของวงจรมีดังนี้
clk           ต่อกับขา หมายเลข 22  เป็น input clock
PB           ต่อกับขา หมายเลข 88  เป็น input ของ ปุ่มกด
TX            ต่อกับขา หมายเลข 67  เป็น output ของข้อมูลทั้งหมดที่ส่งผ่าน uart


ขั้นตอนการทดลองและผลการทำงาน  
รูปภาพการทดลอง


วัด output ของข้อมูลทั้งหมดที่ส่งผ่าน uart





การต่อ USB to TLL  กับ Notebook 



รูปคลื่นสัญญาณ

ความต่างศักย์ไฟฟ้า เท่ากับ 3.8 v,คาบ เท่ากับ 524 us




Video การทดลอง





จะเห็นตัวอักษร a ชัดเจนมากขึ้น 

เมื่อกดปุ่มการตั้งค่า เเล้วไปที่ช่องคุณภาพ เลือก 1080pHD

วันเสาร์ที่ 4 เมษายน พ.ศ. 2558

การทดลองที่ 4 ออกแบบวงจรดิจิทัลสำหรับ 4x4 Keypad

อุปกรณ์
1. บอร์ด Altera FPGA (WARRIOR CYCLONE3 DEV) ชิปหมายเลข EP3C10E144C8   1 บอร์ด
2. สายดาวน์โหลด ByteBlaster II Cable หรือ สายดาวน์โหลดUSB Blaster Cab               1 ชุด
3. เครื่องคอมพิวเตอร์                                                                                             1 ชุด
4. ออสซิลโลสโคป                                                                                                1 เครื่อง
5. 4x4 keypad                                                                                                     1 ชุด
6. ตัวต้านทาน  330 Ω                                                                                            3 ตัว
7. ตัวต้านทาน  1.5 KΩ                                                                                           3 ตัว



ซอฟท์แวร์ที่ใช้
1. Altera Quartus II 13.1 (32-bit) Web Edition- ModelSim 
2. Altera 10.1d (Quartus II 13.1)



เเนวความคิด




มีการตรวจสอบเเต่ละเเถว(row)ของ 4x4 Keypad  ตามตัวนับ(count)ที่ตั้งไว้ ถ้ากดปุ่มใดปุ่มหนึ่งของ 4x4 Keypad  จะรู้ว่าอยู่ในหลัก(colum)ใด  เมื่อรู้หลักเเละเเถวเเล้วจะรู้ว่าปุ่มที่กดเป็นตัวเลขหรือสัญลักษณ์อะไร



Code VHDL





Code VHDL Test branch






ผลการสังเคราห์วงจร






ผลการจำลองการทำงานด้วย Modelsim



รูปที่ 1
จากรูปที่ 1 
เมื่อกดหมายเลข  1(row 1),4(row 2),7(row 3) เเละสัญลักษณ์  *(row 4) จาก colum[3] (1000) ตามลำดับ
led จะเเสดง  00000001,00001000,01000000,10000001 ตามลำดับ





รูปที่ 2
จากรูปที่ 2
เมื่อกดหมายเลข  2(row 1),5(row 2),8(row 3) เเละ  0(row 4) จาก colum[2] (0100) ตามลำดับ
led จะเเสดง  00000010,00010000,10000000,00000000 ตามลำดับ




รูปที่ 3
จากรูปที่ 3
เมื่อกดหมายเลข  3(row 1),6(row 2),9(row 3) เเละสัญลักษณ์  #(row 4) จาก colum[1] (0010) ตามลำดับ
led จะเเสดง  00000100,00100000,11111111,00011000 ตามลำดับ




รูปที่ 4
จากรูปที่ 4
เมื่อกดสัญลักษณ์  A(row 1),B(row 2),C(row 3) ,  D(row 4) จาก colum[0] (0001) ตามลำดับ
led จะเเสดง  00000011,00001100,00110000,11000000 ตามลำดับ




Pin Planer



ขา I/O ของวงจรมีดังนี้
Buzzer    ต่อกับขา หมายเลข 34  เป็น output เสียง Buzzer 
clk           ต่อกับขา หมายเลข 22  เป็น input clock
colum[3]   ต่อกับขา หมายเลข 99  เป็น input ของ 4x4 Keypad หมายเลข  1,4,7 เเละสัญลักษณ์  *
colum[2]   ต่อกับขา หมายเลข 86  เป็น input ของ 4x4 Keypad หมายเลข  2,5,8,0
colum[1]   ต่อกับขา หมายเลข 84  เป็น input ของ 4x4 Keypad หมายเลข  3,6,9 เเละสัญลักษณ์  #
colum[0]   ต่อกับขา หมายเลข 80  เป็น input ของ 4x4 Keypad สัญลักษณ์  A,B,C,D
led[7]       ต่อกับขา หมายเลข 50  เป็น output ของ led fpga ดวงเเรกจากซ้ายสุด
led[6]       ต่อกับขา หมายเลข 49  เป็น output ของ led fpga ดวงที่สองจากซ้ายสุด
led[5]       ต่อกับขา หมายเลข 46  เป็น output ของ led fpga ดวงที่สามจากซ้ายสุด
led[4]       ต่อกับขา หมายเลข 44  เป็น output ของ led fpga ดวงที่สี่จากซ้ายสุด
led[3]       ต่อกับขา หมายเลข 43  เป็น output ของ led fpga ดวงที่ห้าจากซ้ายสุด
led[2]       ต่อกับขา หมายเลข 42  เป็น output ของ led fpga ดวงที่หกจากซ้ายสุด
led[1]       ต่อกับขา หมายเลข 39  เป็น output ของ led fpga ดวงที่เจ็ดจากซ้ายสุด
led[0]       ต่อกับขา หมายเลข 38  เป็น output ของ led fpga ดวงสุดท้ายจากซ้ายสุด
row[3]      ต่อกับขา หมายเลข 143  เป็น output ของ row1 หมายเลข  1,2,3 เเละสัญลักษณ์  A
row[2]      ต่อกับขา หมายเลข 141  เป็น output ของ row2 หมายเลข  4,5,6 เเละสัญลักษณ์  B
row[1]      ต่อกับขา หมายเลข 137  เป็น output ของ row3 หมายเลข  7,8,9 เเละสัญลักษณ์  C
row[0]      ต่อกับขา หมายเลข 135  เป็น output ของ row4 สัญลักษณ์   *,หมายเลข  0,สัญลักษณ์ #, D
ground    ต่อกับขา หมายเลข 54  เป็น output ground ของ led fpga 


 ขั้นตอนการทดลองและผลการทำงาน    
 รูปภาพการทดลอง

ภาพรวมของวงจรของ4x4 Keypad 





Video การทดลอง


วันเสาร์ที่ 21 กุมภาพันธ์ พ.ศ. 2558

การทดลองที่ 3 ออกแบบวงจรดิจิทัลสร้างสัญญาณ PWM ควบคุมการทำงานของ WS2812 RGB LED โดยใช้ภาษา VHDL (แบ่งเป็น Components)


โจทย์ข้อที่ 3
นำวงจรเดิม (WS2812 RGB LED) ที่ได้ออกแบบไว้ด้วยภาษา VHDL ในการทดลองที่ 2 มาแก้ไข โดยแบ่งวงจรเดิม (design partitioning) ในระดับ top-level design ให้มีหรือประกอบด้วย component อย่างน้อย 3 ส่วน และออกแบบแต่ละส่วน ให้สามารถนำกลับมาใช้ได้อีก (design for reuse) และเมื่อนำมาร่วมกัน ยังสามารถทำงานได้ตามเดิม อธิบายการทำงานของแต่ละส่วนว่า มีอินเทอร์เฟส (interface) หลักการทำงาน และใช้เพื่อวัตถุประสงค์ในวงจร + การจำลองการทำงาน (Simulation) ของแต่ละส่วนด้วย VHDL Testbench (Unit Testing) และใช้ VHDL testbench เดิมทดสอบระบบรวม (Integration Testing)
โจทย์ข้อที่ 2
2) จงออกแบบวงจรดิจิลัทโดยใช้ภาษา VHDL สำหรับนำไปสร้างเป็นวงจรในชิป FPGA โดยใช้บอร์ดที่      มีอยู่ใน   ห้องแล็ป
     2.1) วงจรดิจิทัลมี I/O ดังนี้
          - CLK (input) มีความถี่ 50MHz ใช้สำหรับกำหนดจังหวะการทำงานของวงจรทั้งหมด

            (เป็นการออกแบบวงจรดิจิทัลแบบ Synchronous Design)
         -  RST_B (input) เป็นอินพุตสำหรับใช้รีเซตแบบ Asynchronous สำหรับการทำงานของวงจร

            โดยรวม (ทำงานแบบ Active-Low) ซึ่งได้จากวงจรปุ่มกด (Push Button)
         -  PB (input) เป็นอินพุตจากปุ่มกด 1 ปุ่ม ทำงานแบบ Active-low เพื่อใช้ในการเปลี่ยน
            สีของ WS2812 RGB LED จำนวน 1 ดวง
         -  DATA (output) เป็นเอาต์พุตสำหรับนำไปควบคุมการทำงานของ WS2812 RGB LED เพียง
            1  ดวง ซึ่งเป็นสัญญาณตามข้อกำหนดของชิป WS2812 เพื่อส่งข้อมูลจำนวน 24 บิต
    2.2) พฤติกรรมการทำงานเป็นดังนี้
         - เมื่อเริ่มต้นหรือกดปุ่มรีเซต (RST_B) จะทำให้ค่าสีเป็น 0x000000 (24 บิต) และส่งออก

            ไปยัง WS2812 RGB LED หนึ่งครั้ง
         - เมื่อมีการกดปุ่ม PB แล้วปล่อยในแต่ละครั้ง จะมีการเปลี่ยนค่าสี 24 บิต แล้วส่งออกไปยัง        

             RGB LED ใหม่หนึ่งครั้ง ตามลำดับดังนี้ 0x000000 -> 0x0000FF -> 0x00FF00
              -> 0xFF0000 แล้ววนซ้ำ
   2.3) แนวทางการออกแบบและทดสอบ
        -  ออกแบบวงจรโดยใช้ภาษา VHDL
        -  เขียน VHDL Testbench เพื่อทดสอบการทำงาน และจำลองการทำงาน
        -  ทดสอบการทำงานในบอร์ด FPGA แล้ววัดสัญญาณโดยใช้ออสซิลโลสโคป
       -   บันทึกผลและเขียนรายงานการทดลอง




อุปกรณ์

1. บอร์ด Altera FPGA (WARRIOR CYCLONE3 DEV) ชิปหมายเลข EP3C10E144C8   1 บอร์ด
2. สายดาวน์โหลด ByteBlaster II Cable หรือ สายดาวน์โหลดUSB Blaster Cab                1 ชุด
3. เครื่องคอมพิวเตอร์                                                                                                       1 ชุด
4. ออสซิลโลสโคป                                                                                                          1 เครื่อง
5. สายวัด Logic Analyzer                                                                                               1 เส้น
6. WS2812 RGB LED                                                                                                   1 ดวง



ซอฟท์แวร์ที่ใช้
1. Altera Quartus II 13.1 (64-bit) Web Edition- ModelSim 

2. Altera 10.1d (Quartus II 13.1)





เเนวความคิดในการออกแบบ

 Block diagram


นำวงจรเดิม (WS2812 RGB LED) ที่ได้ออกแบบไว้ด้วยภาษา VHDL มาแก้ไข โดยแบ่งวงจรเดิม (design partitioning) ในระดับ top-level design ให้มีหรือประกอบด้วย component อย่างน้อย 3 ส่วน โดยทางกลุ่มได้ออกแบบเป็นสามส่วนดังต่อไปนี้


ส่วนที่ 1 (a1) เป็นส่วนของปุ่มกดเเละปุ่ม reset 
input
clk     เป็น clock cycle
pb     เป็น ปุ่มกด
rst_b เป็น ปุ่ม reset
output
add   เป็นการ cheak การกด ปุ่มกด ถ้ากด ปุ่มกด add จะเป็น 1 ไม่กด ปุ่มกด add จะเป็น 0
re      เป็นการ cheak การกด ปุ่มกด reset ถ้ากด ปุ่มกด reset  re จะเป็น 1
         ไม่กด ปุ่มกด reset  re จะเป็น 0
ส่วนที่ 2 (a2)  เป็นส่วนของการเปลี่ยนค่าสีของ  WS2812 RGB LED 24 บิต
input
clk     เป็น clock cycle
add   เป็นการ cheak การกด ปุ่มกด มาจากส่วนที่ 1 (a1)
re      เป็นการ cheak การกด ปุ่มกด reset มาจากส่วนที่ 1 (a1)
output
rgb    เป็น การเปลี่ยนค่าสีของ  WS2812 RGB LED 24 บิต
         เมื่อการกดแล้วปล่อย 1 ครั้ง จึงจะเปลี่ยนค่า สี WS2812 RGB LED 24 บิต เรียงลำดับตามนี้ 
         0x000000 -->0x0000FF --> 0x00FF00 --> 0xFF0000 แล้ววนซ้ำ หรือ กดปุ่ม reset 
         จะทำให้ ค่าสีเป็น 0x000000  

 
ส่วนที่ 3 (a3) เป็นส่วน data transfer time ของเเต่ละบิต
input
clk    เป็น clock cycle
rgb    เป็น การเปลี่ยนค่าสีของ  WS2812 RGB LED 24 บิต มาจากส่วนที่ 1 (a2)
output
data  เป็นการควบคุมการทำงานของ WS2812 RGB LED เพียง        1 ดวง ซึ่งเป็นสัญญาณตามข้อกำหนดของชิป WS2812 เพื่อส่งข้อมูลจำนวน 24 บิต
จากเอกสาร Datasheet ทำให้ทราบว่า เเต่ละบิตมี data transfer time
(นับตาม  clock  cycle) ไม่เท่ากัน ขึ้นอยู่ว่าบิตนั้นเป็น  logic 0 หรือ 1,ช่วง high หรือ low
หรือ เป็น reset บิตใหม่





จากโจทย์ที่ให้มา 1  clock  cycle  ใช้คาบ 20 ns เเละ จากตารางเมื่อนำเปรียบเทียบจะได้ว่า
                   20 ns  จะได้          1                 clock  cycle  
                   x   ns  จะได้   (1*x ns)/20ns     clock  cycle  
ดังนั้น
T0H(logic 0,ช่วง high) มี 0.35 us จะได้ 17.5 ประมาน 18 clock  cycle
T1H(logic 1,ช่วง high) มี 0.70 us จะได้  35 clock  cycle
T0L(logic 0,ช่วง low)  มี 0.80 us จะได้  40 clock  cycle
T1L(logic 1,ช่วง low)  มี 0.60 us จะได้  30 clock  cycle
RES   มี 50 us จะได้  2500  clock  cycle

 ทำการทดสอบย่อยของแต่ละส่วน แล้วนำสามส่วนที่ได้ออกแบบไว้นั้นมาใช้รวมกันในอีกหนึ่งไฟล์และทำการทดสอบรวม
โค้ด VHDL และ ผลการทดสอบการทำงานของแต่ละส่วนย่อย
 ส่วนที่ 1 (a1) เป็นส่วนของปุ่มกดเเละปุ่ม reset 

Code VHDL




Code VHDL Test branch





ผลการสังเคราห์วงจร



ผลการจำลองการทำงานด้วย Modelsim

กด ปุ่มกด add จะเป็น 1



 กด ปุ่มกด restart  re จะเป็น 1





ส่วนที่ 2 (a2)  เป็นส่วนของการเปลี่ยนค่าสีของ  WS2812 RGB LED 24 บิต

Code VHDL




Code VHDL Test branch




ผลการสังเคราห์วงจร



ผลการจำลองการทำงานด้วย Modelsim

เมื่อกดปุ่ม จะเปลี่ยน จาก x“000000”  เป็น  x“0000FF”




 เมื่อกดปุ่ม จะเปลี่ยน จาก x“0000FF”  เป็น  x“00FF00”





 เมื่อกดปุ่ม จะเปลี่ยน จาก x“00FF00”  เป็น  x“FF0000”





เมื่อกดปุ่ม จะเปลี่ยน จาก x“FF0000”  เป็น  x“000000”




เมื่อกดปุ่ม restart จะเป็น  x“000000”





 ส่วนที่ 3 (a3) เป็นส่วน data transfer time ของเเต่ละบิต

Code VHDL




Code VHDL Test branch




ผลการสังเคราห์วงจร



ผลการจำลองการทำงานด้วย Modelsim

ค่า data transfer time ของ  x“000000”



ค่า data transfer time ของ  x“0000FF




ค่า data transfer time ของ   x“00FF00”




 ค่า data transfer time ของ  x“FF0000”




ค่า data transfer time ของ  การ reset ค่าใหม่







การทำงานของวงจรรวม

Code VHDL



Code VHDL Test branch



ผลการสังเคราห์วงจร




ผลการจำลองการทำงานด้วย Modelsim

เมื่อกดปุ่ม จะเปลี่ยน จาก x“000000”  เป็น  x“0000FF”






เมื่อกดปุ่ม จะเปลี่ยน จาก x“0000FF”  เป็น  x“00FF00”





เมื่อกดปุ่ม จะเปลี่ยน จาก x“00FF00”  เป็น  x“FF0000”




เมื่อกดปุ่ม จะเปลี่ยน จาก x“FF0000”  เป็น  x“000000”



เมื่อกดปุ่ม restart จะเป็น  x“000000”




ค่า data transfer time ของ  x“000000”




ค่า data transfer time ของ  x“0000FF




ค่า data transfer time ของ   x“00FF00”




ค่า data transfer time ของ  x“FF0000”



ค่า data transfer time ของ  การ restart ค่าใหม่




Pin Planer

ขา I/O ของวงจรมีดังนี้
clk            ต่อกับขา หมายเลข 22  เป็น input clock
data         ต่อกับขา หมายเลข 75 เป็น output pwm
pb            ต่อกับขา หมายเลข 88  เป็น input ปุ่มกด

rst_b     ต่อกับขา หมายเลข 91 เป็น input ปุ่มกด restsrt


 ขั้นตอนการทดลองและผลการทำงาน    
 รูปภาพการทดลอง

ภาพรวมของวงจร โดยใช้ WS2812 RGB LED  1 ดวง




เมื่อกดปุ่มครั้งเเรก จะเปลี่ยน จาก x“000000” (ไม่มีสี) เป็น  x“0000FF” (สีน้ำเงิน)




เมื่อกดปุ่มครั้งที่สอง จะเปลี่ยน จาก x“0000FF” (สีน้ำเงิน) เป็น  x“00FF00” (สีเขียว)




เมื่อกดปุ่มครั้งที่สาม จะเปลี่ยน จาก x“00FF00” (สีเขียว) เป็น  x“FF0000” (สีเเดง)




รูปคลื่นสัญญาณจากออสซิลโลสโคป 

ไม่กดปุ่มจะได้ x“000000” (ไม่มีสี)






เมื่อกดปุ่มครั้งเเรก จะเปลี่ยน จาก x“000000” (ไม่มีสี) เป็น  x“0000FF” (สีน้ำเงิน)






เมื่อกดปุ่มครั้งที่สอง จะเปลี่ยน จาก x“0000FF” (สีน้ำเงิน) เป็น  x“00FF00” (สีเเดง) 





เมื่อกดปุ่มครั้งที่สาม จะเปลี่ยน จาก x“00FF00” (สีเเดง)  เป็น  x“FF0000” (สีเขียว)







เมื่อกดปุ่มครั้งที่สาม จะเปลี่ยน จาก 
x“FF0000” (สีเขียว)  เป็น  x“000000” (ไม่มีสี) 









เมื่อกดปุ่ม restart จะเป็น  x“000000” (ไม่มีสี)