วันศุกร์ที่ 7 พฤศจิกายน พ.ศ. 2557

การทดลองที่ 1.1 สำหรับบอร์ด FPGA


วัตถุประสงค์

-          ฝึกการสร้างวงจรบนโปรแกรม Altera และเปลี่ยนจากวงจรเป็นโค้ด VHDL
-          ทดลองเขียนโค้ด VHDL เพื่อรันบนบอร์ด FPGA
-          ศึกษาการทำงานของโปรแกรมโดยขึ้นอยู่กับ Slide Switches บนบอร์ด FPGA

คำสั่ง จงออกแบบวงจร 3-to-8 decoder มีทำงานตามข้อกำหนดต่อไปนี้

- มีอินพุต A(2:0) และเอาต์พุต Y(7:0)
ถ้า A(2:0) = "000" จะได้ Y(7:0) = "00000001"
ถ้า A(2:0) = "001" จะได้ Y(7:0) = "00000010"
ถ้า A(2:0) = "010" จะได้ Y(7:0) = "00000100"
ถ้า A(2:0) = "111" จะได้ Y(7:0) = "10000000"
- อินพุต A(2:0) ให้ใช้สวิตช์เลื่อน (Slide Switches) บนบอร์ด FPGA
- เอาต์พุต Y(7:0) ให้ใช้ LEDs บนบอร์ด FPGA

การออกแบบวงจร ให้ใช้วิธีดังต่อไปนี้ (สร้าง Design Project สำหรับแต่ละกรณี)

   1.1) ใช้วิธีวาดวงจร โดยใช้ลอจิกเกตพื้นฐาน อย่างเช่น AND, OR, NOT  





 โค้ดที่ได้จากการสร้างวงจรลอจิกพื้นฐาน

CODE….

LIBRARY ieee;
USE ieee.std_logic_1164.all;
LIBRARY work;
ENTITY decoder3_to_8 IS
            PORT
            (
                        A2 :  IN  STD_LOGIC;    //input ของระบบโดยรับมาจากสวิตซ์เลื่อนจำนวน 3 บิต
                        A1 :  IN  STD_LOGIC;
                        A0 :  IN  STD_LOGIC;
                        Y7 :  OUT  STD_LOGIC;   //output ของระบบแสดงผลออกทาง LED จำนวน 8 ดวง
                        Y6 :  OUT  STD_LOGIC;
                        Y0 :  OUT  STD_LOGIC;
                        Y1 :  OUT  STD_LOGIC;
                        Y2 :  OUT  STD_LOGIC;
                        Y3 :  OUT  STD_LOGIC;
                        Y4 :  OUT  STD_LOGIC;
                        Y5 :  OUT  STD_LOGIC
            );
END decoder3_to_8;

ARCHITECTURE bdf_type OF decoder3_to_8 IS

SIGNAL SYNTHESIZED_WIRE_12 :  STD_LOGIC;
SIGNAL SYNTHESIZED_WIRE_13 :  STD_LOGIC;
SIGNAL SYNTHESIZED_WIRE_14 :  STD_LOGIC;

BEGIN

    SYNTHESIZED_WIRE_12 <= NOT(A2);  // Input ค่าตรงกันข้ามกับค่าที่รับเข้ามาทางสวิตซ์ของ A2
    SYNTHESIZED_WIRE_13 <= NOT(A1); // Input ค่าตรงกันข้ามกับค่าที่รับเข้ามาทางสวิตซ์ของ A1
    SYNTHESIZED_WIRE_14 <= NOT(A0)// Input ค่าตรงกันข้ามกับค่าที่รับเข้ามาทางสวิตซ์ของ A0
            //แสดงผลออกทาง Output Y0 – Y7
    Y7 <= SYNTHESIZED_WIRE_12 AND SYNTHESIZED_WIRE_13 AND SYNTHESIZED_WIRE_14;       
    Y6 <= A2 AND SYNTHESIZED_WIRE_13 AND SYNTHESIZED_WIRE_14;              
    Y5 <= SYNTHESIZED_WIRE_12 AND A1 AND SYNTHESIZED_WIRE_14;
    Y4 <= A2 AND A1 AND SYNTHESIZED_WIRE_14;
    Y3 <= SYNTHESIZED_WIRE_12 AND SYNTHESIZED_WIRE_13 AND A0;
    Y2 <= A2 AND SYNTHESIZED_WIRE_13 AND A0;
    Y1 <= SYNTHESIZED_WIRE_12 AND A1 AND A0;
    Y0 <= A2 AND A1 AND A0;

