論 FPGA FPGA External Step Motor Control Module 立 老 林 年
立 老 論 VHDL VHDL 了 論 老 了 度 老 立 老 不 老 都 度 行 流 VHDL 年 來 論 了 不 識 念
VHDL IEEE IEEE 1076 1993 年 度 VHDL 不 FPGACPLD 了 路 利 廉 FPGA 立 利 VHDL ( MAXPLUS) 路 ( 利 PROTEL99SE ) 利 歩
Abstract After IEEE enact IEEE 1076VHDL redact again at 1993The program language of VHDL can use at FPGA and CPLD chips which are different company produced this is his advantagein order to design a function formidable control circuit in a short period of timewe develop a tiny independent system with the application of low cost filed programmable gate arrays (FPGA) It is suitable for mass production, owning to the saving of software and applying of low cost FPGA This monograph is based on VHDL editing by MAXPLUSand the FPGA External Step Motor Control Module is boarding by PROTEL99SE To achieve the human-computer interface module of keyboardseven segment and step motor are interconnected
錄...i......ii.. iii 錄.. iv 錄......vi 錄.....vii..1 1.1...1 1.2 FPGA 論...1 1.3 VHDL 路..2 VHDL 料 4 2.1 VHDL...4 2.1.1 VHDL...4 2.1.2 VHDL 路...4 2.2 ENTITYARCHITECTURE.5 2.3 VHDL 料 OBJECT.10 2.4 17 2.4.1.17 2.4.2 連.18 2.4.3.19 2.5 VHDL MAX+PLUS..20..28 3.1 28 3.1.1.28 3.2... 31
3.2.1.31 3.2.2 流.32 3.2.3.33 3.3 歩 39 3.3.1. 39 3.3.2...39 3.3.3...40 3.3.4 40 3.4 PCB 路 Protel 99 SE 42 FPGA...46 4.1 FPGA. 46 4.1.1 FPGA..46 4.1.2.46 4.2 FPGA.47 4.2.1 Scan generator...47 4.2.2 路.48 4.2.3 路.52 4.3 FPGA.54 4.3.1.54 4.3.2 57 論..67 5.1 67 5.2 來 68 參..69 錄..70
錄 3.1-1 LED 路..29 3.2-1... 31 3.2-2 流...32 3.3(a) 歩.. 41 3.3(b) 歩.. 41 3.3(c) 歩.......42 4.2-1... 47 4.2-2 PORT 34 4 邏.. 49 4.2-3 路.... 50 4.2-4 PORT 2 路 邏.....51 4.2-5 FPGA. 52 4.2-6 FPGA 路.53 4.3-1 FPGA 流...56
錄 3.1-1 六....29 4.2-1....48 4.3-1...54
1.1 省 略 數 IC FPGA 數 邏 列 了 路 路 不 行 路 更 便 來 了 FPGA 1.2 FPGA 論 力 來 路 (EDA)(CAD) 數 路 路 了 類 更 數 歷 切 來 數 路 離 度 邏 (Gate-Level) 流 行 (HDL) 流 路 零 來 來 力 來 數 路 理 路 列 來 FPGA CPLD 量
都 行 不 IC 路 CPLD FPGA 都 行 路 载 說 都 行 理 年 來 IC CPLD/FPGA 量 數 邏 量 CPLD/FPGA 流 量 力 ASIC 來 CP 利 來 更 CPLD/FPGA 降 CPLD/FPGA ASIC 流 都 STANDARD CELL FULLY CUSTOM ASIC 不 數 都 FPGA ActelAltera Xilinx Altera 1.3 VHDL 路 VHDL VERY HIGH SPEED INTEGRATED CIRCUIT HARDWARE DESCRIPTION LANGUAGE 便 數 路 TTL CMOS 數 路 不 VHDL 路 不 邏 不 路 零 數 路 VHDL 數 路 VHDL 路 念 數 IBM PC
VHDL 路 省 浪 路 更 不 TTL CMOS 數 路 路 例 理 不 路 理 VHDL VHDL 路 理 便 了 路 理 VHDL 路 路 ASIC FPGA VHDL IBM PC IEEE STD1076 IEEE STD1176 VHDL 路 類 TTL 路 路 料 路 ASIC 零 FPGA VHDL VHDL VHDL 數 TTL CMOS 來 不 更 RTLREGISTER TRANSFERLEVEL 數 REGISTER TRANSFERLEVEL 路 年 來 路 路 更 率 更 路
VHDL 料 2.1 VHDL 2.1.1VHDL : 來 行 來 理 益 路 類 VHDL TOP-DOWN 數 路 數 數 數 立 立 行 VHDL 路 列. ASIC 路 路 VHDL. 靈 VHDL 路 行 來 更 易 率 降 便 利 VHDL 更 流 3. 不 VHDL 不 來 不 路 4. 不 來 行 不 路 更 類 邏 2.1.2 VHDL 路 VHDL 路 了 來 路 行 VHDL 路 路 路 路
更 (Entity) 路 Entity VHDL 留 (Architecture) 路 路 論 路 來 連 VHDL 路 Symbols (Package) 料 了 落 裡 VHDL PACKAGE C (Attribute) 來 料 2.2 ENTITYARCHITECTURE 1.VHDL STRUCTURE ARCHITECTURE VHDL 利 料 路 不 VHDL 路 路 WIRE
ENTITY IS PORT(A,B:IN STD_LOGIC; C:OUT STD_LOGIC); END ; ARCHITECTURE STRUCT OF IS SIGNAL : STD_LOGIC; COMPONENT 1 PORT(X,Y:IN STD_LOGIC; END COMPONENT; Z:OUT STD_LOGIC) COMPONENT 2 PORT(J,K:IN STD_LOGIC; END COMPONENT; W:OUT STD_LOGIC)
路 BEGIN U0: 0 PORT MAP( ); U1: 1 PORT MAP( ); END STRUCT; COMPONENT 列 COMPONENT 連 U0U1INSTANTIATION 2. 行 BEHAVIOR ARCHITECTURE 類 行 利 流 PROCESS 行 行 CONCURRENT 行 流 PROCESS 行 流 PROCESSSEQUENTIAL 行 流 PROCESSSIGNAL 來 連 流 PROCESS SEQUENTIAL 流 COMBINATION 流 流 流 勵 流 ENTITY IS PORT(A,B:IN STD_LOGIC; C:OUT STD_LOGIC); END ;
; ARCHITECTURE BEHAVIOR OF IS SIGNAL :STD_LOGIC; 行 路 BEGIN PROCESS_1:PROCESS; BEGIN END PROCESS_1; PROCESS_2:PROCESS; BEGIN END PROCESS_2; END BEHAVIOR;
3. 料 流 DATAFLOW ARCHITECTURE 料 流 邏 邏 利 邏 ENTITY IS GENERIC(M:TIME:=3.ONS);---- SIGNAL :STD_LOGIC; 料 流 路 BEGIN C<=(A OR B) AFTER M; END DATAFLOW;
2.3 VHDL 料 OBJECT VHDL 料 類 烈 路 例 數 VARIABL 路 路 NET 路 路 類 路 路 料 理 VHDL 數 variablesignal 數 constant port 參 數 loop varisblegenerics 都 type 1. 數 variablesingal 數 流 流 立 更 流 路 理 來 路 不 來 路 列 兩 例 料 數 異 數 數 數 不 數 數 數 料 例 singal outputabstd_logic process(input,clk) begin if(clk event and clk= 1 ) then output <= b; b<=a a<=input;
end if; end process; 例 a b input a a b b output 流 process 了 兩 clk 例 a b 數 路 不 clk 例 signal output processs(input,clk) variable a,b:std_logic; begin if(clk event and clk= 1 )then a:=input; b:=a; output<=b; end if; end processs; 數 process process 立 更 若 數 來 更 列 例 signal output process(input,clk) variable a,b:std_logic; begin if(clk event and clk= 1 )then output <= b;
b:=a; a:=input; end if; end process; 2. 數 constant 數 不 constant A:std_logic_vector(0 to 7):="ZZZZZZZZ"; 3.PORT PORT PORT ENTITY port 類 1. IN 說 路 來 2. OUT 說 路 3. INOUT 說 路 INOUT INOUT Buffer 不 4. Buffer 不 INOUT ENTITY ADDER IS
PORT(INPUT: IN STD_LOGIC_VECTOR (0 TO 7); OUTPUT:OUT STD_LOGIC_VECTOR(0 TO 7); END ADDER; 4.GENERIC GENERIC 例 Generic( 參 數 string 參 數 integer) Generic Map( 參 數 參 數, 參 數 參 數 ) 說 兩 不 ENTITY ADDER IS GENERIC(SIZE:INTEGER:=8); PORT(INPUT:IN STD_LOGIC_VECTOR(0 TO 7); OUTPUT:OUT STD_LOGIC_VECTOR(0 TO 7); END ADDER; 5. 參 數 loop variable 參 數 loop variable 不 LOOP 1 FOR 數 in 數 to 數 LOOP END LOOP 例 FOR I in 0 to 3 LOOP
END LOOP 說 I 0 行 I 行 I 3 2 FOR 數 in 數 downto 數 LOOP END LOOP 例 FOR K in 10 downto 0 LOOP END LOOP 說 K 10 行 K 1 行 K 0 WHILE LOOP END LOOP 說 While Loop 行 FOR I IN 0 TO 5 LOOP A(I)<=B(I);
END LOOP LOOP 參 數 I 012 5 行 6 六 路 6.IF IF IF 1 IF THEN END IF 說 立 行 2 IF THEN A ELSE B END IF 說 立 A 行 行 B 3 IF 1 THEN A ELSEIF 2 B ELSEIF 3 C
ELSE D END IF 說 1 立 行 A 2 立 行 B 類 7.WAIT WAIT 1 WAIT FOR 度 說 來 度 行 不 MAX+PLUS10.1 不 2 WAIT ON 列 說 PROCESS 來 列 便 行 PROCESS 3 WAIT UNTIL 說 立 行 PROCESS 4 WAIT 說
PROCESS 來 PROCESS 行 3 8. 零 (Package) 零 數 料 零 路 不 裡 不 了 2.4 路 連 若 數 路 說 連 來 路 流 路 若 路 路 路 不 易 2.4.1 行 component port( 1 1 料 1 2 2 料 2 料 )
end component; architecture of is begin end ; VHDL 來 行 行 了 數 料 不 便 讀 2.4.2 連 行 路 連 狀 行 句 兩 port map( 1 1, 2 2,
) 說 不 狀 port map( 1, 2,) 說 1 連 2 連 類 2.4.3 來 路 流 路 來 例 路 A BCF G 路 B D E 路 C E H A B C F G D E E H
2.5 VHDL MAX+PLUS :Altera MAX+PLUS Max+Plus II 10.0 BASELINE ; 連 錄 錄 句 說 都 (third party) Max+Plus II 邏 路 不 :File -> Project -> Name
VHDL :File -> New -> Text Editor
-> ->
-> 路 :MAX+plusII -> Floorplan Editor
: FPGA : <>
programmer
POF
Program --->
3-1 3.1.1 來 說 利 LED 列 IC 7447/7448 便 數 不 都 若 更 數 IC 更 路 路 率 利 理 來 念 度 1/16 留 度 便 立 了 了 利 了 理 利 留 理 度 度 了 不 省 了 IC 量 更 省 不 率 更 率 兩 3.1-1 LED 路
3.1-1 LED 路 1~9 數 abcdefgp 不 1 LED 3.1-2 六 3.1-1 六 六 NUM a b c d e f g 0 0 0 0 1 1 1 1 1 1 0
0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 1 1 0 1 1 0 1 0 0 1 1 1 1 1 1 0 0 1 0 1 0 0 0 1 1 0 0 1 1 0 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 0 1 1 1 1 1 0 1 1 1 1 1 1 0 0 0 0 1 0 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 0 1 1
FPGA 六 sel0 sel1 sel2 sel3 sel4 sel5 FPGA IC 122 125 126 127 128 131 3.2 3.2.1 說 見 數 見 類 類 ()()() 論 類 不 立 兩 論 列 1 3.2-1 3.2-1 4 4 4 列 4 行 16 I/O 路 省 量 立 來 路 列 行 INT
來 列 1110 01101101101111110 例 行 1 列 1 行 1111 了 1110 INT 0 了 1 利 INT 來 立 列 利 理 來 3-2.2 流 了 3-1 3-2 念 利 VHDL 來 4 4 數 數 數 數 0 理 不 理 3.2-2 流 率 數 數 3.2-2 流
3-2.3 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY KEYBOARD IS PORT( CLK:IN STD_LOGIC; AI:IN STD_LOGIC_VECTOR(3 DOWNTO 0); CO:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); S:OUT STD_LOGIC_VECTOR(6 DOWNTO 0); P:OUT STD_LOGIC_VECTOR(5 DOWNTO 0); SP:OUT STD_LOGIC); END KEYBOARD; ARCHITECTURE KEY OF KEYBOARD IS SIGNAL F:STD_LOGIC_VECTOR(5 DOWNTO 0); SIGNAL F_HZ:STD_LOGIC; SIGNAL OSC:STD_LOGIC; SIGNAL OSC1:STD_LOGIC; SIGNAL C:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL A:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL CODE:STD_LOGIC_VECTOR(2 DOWNTO 0); SIGNAL BCD:STD_LOGIC_VECTOR(23 DOWNTO 0); SIGNAL SUM:STD_LOGIC_VECTOR(4 DOWNTO 0); SIGNAL D:STD_LOGIC_VECTOR(3 DOWNTO 0):="0000"; SIGNAL SPO:STD_LOGIC;
BEGIN P(5 DOWNTO 0)<=F(5 DOWNTO 0); CO(3 DOWNTO 0)<=C(3 DOWNTO 0); A(3 DOWNTO 0)<=AI(3 DOWNTO 0); SP<=SPO; ---- PROCESS(OSC) VARIABLE D_FF:STD_LOGIC_VECTOR(20 DOWNTO 0); BEGIN WAIT UNTIL CLK='1'; IF(D_FF(20 DOWNTO 0)>=2E6) THEN D_FF(20 DOWNTO 0):="000000000000000000000"; ELSE D_FF(20 DOWNTO 0):=D_FF+1; END IF; F_HZ<=NOT D_FF(6); OSC<=NOT D_FF(10); OSC1<=NOT D_FF(18); END PROCESS; ---- PROCESS(F_HZ,OSC,OSC1) VARIABLE B:STD_LOGIC; VARIABLE INT:STD_LOGIC; VARIABLE DATA:STD_LOGIC_VECTOR(3 DOWNTO 0); VARIABLE ST:STD_LOGIC_VECTOR(2 DOWNTO 0); VARIABLE SEQ:STD_LOGIC_VECTOR(1 DOWNTO 0); VARIABLE SOUND:STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN ---- IF(F_HZ='1' AND F_HZ'EVENT) THEN IF ST(2 DOWNTO 0)="110"THEN ST(2 DOWNTO 0):="000"; ELSE ST(2 DOWNTO 0):=ST(2 DOWNTO 0)+1; END IF; END IF; -- 列 -- IF(OSC='1' AND OSC'EVENT) THEN IF A="1111"THEN IF SEQ="11"THEN SEQ:="00"; ELSE SEQ:=SEQ+1; END IF; ELSE SEQ:=SEQ; END IF; IF(SEQ="00") THEN C(3 DOWNTO 0)<="1110"; ELSIF SEQ="01"THEN C(3 DOWNTO 0)<="1101"; ELSIF SEQ="10"THEN C(3 DOWNTO 0)<="1011"; ELSIF SEQ="11"THEN C(3 DOWNTO 0)<="0111"; END IF; END IF; IF A="1111"THEN INT:='0'; ELSE INT:='1'; END IF; -- 數 -- IF(OSC1'EVENT AND OSC1='1') THEN
B:=(INT AND (B AND INT)); ---- IF(B='1' AND DATA(3 DOWNTO 0)="1011") THEN BCD(23 DOWNTO 0)<=("0000" & BCD(23 DOWNTO 4));B:='0'; ---- ELSIF B='1' AND DATA(3 DOWNTO 0)="1111" THEN BCD(23 DOWNTO 0)<="000000000000000000000000";B:='0'; ---- ELSIF B='1' THEN BCD(23 DOWNTO 0)<=BCD(19 DOWNTO 0) & DATA(3 DOWNTO 0);B:='0'; -- 理 -- ELSIF INT='0' THEN BCD(23 DOWNTO 0)<=BCD(23 DOWNTO 0);B:='1'; END IF; END IF; -- 行 列 -- SUM(1 DOWNTO 0)<=SEQ; SUM(4 DOWNTO 2)<=CODE; -- 料 -- CASE ST IS WHEN"000"=> D(3 DOWNTO 0)<=BCD(3 DOWNTO 0);F(5 DOWNTO 0)<="111110"; WHEN"001"=> D(3 DOWNTO 0)<=BCD(7 DOWNTO 4);F(5 DOWNTO 0)<="111101"; WHEN"010"=> D(3 DOWNTO 0)<=BCD(11 DOWNTO 8);F(5 DOWNTO 0)<="111011";
WHEN"011"=> D(3 DOWNTO 0)<=BCD(15 DOWNTO 12);F(5 DOWNTO 0)<="110111"; WHEN"100"=> D(3 DOWNTO 0)<=BCD(19 DOWNTO 16);F(5 DOWNTO 0)<="101111"; WHEN"101"=> D(3 DOWNTO 0)<=BCD(23 DOWNTO 20);F(5 DOWNTO 0)<="011111"; WHEN OTHERS=> D(3 DOWNTO 0)<="1100";F(5 DOWNTO 0)<="111111"; END CASE; -- 行 -- CASE A(3 DOWNTO 0) IS WHEN"1110"=>CODE<="100"; WHEN"1101"=>CODE<="101"; WHEN"1011"=>CODE<="110"; WHEN"0111"=>CODE<="111"; WHEN OTHERS=>CODE<="000"; END CASE; -- 行 列 -- CASE SUM(4 DOWNTO 0) IS WHEN"10000"=>DATA:="0001";--0 WHEN"10001"=>DATA:="0101";--1 WHEN"10010"=>DATA:="1001";--2 WHEN"10011"=>DATA:="1100";--3 WHEN"10100"=>DATA:="0010";--4 WHEN"10101"=>DATA:="0110";--5 WHEN"10110"=>DATA:="0000";--6
WHEN"10111"=>DATA:="1101";--7 WHEN"11000"=>DATA:="0011";--8 WHEN"11001"=>DATA:="0111";--9 WHEN"11010"=>DATA:="1010";--A WHEN"11011"=>DATA:="1110";--B WHEN"11100"=>DATA:="0100";--C WHEN"11101"=>DATA:="1000";--D WHEN"11110"=>DATA:="1011";--E--- WHEN"11111"=>DATA:="1111";--F--- WHEN OTHERS=>DATA:=DATA; END CASE; ---- CASE D IS WHEN"0000"=>S<="0111111";--0 WHEN"0001"=>S<="0000110";--1 WHEN"0010"=>S<="1011011";--2 WHEN"0011"=>S<="1001111";--3 WHEN"0100"=>S<="1100110";--4 WHEN"0101"=>S<="1101101";--5 WHEN"0110"=>S<="1111100";--6 WHEN"0111"=>S<="0000111";--7 WHEN"1000"=>S<="1111111";--8 WHEN"1001"=>S<="1100111";--9 WHEN"1010"=>S<="1110111";--a WHEN"1011"=>S<="1111100";--b WHEN"1100"=>S<="0111001";--c
WHEN"1101"=>S<="1011110";--D WHEN"1110"=>S<="1111001";--E WHEN"1111"=>S<="1110001";--F WHEN OTHERS=>S<="ZZZZZZZ"; END CASE; END PROCESS; END KEY; 3-3 歩 3.3.1 歩 (Step Motor) 利 數 數 度 數 度 精 精 來 3.3.2 1 路 易 2 數 易 精 3 度 數 4 率 5 度 量 不 累 6 易 連 PCPLCFPGA 7 力 8 領 力
3.3.3 度 度 = 360 / 數 數 3.3.4 歩 列 (1) 1 度 0 度 90 度 180 度 270 度 流 3.3 (a) 若 歩 A B A B (2) 2 度 45 度 135 度 225 度 270 度 2 流 切 不 A A B B 3.3 (b) 2 若 B B 2 不 易 歩 量 2 (3) 1-2 度 04590135180225270315 度 說 1 2 行 度 1 2 說 精 度
A B A B 3.3(a) A B A B 3.3(b)
A B A B 3.3(c) 3.3 歩 3.4 PCB 路 Protel 99 SE Protel PCB 99 Advanced PCB 99 32 料 100X100 路 度 0.001mil 35 六 37 PCB 零 料 料 1 PCB 零 PCB 零 數 零 切 切 不 累 AUTO PLACE( 零 ) 零 零 零 滑
列 零 零 立 零 數 UNDO REDO 路 精 靈 零 精 靈 零 淚 更 更 路 路 行 Windows MDI 行 路 - 路 路 - 路 狀 列 列 HPGL DMPL Windows
Protel 98 SE 流 邏 路 4X4 邏 路 路
( 洞 ) Protel 精 PCB 路 度 拉 都 PCB
FPGA 4.1 FPGA 4.1.1 FPGA FPGA 歩 來 0 9 數 串 數 例 1000 來 來 便 數 0 4.1.2 FPGA 1K IDE MAX+PLUS 10.0 Protel 99 SE
4.2 FPGA 4.2.1 Scan generator FPGA CLK 利 路 10MHz 數 9999 1KHz 10MHz Delay 利 10MHz 1KHz 1KHz 數 999 1Hz 10MHz 1KHz 1Hz 4.2-1 4.2-1 率 利 來 例 率 500Hz 率 10MHz 率 500Hz 利 率 來 數 2000020K 率 500Hz
FPGA 參 FPGA - 參 數 742(2e6) 率 13.4KHz 4.2.2 路 FPGA 數 狀 FPGA 4 4 0 9 數 FPGA 4.2-1 4.2-1 1 2 3 4 5 6 7 8 9 0 了 六 六 數 000000~999999 了 念 省 不 率 更 率 4 4 FPGA 1K PORT 34 4 邏 4.2-3
邏
了 路 路 流 FPGA FPGA VHDL 路 立 來 度 離 說 了 路 路 FPGA 來 了 離 路 路 路 理 流 FPGA +5V 流 路 +5V 流 兩 流 連 亮 度 不 流 流 流 立 率 來 4.XXX 零 路 ICFT 5754SLA 4061 2N3055 率 1N4002 來 5V 流 0.2A 精 度 1.8 Deg/Step 2 路 FPGA 1K PORT 2 路 邏 4.2-4 路
路 邏
4.2.3 路 FPGA 路 Protel 99 SE 來 FPGA 路 路 了 路 參 4.2-3 路 4 4 路 FPGA 連 路 精 度 力 路 FPGA 4.2-5 兩 路 1 2 FPGA
FPGA 路
4.3 FPGA 4.3.1 FPGA 1K ALTERA Corporation ALTERA FLEX 1K FPGA EP1K100QC208-1 利 FPGA 4.3-1 4.3-1 FPGA 1K I/O CLK 1 160 S1 112 S2 113 S3 114 S4 115 S5 116 S6 119 S7 120 S8 121 P0 122
P1 125 P2 126 P3 127 P4 128 P5 131 AI0 136 AI1 139 AI2 140 AI3 141 CO0 142 CO1 143 CO2 144 CO3 147 CLK 2 103 COIL 0 58 COIL 1 60 COIL 2 61 COIL 3 62 4.3-2 FPGA 流
率 數 數 數 數 4.3-1 FPGA 流
4.3.2 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY MUSIC_BOX IS PORT( CLK,DIRECTION,PHASE:IN STD_LOGIC:='0'; AI:IN STD_LOGIC_VECTOR(3 DOWNTO 0); CO:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); S:OUT STD_LOGIC_VECTOR(6 DOWNTO 0); P:OUT STD_LOGIC_VECTOR(5 DOWNTO 0); SP:OUT STD_LOGIC; COIL: OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END MUSIC_BOX; ARCHITECTURE ACTION OF MUSIC_BOX IS SIGNAL F:STD_LOGIC_VECTOR(5 DOWNTO 0); SIGNAL F_HZ:STD_LOGIC; SIGNAL OSC:STD_LOGIC; SIGNAL OSC1:STD_LOGIC; SIGNAL CLK_SCAN: STD_LOGIC; SIGNAL CLK2: STD_LOGIC; SIGNAL C:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL A:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL CODE:STD_LOGIC_VECTOR(2 DOWNTO 0); SIGNAL BCD:STD_LOGIC_VECTOR(23 DOWNTO 0);
SIGNAL SUM:STD_LOGIC_VECTOR(4 DOWNTO 0); SIGNAL D:STD_LOGIC_VECTOR(3 DOWNTO 0):="0000"; SIGNAL SPO:STD_LOGIC; SIGNAL IND_COIL: STD_LOGIC_VECTOR(3 DOWNTO 0):="0001"; SIGNAL SW:STD_LOGIC; SIGNAL KEY:STD_LOGIC; SIGNAL HZ:STD_LOGIC; SIGNAL COUNT:STD_LOGIC_VECTOR(23 DOWNTO 0); SIGNAL AC:STD_LOGIC; BEGIN COIL<= NOT IND_COIL; P(5 DOWNTO 0)<=F(5 DOWNTO 0); CO(3 DOWNTO 0)<=C(3 DOWNTO 0); A(3 DOWNTO 0)<=AI(3 DOWNTO 0); SP<=SPO; ---- PROCESS(OSC) VARIABLE D_FF:STD_LOGIC_VECTOR(20 DOWNTO 0); VARIABLE DELAY:STD_LOGIC_VECTOR(23 DOWNTO 0); BEGIN WAIT UNTIL CLK='1'; IF(D_FF(20 DOWNTO 0)>=2E6) THEN D_FF(20 DOWNTO 0):="000000000000000000000"; ELSE D_FF(20 DOWNTO 0):=D_FF+1; END IF; F_HZ<=NOT D_FF(6);
OSC<=NOT D_FF(10); OSC1<=NOT D_FF(18); CLK2<= NOT D_FF(20); IF DELAY>=5000000 THEN DELAY:="000000000000000000000000";HZ<=NOT HZ; ELSE DELAY:=DELAY+1; END IF; END PROCESS; ---- PROCESS(F_HZ,OSC,OSC1,HZ) VARIABLE B:STD_LOGIC; VARIABLE INT:STD_LOGIC; VARIABLE DATA:STD_LOGIC_VECTOR(3 DOWNTO 0); VARIABLE ST:STD_LOGIC_VECTOR(2 DOWNTO 0); VARIABLE SEQ:STD_LOGIC_VECTOR(1 DOWNTO 0); VARIABLE SOUND:STD_LOGIC_VECTOR(1 DOWNTO 0); BEGIN ---- IF(F_HZ='1' AND F_HZ'EVENT) THEN IF ST(2 DOWNTO 0)="110"THEN ST(2 DOWNTO 0):="000"; ELSE ST(2 DOWNTO 0):=ST(2 DOWNTO 0)+1; END IF; END IF; -- 列 -- IF(OSC='1' AND OSC'EVENT) THEN
IF A="1111"THEN IF SEQ="11"THEN SEQ:="00"; ELSE SEQ:=SEQ+1; END IF; ELSE SEQ:=SEQ; END IF; IF(SEQ="00") THEN C(3 DOWNTO 0)<="1110"; ELSIF SEQ="01"THEN C(3 DOWNTO 0)<="1101"; ELSIF SEQ="10"THEN C(3 DOWNTO 0)<="1011"; ELSIF SEQ="11"THEN C(3 DOWNTO 0)<="0111"; END IF; END IF; IF A="1111"THEN INT:='0'; ELSE INT:='1'; END IF; -- 數 -- IF(OSC1'EVENT AND OSC1='1') THEN B:=(INT AND (B AND INT)); --KEY LOCK-- IF B='1' AND DATA(3 DOWNTO 0)="1010" THEN BCD<=BCD;B:='0';SW<=NOT SW; ---- ELSIF(SW='0' AND B='1' AND DATA(3 DOWNTO 0)="1110") THEN ---- BCD(23 DOWNTO 0)<=("0000" & BCD(23 DOWNTO 4));B:='0'; ELSIF B='1' AND DATA(3 DOWNTO 0)="1111" THEN
BCD(23 DOWNTO 0)<="000000000000000000000000";B:='0';SW<='0'; ELSIF BCD=0 AND KEY='1' THEN SW<='0';BCD<=BCD;KEY<='0';IND_COIL<="1111";AC<='0'; ELSIF SW='1' AND KEY='1' AND DATA(3 DOWNTO 0)/="1111" THEN BCD<=COUNT; ELSIF SW='1' AND DATA(3 DOWNTO 0)="1111" THEN SW<='0';BCD(23 DOWNTO 0)<="000000000000000000000000";KEY<='0'; ---- ELSIF SW='0' AND B='1' AND DATA(3 DOWNTO 0)="1011" AND BCD/=0 THEN B:='0';SW<='1';KEY<='1'; ELSIF SW='0' AND B='1' AND DATA(3 DOWNTO 0)="1011" AND BCD=0 THEN SW<='0';BCD<=BCD;KEY<='0';B:='0'; ---- ELSIF SW='0' AND B='1' THEN BCD(23 DOWNTO 0)<=BCD(19 DOWNTO 0) & DATA(3 DOWNTO 0);B:='0'; ELSIF INT='0' THEN BCD(23 DOWNTO 0)<=BCD(23 DOWNTO 0);B:='1'; END IF; ---- IF SW='1' AND DATA(3 DOWNTO 0)="1100" THEN AC<='1'; IF((IND_COIL="0001")OR(IND_COIL="0000")) THEN IND_COIL<="1100"; ELSE IND_COIL<=(IND_COIL(0)& IND_COIL(3 DOWNTO 1)); END IF; ELSIF SW='1' AND DATA(3 DOWNTO 0)="1101" THEN
AC<='1'; IF((IND_COIL="0001")OR(IND_COIL="0000")) THEN IND_COIL<="0011"; ELSE IND_COIL<=(IND_COIL(2 DOWNTO 0)& IND_COIL(3)); END IF; END IF; END IF; -- 行 列 -- SUM(1 DOWNTO 0)<=SEQ; SUM(4 DOWNTO 2)<=CODE; -- 數 -- IF SW='0' THEN COUNT<=BCD; ELSE IF(HZ='1' AND HZ'EVENT)THEN IF AC='1' AND KEY='1' AND COUNT/=0 THEN ---- IF COUNT(3 DOWNTO 0)=0 AND COUNT(23 DOWNTO 4)>=1 THEN COUNT(3 DOWNTO 0)<="1001"; ELSE COUNT(3 DOWNTO 0)<=COUNT(3 DOWNTO 0)-1; END IF; ---- IF COUNT(7 DOWNTO 4)=0 AND COUNT(23 DOWNTO 8)>=1 AND COUNT(3 DOWNTO 0)=0 THEN COUNT(7 DOWNTO 4)<="1001"; ELSIF COUNT(3 DOWNTO 0)=0 AND COUNT(23 DOWNTO 4)>=1 THEN COUNT(7 DOWNTO 4)<=COUNT(7 DOWNTO 4)-1;
END IF; ---- IF COUNT(11 DOWNTO 8)=0 AND COUNT(23 DOWNTO 12)>=1 AND COUNT(7 DOWNTO 0)=0 THEN COUNT(11 DOWNTO 8)<="1001"; ELSIF COUNT(7 DOWNTO 0)=0 AND COUNT(23 DOWNTO 8)>=1 THEN COUNT(11 DOWNTO 8)<=COUNT(11 DOWNTO 8)-1; END IF; ---- IF COUNT(15 DOWNTO 12)=0 AND COUNT(23 DOWNTO 16)>=1 AND COUNT(11 DOWNTO 0)=0 THEN COUNT(15 DOWNTO 12)<="1001"; ELSIF COUNT(11 DOWNTO 8)=0 AND COUNT(23 DOWNTO 12)>=1 AND COUNT(7 DOWNTO 0)=0 THEN COUNT(15 DOWNTO 12)<=COUNT(15 DOWNTO 12)-1; END IF; ---- IF COUNT(19 DOWNTO 16)=0 AND COUNT(23 DOWNTO 20)>=1 AND COUNT(15 DOWNTO 0)=0 THEN COUNT(19 DOWNTO 16)<="1001"; ELSIF COUNT(15 DOWNTO 12)=0 AND COUNT(23 DOWNTO 16)>=1 ANDCOUNT(11 DOWNTO 0)=0 THEN COUNT(19 DOWNTO 16)<=COUNT(19 DOWNTO 16)-1; END IF; ---- IF COUNT(23 DOWNTO 20)=0 THEN
COUNT(23 DOWNTO 20)<="0000"; ELSIF COUNT(19 DOWNTO 16)=0 AND COUNT(23 DOWNTO 20)>=1 AND COUNT(15 DOWNTO 0)=0 THEN COUNT(23 DOWNTO 20)<=COUNT(23 DOWNTO 20)-1; END IF; END IF; END IF; END IF; -- 料 -- CASE ST IS WHEN"000"=> D(3 DOWNTO 0)<=BCD(3 DOWNTO 0);F(5 DOWNTO 0)<="111110"; WHEN"001"=> D(3 DOWNTO 0)<=BCD(7 DOWNTO 4);F(5 DOWNTO 0)<="111101"; WHEN"010"=> D(3 DOWNTO 0)<=BCD(11 DOWNTO 8);F(5 DOWNTO 0)<="111011"; WHEN"011"=> D(3 DOWNTO 0)<=BCD(15 DOWNTO 12);F(5 DOWNTO 0)<="110111"; WHEN"100"=> D(3 DOWNTO 0)<=BCD(19 DOWNTO 16);F(5 DOWNTO 0)<="101111"; WHEN"101"=> D(3 DOWNTO 0)<=BCD(23 DOWNTO 20);F(5 DOWNTO 0)<="011111"; WHEN OTHERS=> D(3 DOWNTO 0)<="1100";F(5 DOWNTO 0)<="111111"; END CASE; -- 行 --
CASE A(3 DOWNTO 0) IS WHEN"1110"=>CODE<="100"; WHEN"1101"=>CODE<="101"; WHEN"1011"=>CODE<="110"; WHEN"0111"=>CODE<="111"; WHEN OTHERS=>CODE<="000"; END CASE; -- 行 列 -- CASE SUM(4 DOWNTO 0) IS WHEN"10000"=>DATA:="0001";--0 WHEN"10001"=>DATA:="0101";--1 WHEN"10010"=>DATA:="1001";--2 WHEN"10011"=>DATA:="1100";--3 WHEN"10100"=>DATA:="0010";--4 WHEN"10101"=>DATA:="0110";--5 WHEN"10110"=>DATA:="0000";--6 WHEN"10111"=>DATA:="1101";--7 WHEN"11000"=>DATA:="0011";--8 WHEN"11001"=>DATA:="0111";--9 WHEN"11010"=>DATA:="1010";--A WHEN"11011"=>DATA:="1110";--B WHEN"11100"=>DATA:="0100";--C WHEN"11101"=>DATA:="1000";--D WHEN"11110"=>DATA:="1011";--E--- WHEN"11111"=>DATA:="1111";--F--- WHEN OTHERS=>DATA:=DATA;
END CASE; ---- CASE D IS WHEN"0000"=>S<="0111111";--0 WHEN"0001"=>S<="0000110";--1 WHEN"0010"=>S<="1011011";--2 WHEN"0011"=>S<="1001111";--3 WHEN"0100"=>S<="1100110";--4 WHEN"0101"=>S<="1101101";--5 WHEN"0110"=>S<="1111100";--6 WHEN"0111"=>S<="0000111";--7 WHEN"1000"=>S<="1111111";--8 WHEN"1001"=>S<="1100111";--9 WHEN"1010"=>S<="1110111";--a WHEN"1011"=>S<="1111100";--b WHEN"1100"=>S<="0111001";--c WHEN"1101"=>S<="1011110";--D WHEN"1110"=>S<="1111001";--E WHEN"1111"=>S<="1110001";--F WHEN OTHERS=>S<="ZZZZZZZ"; END CASE; END PROCESS; END ACTION;
論 5.1 年 來 識 都 來 年 裡 料 論 都 VHDL 說 理 都 不 VHDL 都 了 VHDL 率 路 來 都 不 念 來 便 了 8051 理 來 4 4 來 不 不 六 來 立 數 來 六 了 讀 理 論 不 VHDL MAXPLUS FPGA
行 路 PROTEL 路 路 PCB 來 路 PCB 了 例 度 洞 都 論 路 來 5.2 來 來 例 FPGA FPGA 省 省 更 LCD 狀 六 數 數 LCD 利
參 逸 數 路 林 林 良 路 林 益 麟 論 論 李 林 論 論 復 沈 數 邏 祿
錄 錄 FPGA 路
錄 FPGA 路
錄 FPGA PCB 數 量 24 2 connector 2 6 1 connector 1 seven segment 6 PC817 4 1N4002 4 2N3055 4 OSC 10MHZ 2 330Ω 8 100Ω 8 10KΩ 4 4PIN 16 5V 1 JUMPER 1