Embedded สัปดาห์ที่ 7 Digital System

Digital System


ขั้นตอนดำเนินงานด้วย
ISE 14.2

               1. เปิดโปรแกรม ISE จะพบกับหน้าต่างโปรแกรม จากนั้นไปที่ File > New Project

                        ตั้งค่าตามภาพแล้วกด Next  แล้วกด Finish
    

            2.     New Source



          Coding and Implement แก้ไขส่วนของโปรแกรมตามโค้ดด้านล่าง

                       architecture Behavioral of Encoder is
                       begin
                             F <=       "0001" when (B='0' and A='0') else 
                                            "0010" when (B='0' and A='1') else 
                                            "0100" when (B='1' and A='0') else 
                                            "1000" ; 
                       end Behavioral;

            3.   Assigned Pin กำหนดขาอินพุตเอ้าพุต




         4.  Lode Program



   ทดสอบ
           1.     ใช้ Xilinx ISE 14.4 ด้วยโปรแกรม VHDL ในการสร้าง 2 to 4 Line Encoder
                  Code :
                       
                   library IEEE;
                   use IEEE.STD_LOGIC_1164.ALL;
 
                   entity Encoder is
                   Port (     B : in  STD_LOGIC;
                                  A : in  STD_LOGIC;
                                  F : out  STD_LOGIC_VECTOR (3 downto 0));
                   end Encoder;
 
                   architecture Behavioral of Encoder is
 
                   begin
                        F <=    "0001" when (B='0' and A='0') else  
                                     "0010" when (B='0' and A='1') else  
                                     "0100" when (B='1' and A='0') else  
                                     "1000" ;  
        
                  end Behavioral;
  
           2.   ใช้ Xilinx ISE 14.4 ด้วยโปรแกรม VHDL ในการสร้าง 7_Segment Encoder

                  Code  :
                        
                     library IEEE;
                     use IEEE.STD_LOGIC_1164.ALL;
                     entity Encoder is
                     Port (        Input : in STD_LOGIC_VECTOR (3 downto 0);
                                      F : out STD_LOGIC_VECTOR (6 downto 0));
                     end Encoder;
                     architecture Behavioral of Encoder is
                     begin
                     F <= "1111110" when Input="0000" else
                              "0110000" when Input="0001" else
                              "1101101" when Input="0010" else
                              "1111001" when Input="0011" else
                              "0110011" when Input="0100" else
                              "1011011" when Input="0101" else
                              "1011111" when Input="0110" else
                              "1110000" when Input="0111" else
                              "1111111" when Input="1000" else
                              "1111011" when Input="1001" else
                              "1110111" when Input="1010" else
                              "0011111" when Input="1011" else
                              "1001110" when Input="1100" else
                              "0111101" when Input="1101" else
                              "1001111" when Input="1110" else
                              "1000111" ;
                     end Behavioral;

            3.    จากโปรแกรมนับขึ้น 4 บิตด้วย VHDL ทดสอบกับ LED Logic Monitor 4 ดวง ให้ปรับปรุงโปรแกรมนี้เพื่อนับแบบเลข 8 บิต ทดสอบร่วมกับ 7_Segment Encoder ที่สร้างขึ้นจากข้อ 2 การแสดงผลจะเริ่มจาก 00 – FF

                Code  :
                      library ieee;
                      use ieee.std_logic_1164.all;
                      use ieee.std_logic_unsigned.all;
                      entity Counter is
                      Port ( clk : in STD_LOGIC;
                                reset : in STD_LOGIC;
                                Outport : out STD_LOGIC_VECTOR (6 downto 0);
                                Outport2 : out STD_LOGIC_VECTOR (6 downto 0));
                      end Counter;
                      architecture Behavioral of Counter is
                      signal pre_count: std_logic_vector(3 downto 0);
                      signal pre_count2: std_logic_vector(3 downto 0);
                      begin
                      process(clk, reset)
                      begin
                      if reset = '1' then
                             pre_count <= "0000";
                      elsif (clk='1' and clk'event) then
                             pre_count <= pre_count + "1";
                             if pre_count = "1111" then
                                   pre_count2 <= pre_count2 + "1";
                             end if;
                      end if;
                      end process;
                      Outport <= "1111110" when pre_count ="0000" else
                                         "0110000" when pre_count ="0001" else
                                         "1101101" when pre_count ="0010" else
                                         "1111001" when pre_count ="0011" else
                                         "0110011" when pre_count ="0100" else
                                         "1011011" when pre_count ="0101" else
                                         "1011111" when pre_count ="0110" else
                                         "1110000" when pre_count ="0111" else
                                         "1111111" when pre_count ="1000" else
                                         "1111011" when pre_count ="1001" else
                                         "1110111" when pre_count ="1010" else
                                         "0011111" when pre_count ="1011" else
                                         "1001110" when pre_count ="1100" else
                                         "0111101" when pre_count ="1101" else
                                         "1001111" when pre_count ="1110" else
                                         "1000111" ;
                     Outport2 <= "1111110" when pre_count2 ="0000" else
                                          "0110000" when pre_count2 ="0001" else
                                          "1101101" when pre_count2 ="0010" else
                                          "1111001" when pre_count2 ="0011" else
                                          "0110011" when pre_count2 ="0100" else
                                          "1011011" when pre_count2 ="0101" else
                                          "1011111" when pre_count2 ="0110" else
                                          "1110000" when pre_count2 ="0111" else
                                          "1111111" when pre_count2 ="1000" else
                                          "1111011" when pre_count2 ="1001" else
                                          "1110111" when pre_count2 ="1010" else
                                          "0011111" when pre_count2 ="1011" else
                                          "1001110" when pre_count2 ="1100" else
                                          "0111101" when pre_count2 ="1101" else
                                          "1001111" when pre_count2 ="1110" else
                                          "1000111" ;
                     end Behavioral;


           4.   ปรับวงจรนับเป็น Up-Down Counter 4 bit โดยมี สัญญาญ CU ควบคุมการนับ ทดสอบร่วมกับ 7_Segment Encoder ที่สร้างขึ้นจากข้อ 2 การแสดงผลระหว่าง 0 - F
                          · ควบคุมการนับและหยุดนับ          ถ้าเป็น 1 ให้นับต่อ         ถ้าเป็น 0 ให้หยุดนับ
                          · ควบคุมทิศทางการนับ                 ถ้าเป็น 1 ให้นับขึ้น         ถ้าเป็น 0 ให้นับลง

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity Counter is
         Port (    Clk : in  STD_LOGIC;
                      Enable : in  STD_LOGIC;
                      UpDown : in  STD_LOGIC;
                      Reset : in  STD_LOGIC;
                      Output : out  STD_LOGIC_VECTOR (6 downto 0));
end Counter;

architecture Behavioral of Counter is
signal pre_count: std_logic_vector(3 downto 0);
begin
process(Clk, Reset, Enable, UpDown)
begin
    if Reset = '1' then
              pre_count <= "0000";
    elsif (Clk='1' and Clk'event) then
              if Enable='1' then
                       if UpDown='1' then
                                pre_count <= pre_count + "1";
                       else
                                pre_count <= pre_count - "1";
                       end if;
              end if;
    end if;
end process; 
    Output <=  "1111110" when pre_count ="0000" else
                       "0110000" when pre_count ="0001" else
                       "1101101" when pre_count ="0010" else
                       "1111001" when pre_count ="0011" else
                       "0110011" when pre_count ="0100" else
                       "1011011" when pre_count ="0101" else
                       "1011111" when pre_count ="0110" else
                       "1110000" when pre_count ="0111" else
                       "1111111" when pre_count ="1000" else
                       "1111011" when pre_count ="1001" else
                       "1110111" when pre_count ="1010" else
                       "0011111" when pre_count ="1011" else
                       "1001110" when pre_count ="1100" else
                       "0111101" when pre_count ="1101" else
                       "1001111" when pre_count ="1110" else
                       "1000111" ;
end Behavioral;

           5.  ออกแบบ ALU(Arithmetic Logic Unit) โดยใช้ VHDL ให้มี Output F[3..0] และ Input A[1..0], B[1..0], C[2..0] กำหนดฟังก์ชันการทำงาน ดังนี้

C[2..0]
Logic Function

C[2..0]
Math Function
000
F = not A

100
F = A plus B
001
F = A OR B

101
F = A minus B
010
F = A AND B

110
F = -A
011
F = A XOR B

111
F = A plus 1

      Code :
                library IEEE;
                use IEEE.STD_LOGIC_1164.ALL;
                Use ieee.std_logic_unsigned.all;
                Use ieee.std_logic_arith.all;
                use IEEE.NUMERIC_STD.ALL;
                entity Encoder is
                Port (   C : in STD_LOGIC_VECTOR (2 downto 0);
                            iA : in STD_LOGIC_VECTOR (1 downto 0);
                            iB : in STD_LOGIC_VECTOR (1 downto 0);
                            F : out STD_LOGIC_VECTOR (3 downto 0));
                end Encoder;
                architecture Behavioral of Encoder is
                signal pre: std_logic_vector(3 downto 0);
                signal InA: std_logic_vector(3 downto 0);
                signal InB: std_logic_vector(3 downto 0);
                begin
                InA(1 downto 0) <= IA(1 downto 0);
                InB(1 downto 0) <= IB(1 downto 0);
                process(C,IA,IB)
                begin
                       if(C="000") then pre <= not InA;
                       elsif(C="001") then pre <= InA or InB;
                       elsif(C="010") then pre <= InA and InB;
                       elsif(C="011") then pre <= InA xor InB;
                       elsif(C="100") then pre <= InA + InB;
                       elsif(C="101") then pre <= InA - InB;
                       elsif(C="110") then pre <= (not InA)+1;
                       else pre <= InA + 1;
                       end if ;
               end process;
                     F <= pre;
                end Behavioral;

Comments

Popular posts from this blog

VHDL

Embedded สัปดาห์ที่ 9 NI labview 2014

Embedded สัปดาห์ที่ 2 Arduino MQTT and Anto Interface