END bdf_type;


1.2 )  ใช้ภาษา VHDL ในการออกแบบ

CODE….
library ieee;
use ieee.std_logic_1164.all;
entity decoder3_to_8 is
port(
    A : in std_logic_vector( 2 downto 0 );   //input ของระบบโดยรับมาจากสวิตซ์เลื่อน จำนวน 3บิต
    Y : out std_logic_vector( 7 downto 0 )   //output ของระบบแสดงผลออกทาง LED จำนวน 8 บิต
);
end decoder3_to_8;
architecture dataflow of decoder3_to_8 is
begin
//แสดงผล Output  (Y)
     Y <= "00000001" when ( A = "000" )      //จะแสดงผล  "00000001" เมื่อมี input เป็น "000"
     else "00000010" when ( A = "001" )        //จะแสดงผล  "00000010" เมื่อมี input เป็น "001"
     else "00000100" when ( A = "010" )        //จะแสดงผล  "00000100" เมื่อมี input เป็น "010"
     else "00001000" when ( A = "011" )        //จะแสดงผล  "00001000" เมื่อมี input เป็น "011"
     else "00010000" when ( A = "100" )        //จะแสดงผล  "00010000" เมื่อมี input เป็น "100"
     else "00100000" when ( A = "101" )        //จะแสดงผล  "00100000" เมื่อมี input เป็น "101"
     else "01000000" when ( A = "110" )        //จะแสดงผล  "01000000" เมื่อมี input เป็น "110"
     else "10000000" when ( A = "111" )        //จะแสดงผล  "10000000" เมื่อมี input เป็น "111"
     else "- - - - - - - -";                              //จะไม่มีการแสดงผลใดๆ
end dataflow;

1.3 ) ทดลองในบอร์ด FPGA และเขียนรายงานการทดลอง



กำหนดพอร์ตให้แก่ Output และ Input เพื่อเชื่อมต่อระหว่างตัวโปรแกรมกับบอร์ด FPGA

Node Name
Location
I/O standard
Reserved
A[2]
PIN_25
3.3-V LVTTL

A[1]
PIN_24
3.3-V LVTTL

A[0]
PIN_23
3.3-V LVTTL

Y[7]
PIN_50
3.3-V LVTTL

Y[6]
PIN_49
3.3-V LVTTL

Y[5]
PIN_46
3.3-V LVTTL

Y[4]
PIN_44
3.3-V LVTTL

Y[3]
PIN_43
3.3-V LVTTL

Y[2]
PIN_42
3.3-V LVTTL

Y[1]
PIN_39
3.3-V LVTTL

Y[0]
PIN_38
3.3-V LVTTL

LCD_E
PIN_54
3.3-V LVTTL
As output driving ground
ตารางที่กำหนดพอร์ตต่างๆเพื่อเชื่อมต่อกับบอร์ด FPGA


รูปภาพของการแสดงผลออกจากบอร์ด FPGA
                        
                         

  INPUT FORM SWITCH IS “000”                     INPUT FORM SWITCH IS “001”
                        
                     

INPUT FORM SWITCH IS “010”                      INPUT FORM SWITCH IS “011”
                       
                      
 INPUT FORM SWITCH IS “100”                      INPUT FORM SWITCH IS “101”

                      
                       

INPUT FORM SWITCH IS “110”                       INPUT FORM SWITCH IS “111”

ลิงค์ : คลิปแสดงผลการทดลอง

วันพฤหัสบดีที่ 16 ตุลาคม พ.ศ. 2557

การทดลองที่ 5.4 การเชื่อมต่อวงจรอิเล็กทรอนิกส์ด้วยแสง

วัตถุประสงค์
         
         1. รู้และเข้าใจคุณสมบัติและการทำงานของอุปกรณ์เชื่อมต่อทางแสง (PC817)
         2. ฝึกการต่อวงจรไฟฟ้าบนเบรดบอร์ดโดยใช้อุปกรณ์เชื่อมต่อทางแสงร่วมกับอุปกรณ์ทางอิเล็กทรอนิกส์อื่นๆ
         3. นำเอาวงจรที่ต่อมาประยุกต์ใช้กับบอร์ด Arduino เพื่อควบคุมการจ่ายกระแส
         
         
รายการอุปกรณ์
         
         1. แผงต่อวงจร (เบรดบอร์ด) 1 อัน
         2. อุปกรณ์เชื่อมต่อทางแสง PC817 1 ตัว
         3. ไดโอดเปล่งแสงสีแดงหรือสีเขียว 1 ตัว
         4. ตัวต้านทาน 220Ω หรือ 330Ω 1 ตัว
         5. ทรานซิสเตอร์ NPN เบอร์ PN2222A 1 ตัว
         6. ตัวต้านทาน 1kΩ 1 ตัว
         7. ตัวต้านทาน 4.7kΩ 1 ตัว
         8. ตัวต้านทาน 10kΩ 1 ตัว
         9. ตัวต้านทานปรับค่าได้ 10kΩ หรือ 20kΩ 1 ตัว
         10. ไดโอด 1N400x 1 ตัว
         11. มอเตอร์ไฟฟ้ากระแสตรงขนาดเล็ก 1 ตัว *
         12. สายไฟสำหรับต่อวงจร 1 ชุด
         13. มัลติมิเตอร์ 1 เครื่อง
         14. แหล่งจ่ายแรงดันควบคุม 1 เครื่อง
         15. ออสซิลโลสโคปแบบดิจิทัล 1 เครื่อง

ขั้นตอนการทดลอง
         1. ต่อวงจรบนเบรดบอร์ดตามรูปที่ 5.4.1 ให้สังเกตว่า ในผังวงจรมี GND1 และ GND2 แยกกันซึ่งจะต้องไม่นำมาต่อเข้าด้วยกันโดยเด็ดขาด

         2. ให้ใช้แรงดันไฟเลี้ยง +5V และ GND1 ให้ใช้จากบอร์ด Arduino แต่สำหรับ +9V และ GND2ให้ใช้จากแหล่งจ่ายแรงดันควบคุม




         3. เขียนโค้ด Arduino โดยสร้างสัญญาณแบบ PWM โดยใช้คำสั่ง analogWrite() เพื่อสร้างสัญญาณเอาต์พุตที่ขา D5 โดยปรับค่า Duty Cycle ของสัญญาณเอาต์พุตตามค่าที่อ่านได้จากตัวต้านทานปรับค่าได้ ซึ่งต่อเป็นอินพุตที่ขา A1




Code

byte const D5=5;//output to breadboard
byte const R=A1;
double val = 0; 

void setup() {
   pinMode(D5,OUTPUT);
   pinMode(R,INPUT);
   analogReference(DEFAULT);
   Serial.begin(9600);
}

void loop() {
   val = analogRead(R);
   val = map(val, 0, 1023, 0, 255);
   analogWrite(D5,val);
   val = val/255.0*100;
   Serial.println(val);
   delay(300);
}

         4. ใช้ออสซิลโลสโคปวัดสัญญาณที่ขา E ของ PC817 เทียบกับ GND2 แล้วทดลองหมุนปรับที่ตัวต้านทานปรับค่าได้ เพื่อปรับค่า Duty Cycle เป็น 0% 25% 50% และ 100% ตามลำดับบันทึกรูปคลื่นสัญญาณที่ได้ในแต่ละกรณี


    
ใช้สายโพรบวัดสัญญาณที่ขา E ของ PC817 เทียบกับ GND2


   
หมุนปรับตัวต้านทานปรับค่าได้จนมีค่า Duty cycle เป็น 0%


  
หมุนปรับตัวต้านทานปรับค่าได้จนมีค่า Duty cycle เป็น 25%



หมุนปรับตัวต้านทานปรับค่าได้จนมีค่า Duty cycle เป็น 50%


หมุนปรับตัวต้านทานปรับค่าได้จนมีค่า Duty cycle เป็น 0%


         5. ทดลองเปลี่ยนจาก LED และตัวต้านทาน เป็นมอเตอร์ไฟฟ้ากระแสตรงขนาดเล็ก (ปรับแรงดันไฟเลี้ยงจาก +9V ให้เป็นแรงดันไฟเลี้ยงที่เหมาะสมกับมอเตอร์ไฟฟ้า +VM) โดยต่อวงจรตามรูปที่ 5.4.2 และทดลองปรับค่า Duty Cycle

         6. เขียนรายงานการทดลอง ซึ่งประกอบด้วยคำอธิบายการทดลองตามขั้นตอน ผังวงจรที่ถูกต้อ
ครบถ้วนตามหลักไฟฟ้า (ให้วาดด้วยโปรแกรม Cadsoft Eagle) รูปถ่ายของการต่อวงจรบน
เบรดบอร์ด

วิดีโอผลการทดลอง :