VHDL ½Ã¹Ä·¹ÀÌ¼Ç Åø\À» Ȱ¿ëÇÑ RC8100 ¿¡ ´ëÇÑ VHDL ÄÚµå ÀÛ¼º/°ËÁõ ÀÚ·áÃâó : À¯´ÏÅÚ MicroProcessorÀÇ ±¸Á¶¸¦ °£·«ÈÇÑ RISC ÇüÅÂÀÇ RC8001ÀÇ Àü¹ÝÀûÀÎ ½Ã½ºÅÛ ±¸¼º°ú »ç¾ç¿¡ ´ëÇÏ¿© ¼³¸íÇÏ¿´´Ù. À̾ RC8001 µðÀÚÀο¡ ´ëÇØ ¼³¸íÇÒ ¿¹Á¤ÀÌ´Ù. ¶ÇÇÑ °¢ ºí·°¿¡ ´ëÇÑ VHDL ¼Ò½º ¹× À̸¦ °ËÁõÇÒ ¼ö ÀÖµµ·Ï ½ºÆ¼ ¹Ä·¯½º(Stimulus)¿Í ½Ã¹Ä·¹ÀÌ¼Ç °á°ú¿¡ ´ëÇØ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ. ÄÄÇ»ÅÍ ¾ÆÅ°ÅØÃÄ(Computer Architecture)¿¡ ´ëÇÑ Áö½ÄÀÌ ÀÖ´Â »ç¿ëÀÚÀÇ °æ¿ì ´Â ÀüüÀûÀÎ ½Ã½ºÅÛÀÇ ±¸Á¶¿Í È帧Àº ÆÄ¾ÇÇÏ¿´À» °ÍÀ̶ó°í ÆÇ´ÜµÇ¸ç, ¾ÆÁ÷ ÀüüÀûÀÎ À±°ûÀ» È®ÀÎÇÏÁö ¸øÇÑ »ç¿ëÀÚ¶ó ÇÒÁö¶óµµ Áö±ÝºÎÅÍ ¼³¸íÇÏ´Â °¢°¢ ÀÇ ºí·°µéÀÇ ¼³¸íÀ» ÀÐ°í³ª¸é RC8001ÀÇ ±¸Á¶¿Í ó¸® ³»¿ëÀ» ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. 1. RC8001 VHDL ¼Ò½ºÀÇ ¼³°è ·¹Áö½ºÅÍ(Register) Àü¼Û ·¹º§À» ±¸¼ºÇÏ´Â ºí·°µéÀ» Á¶ÇÕ³í¸® ȸ·Î ¿ä¼Ò¿Í ¼ø¼³í¸® ȸ·Î·Î ºÐ·ùÇϸé Ç¥ 1°ú °°´Ù. Ç¥ 1. Çϵå¿þ¾î ºí·°¿¡ ´ëÇÑ ºÐ·ù Á¶ÇÕ ³í¸® ȸ·Î ¿ä¼Ò 1. ÀÔ·ÂÀÌ 5 BitÀÎ 2¡¿1 Multiplexer 2. ÀÔ·ÂÀÌ 8 BitÀÎ 2¡¿1 Multiplexer 3. 5 BitÀÇ ÀÔ·Â µ¥ÀÌÅÍ¿¡ ´ëÇÏ¿© 1À» Áõ°¡Çϴ ȸ·Î 4. 5°¡ÁöÀÇ ±â´ÉÀ» °®´Â 8Bit ALU 5. Address°¡ 5 BitÀ̰í, Data Bus°¡ 8 BitÀÎ ROM 6. Address°¡ 5 BitÀ̰í, Data Bus°¡ 8 BitÀÎ RAM ¼ø¼ ³í¸® ȸ·Î ¿ä¼Ò a. Enable ½ÅÈ£ ¹× Ãʱâȸ¦ °®´Â 1 Bit AF b. Enable ½ÅÈ£ ¹× ÃʱâÈ ½ÅÈ£¸¦ °®´Â 5 Bit Register c. Enable ½ÅÈ£¿Í ÃʱâÈ ½ÅÈ£¸¦ °®´Â 8 Bit Register d. Ãâ·ÂÀÌ 5 BitÀÎ ÆÄÇü ¹ß»ý±â e. ¿©·¯ °¡Áö Á¦¾î½ÅÈ£¸¦ ¸í·É¾î¿Í ¼öÇà 5 ´Ü°è¿¡ µû¶ó »ý¼ºÇÏ´Â FSM ·¹Áö½ºÅÍ Àü¼Û ·¹º§ÀÇ ±¸¼ºÀ» ¼³¸íÇÑ ±×¸² 1°ú °°ÀÌ 12°¡Áö ¿ä¼Ò¸¦ Behavioral Modeling ¹æ¹ý¿¡ ÀÇÇÏ¿© °¢°¢ Ç¥ÇöÇϰí, À̵éÀÇ ¿¬°á °ü°è¸¦ ÁÖÀÇÇÏ¸é¼ Structural Modeling ¹æ¹ý¿¡ ÀÇÇÏ¿© Ç¥ÇöÇϸé VHDL ¼³°è¸¦ ¸¶Ä¡°Ô µÈ´Ù. (1) VHDL ¸ðµ¨¸µ ±â¹ý µé¾î°¡±â¿¡ ¾Õ¼ VHDL ¸ðµ¨¸µ(Source Code Description) ±â¹ý¿¡ ´ëÇÏ¿© °£´ÜÈ÷ ¼³¸íÇϰڴÙ. VHDL ¸ðµ¨¸µ ¹æ¹ý¿¡´Â ¾Æ·¡¿Í °°ÀÌ 4°¡Áö ¹æ¹ýÀÌ ÀÖÀ¸¸ç, ²À ƯÁ¤ÇÑ ÇѰ¡Áö ¹æ¹ý¸¸À¸·Î VHDLÀ» ±â¼úÇØ¾ß ÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ÀÌÇØÇϱ⠽±°í Àͼ÷ÇÑ ¹æ¹ý À» »ç¿ëÇϸç, ¶§·Î´Â ¿©·¯ °¡Áö ±â¼ú¹æ¹ýÀ» È¥¿ëÇÏ¿© »ç¿ëÇÏ´Â °ÍÀÌ ÀϹÝÀû ÀÌ´Ù. 1) µ¿ÀÛÀû ±â¼ú(Behavioral Description) . ±â´ÉÀû ¶Ç´Â ¾Ë°í¸®ÁòÀû Ç¥ÇöÀ» ÁÖ·Î »ç¿ëÇÑ´Ù . °í±Þ¾ð¾î¸¦ »ç¿ëÇÑ ÇÁ·Î±×·¥ ÀÛ¼º°ú À¯»çÇÏ´Ù . ¹®¼È¸¦ À§Çؼ °¡Àå ¿ì¼öÇÑ ±â¼ú¹æ¹ýÀÌ´Ù. . VHDLÀÇ ¼øÂ÷¹®À» »ç¿ëÇÑ´Ù. 2) ÀÚ·áó¸® È帧 ±â¼ú(Dataflow Description) . µ¿ÀÛÀûº¸´Ù ÇÑ ´Ü°è ³·Àº ¼öÁØÀÇ ±â¼ú¹æ¹ýÀÌ´Ù. . ºÎ¿ïÇÔ¼ö, RTL, ¶Ç´Â ¿¬»êÀÚ(AND, OR) µîÀÇ Ç¥ÇöÀ» ÀÌ¿ëÇÑ´Ù. . VHDLÀÇ º´Ç๮À» »ç¿ëÇÑ´Ù(ȸ·ÎÀÇ °¢ ±¸¼º¿ä¼ÒÀÇ ÀÛµ¿ Ç¥Çö). 3) ±¸Á¶Àû ±â¼ú(Structural Description) . °¡Àå Çϵå¿þ¾îÀû Ç¥Çö¿¡ °¡±õ´Ù . ±¸¼º¿ä¼Ò ¹× ¿¬°á»óŸ¦ °¡Àå Àß Ç¥ÇöÇÑ´Ù . °èÃþÀû ±¸Á¶ÀÇ µðÀÚÀο¡ ÀÌ¿ëµÈ´Ù. 4) È¥ÇÕÀû ±â¼ú(Mixed Description) . ¾ÕÀÇ ¼¼ °¡Áö ±â¼úÀ» È¥ÇÕÀûÀ¸·Î »ç¿ëÇÑ´Ù. ´ÙÀ½Àº À§¿¡¼ ¼³¸íÇÑ VHDL Modeling ±â¹ýÀ» ÀÌ¿ë Àü°¡»ê±â¸¦ µðÀÚÀÎÇÑ ¿¹ÀÌ´Ù. VHDL ÄÚµå ÀÛ¼º¿¡ ¾Õ¼ º¹½ÀÇÑ´Ù´Â »ý°¢À¸·Î ´ÙÀ½ÀÇ ¿¹Á¦¸¦ °ËÅäÇÏ ±â ¹Ù¶õ´Ù(Áö³ È£¿¡¼µµ ¾ð±ÞÇßÁö¸¸ º» ±ÛÀº VHDLÀ» Ȱ¿ëÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇÏ´Â ±Û·Î VHDL¿¡ ´ëÇÑ ±âº»Áö½ÄÀÌ ÀÖ´Ù´Â ÀüÁ¦¿¡¼ VHDL ±¸Á¶ ¹× ±âº» ¹®¹ý µîÀÇ ¼³¸íÀº »ý·«ÇÑ´Ù). (2) ¹Ý°¡»ê±âÀÇ ¿£Æ¼Æ¼ entity Half_Adder is port ( A, B : in bit; Sum, Carry : out bit); end Half_Adder; (3) ¹Ý°¡»ê±âÀÇ µ¿ÀÛÀû ±â¼ú architecture Beh_Des of Half_A.... begin process ( A, B ) begin if ( A = B ) then sum <= '1' after 2 ns; else sum <= '1' after 2 ns; end if; if ( A = '1') and ( B = '1') then carry <= '1' after 2 ns; else carry <= '1' after 2 ns; end if; end process; end Beh_Des; (4) ¹Ý°¡»ê±âÀÇ ÀÚ·áÈ帧 ±â¼ú architecture Dataflow_Des .... begin sum <= A xor B after 2 ns; Carry <= A and B after 2 ns; end Dataflow_Des; (5) Àü°¡»ê±âÀÇ ¿£Æ¼Æ¼ entity Full_Adder is port (X, Y, C_in : in bit; S_out, C_out : out bit ); end Full_Adder; (6) Àü°¡»ê±âÀÇ ±¸Á¶Àû ±â¼ú -. ÀÌ¹Ì µðÀÚÀÎµÈ OR2¿Í Half_Adder¸¦ Component·Î ÁöÁ¤ÇÏ¿© »ç¿ëÇÑ´Ù. architecture Structural_Des of Full_Adder is signal t_s, t_c1, t_c2 : bit; -- declaration of internal signals component OR2 -- declaration of local components port (I1, I2 : in bit; O : out bit); end component; component Half_Adder port (A, B : in bit; Sum, Carry : out bit); end component; begin -- component instantiation statements HA1 : Half_Adder port map (X, Y, t_s, t_c1); HA2 : Half_Adder port map (t_s, C_in, S_out, t_c2); ORG : OR2 port map (t_c1, t_c2, C_out); end Structural_Des; ¾Õ¿¡¼ º¸´Â ¹Ù¿Í °°ÀÌ µðÁöÅРȸ·Î¼³°è¿¡ ´ëÇÑ ±âº» Áö½ÄÀÌ ÀÖ´Ù¸é ÀÚ·á È帧 ±â¼úÀ» º¸´Â °ÍÀÌ Àüü¸¦ ÆÄ¾ÇÇϴµ¥ Æí¸®ÇÒ °ÍÀÌ´Ù. ±×·¸Áö¸¸ »çÀü Áö½ÄÀÌ ¾ø´Â »ç¿ëÀÚ³ª ÀüÇô ȸ·Î¿¡ ´ëÇÑ Áö½ÄÀÌ ¾ø´Ù¸é µ¿ÀÛÀû ±â¼úÀÌ Ã³¸® ³»¿ëÀ» ÀÌÇØÇϴµ¥ Æí¸®ÇÒ °ÍÀÌ´Ù. ÀÌÁ¦ RC8001·Î µ¹¾Æ¿Í ±âº»ÀûÀÎ ºí·°¿¡ ´ëÇÏ¿© ÄÚµùÇØº¸ÀÚ. ¸ÕÀú °¡Àå °£´ÜÇÏ°í ¸¹ÀÌ ÀÌ¿ëµÇ´Â ÀÔ·ÂÀÚ·á°¡ 5 BitÀÎ 2¡¿1 MultiplexerÀÇ ¼³°è¸¦ ÇØº¸µµ·Ï ÇÏÀÚ. 2. Multiplexer RC8001¿¡¼ MultiplexerÀÇ ¿ªÇÒÀº PC ·¹Áö½ºÅÍÀÇ °ªÀ» 1 Áõ°¡ÇÒ °ÍÀΰ¡ ¶Ç´Â JumpÀÇ °æ¿ì¿Í °°ÀÌ IR¿¡¼ ÁöÁ¤ÇÏ´Â °ªÀ¸·Î ÇÒ °ÍÀΰ¡¸¦ ¼±ÅÃÇϱâ À§ÇÏ¿© »ç¿ëµÇ´Â ºí·°ÀÌ´Ù. ¿ä¾àÇϸé Select Signal¿¡ µû¶ó ÀÔ·ÂµÈ °ª Áß¿¡¼ Çϳª¸¦ ¼±ÅÃÇÏ¿© Ãâ·ÂÇØÁÖ´Â µðÀÚÀÎÀÌ´Ù. ¼³°è»ç¾çÀº ÀÔ·Â Port°¡ addr_m, r_addr_m, mux5_selÀ̰í Ãâ·Â Port°¡ addr_meÀÌ´Ù. ÀԷ°ªÀÌ Bus TypeÀ̹ǷΠData TypeÀº STD_LOGIC_VECTOR¸¦ ÀÌ¿ëÇϸç Size´Â (4 downto 0)·Î ¼±¾ðÇÑ´Ù. ÀÔ·Â SignalÀÌ '1'À̸é INC¿¡ ¼ Á¦°øµÈ °ª(addr_m)À» ÀÌ¿ëÇϰí ÀÔ·Â SignalÀÌ '0'À̸é IR Reg¿¡¼ Á¦°øµÈ °ª(r_addr_m)À» Ãâ·Â Port addr_me·Î Ãâ·ÂÇÑ´Ù. ¸¸ÀÏ ¾ÕÀÇ µÎ °¡Áö °æ¿ì ÀÌ¿ÜÀÇ »ç°ÇÀÌ ¹ß»ýÇϸé Ãâ·Â°ªÀº '00000'À¸·Î ÇÑ´Ù. < 5Bit 2¡¿1 Multiplexer > --*************************************************************** ENTITY mux5 IS PORT ( addr_m : IN STD_LOGIC_VECTOR(4 DOWNTO 0); r_addr_m : IN STD_LOGIC_VECTOR(4 DOWNTO 0); mux5_sel : IN STD_LOGIC; addr_me : OUT STD_LOGIC_VECTOR(4 DOWNTO 0)); END mux5; --*************************************************************** ARCHITECTURE mux5_a OF mux5 IS BEGIN PROCESS(addr_m, r_addr_m, mux5_sel) BEGIN IF mux5_sel = '1' THEN addr_me <= addr_m; ELSIF mux5_sel = '0' THEN addr_me <= r_addr_m; ELSE addr_me <= "00000"; END IF; END PROCESS; ----------------------------------------------------------------- END mux5_a; --*************************************************************** < 5Bit 2¡¿1 Multiplexer Source > addev[ addr_m ]{["00001" @ 10 ns],["00010" @ 20 ns], ["00011" @ 30 ns], ["00100" @ 40 ns],["00101" @ 50 ns], ["00110" @ 60 ns], ["00111" @ 70 ns],["01000" @ 80 ns], ["01001" @ 90 ns], ["01010" @100 ns] }; addev[r_addr_m]{["11110" @10 ns ], ["11101" @ 20 ns], ["11100" @ 30 ns], ["11011" @40 ns ], ["11010" @ 50 ns], ["11001" @ 60 ns], ["11000" @70 ns ], ["10111" @ 80 ns], ["10110" @ 90 ns], ["10101" @100 ns] }; addpat [mux5_sel]{[ 0 @ 15 ns ], [ 1 @ 20 ns ] }; view addr_m, r_addr_m, mux5_sel, addr_me; ÀÔ·ÂÀÌ 8 ºñÆ®ÀÎ 2¡¿1 Multiplexer´Â MEM ·¹Áö½ºÅÍÀÇ °ªÀ» ALU ·¹Áö½ºÅÍÀÇ Ãâ·ÂÀ¸·Î ÇÒ °ÍÀΰ¡ ¶Ç´Â RAM¿¡¼ ÀÐÀº °ªÀ¸·Î ÇÒ °ÍÀΰ¡¸¦ ¼±ÅÃÇϱâ À§ÇÏ ¿© ¿ä±¸µÇ´Â ºí·°ÀÌ´Ù. µû¶ó¼ ¾Õ¿¡¼ ±â¼úÇÑ Äڵ带 ÀÌ¿ë, ÀԷ°ú Ãâ·Â µ¥ÀÌÅÍ¿¡ ´ëÇÑ ºñÆ®¼ö¸¸ À» 8 ºñÆ®·Î º¯°æÇÏ¸é µÈ´Ù. ±âº»ÀûÀÎ ±¸Á¶´Â 5 ºñÆ® Multiplexer¿Í µ¿ÀÏ ÇϹǷΠÀÌ¿Í °ü·ÃµÈ ¼Ò½º´Â »ý·«ÇÑ´Ù. 3. Adder ÀÔ·ÂÀ» 1 Áõ°¡ÇÏ´Â INC ȸ·Î´Â ÇÁ·Î±×·¥ ¸Þ¸ð¸®ÀÇ À§Ä¡¸¦ °¡¸®Å°´Â PC ·¹Áö ½ºÅÍÀÇ °ªÀ» ¸í·É¾î¿¡ ´ëÇÑ Fetch µ¿ÀÛ ÈÄ 1ÀÇ Áõ°¡°¡ ¿ä±¸µÇµµ·Ï Çϱâ À§ÇÑ ºí·°ÀÌ´Ù. 1À» Áõ°¡½ÃŰ´Â ¾Ë°í¸®ÁòÀº ´ÙÀ½¿¡¼ º¸´Â ¹Ù¿Í °°ÀÌ »ê¼ú ÀûÀ¸·Î ó¸®ÇÏÁö ¾Ê°í ³í¸®¿¬»ê¿¡ ÀÇÇÑ ¹æ¹ýÀ» ÀÌ¿ëÇÑ´Ù. ¿¬»êÀÇ ¿¹> ÀÔ ·Â(PC_ADDR) : "00010101" = 21 Carry : "00000011" Ãâ ·Â(INC_ADDR) : "00010110" = 22 < INC Source> --************************************************************* ENTITY inc IS PORT ( pc_addr : IN STD_LOGIC_VECTOR(4 DOWNTO 0); inc_addr : OUT STD_LOGIC_VECTOR(4 DOWNTO 0)); END inc; --************************************************************* ARCHITECTURE inc_a OF inc IS SIGNAL carry : STD_LOGIC_VECTOR (4 DOWNTO 0); BEGIN carry (0) <= '1'; carry (1) <= pc_addr (0) AND carry (0); carry (2) <= pc_addr (1) AND carry (1); carry (3) <= pc_addr (2) AND carry (2); carry (4) <= pc_addr (3) AND carry (3); inc_addr <= pc_addr XOR carry; END inc_a; --************************************************************* < INC Stimulus > addev[pc_addr] {["00001" @ 10 ns],["00010" @ 20 ns],["00011"@30 ns], ["01000" @ 40 ns],["01110" @ 50 ns],["11111"@60 ns], ["11011" @ 70 ns] }; view pc_addr, inc_addr; 8 ºñÆ® Adder´Â CPUÀÇ ALU¿¡¼ÀÇ ¿¬»êÀ» ó¸®Çϴµ¥ ÀÌ¿ëµÈ´Ù. ¿©±â¼´Â ÀϹÝÀûÀÎ »ê¼ú¿¬»êÀ» ÀÌ¿ëÇÏÁö ¾Ê°í INC ºí·°¿¡¼ ¼³¸íÇÑ °¢°¢ÀÇ ºñÆ®¸¦ ³í¸®¿¬»êÇÏ¿© ±× °á°ú¸¦ ÃßÃâÇÏ´Â ¹æ¹ýÀ» ÃëÇÏ¿´´Ù. < 8Bit Adder Source > --******************************************************************* ENTITY add8 IS PORT ( in1 : IN STD_LOGIC_VECTOR (7 DOWNTO 0); in2 : IN STD_LOGIC_VECTOR (7 DOWNTO 0); out1 : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); END add8; --******************************************************************* ARCHITECTURE add8_a OF add8 IS --------------------------------------------------------------------- SIGNAL carry : STD_LOGIC_VECTOR (7 DOWNTO 0); --------------------------------------------------------------------- BEGIN carry(0) <= '0'; carry(1)<=(in1(0)and in2(0))or(in1(0)and carry(0))or(in2(0)and carry(0)); carry(2)<=(in1(1)and in2(1))or(in1(1)and carry(1))or(in2(1)and carry(1)); carry(3)<=(in1(2)and in2(2))or(in1(2)and carry(2))or(in2(2)and carry(2)); carry(4)<=(in1(3)and in2(3))or(in1(3)and carry(3))or(in2(3)and carry(3)); carry(5)<=(in1(4)and in2(4))or(in1(4)and carry(4))or(in2(4)and carry(4)); carry(6)<=(in1(5)and in2(5))or(in1(5)and carry(5))or(in2(5)and carry(5)); carry(7)<=(in1(6)and in2(6))or(in1(6)and carry(6))or(in2(6)and carry(6)); out1 <= in1 xor in2 xor carry; END add8_a; --******************************************************************* < 8 Bit Adder Stimulus > addpat [ in1 ] { [ "00000000" @ 15 ns ], [ "00001000" @ 20 ns ], [ "00001111" @ 30 ns ], [ "00110011" @ 40 ns ] }; addpat [ in2 ] { [ "00001010" @ 25 ns ], [ "00000101" @ 25 ns ], [ "01010101" @ 25 ns ], [ "00011000" @ 25 ns ] }; view in1, in2, out1; 4. ALU 5°¡Áö ±â´ÉÀ» ¼öÇàÇÏ´Â 8 ºñÆ® ALU´Â EXE ´Ü°è¿¡¼ ¿ä±¸µÇ´Â ALUÀÇ ±â´É Áß Add ¿¬»êÀÇ °æ¿ì´Â ALU ·¹Áö½ºÅÍ¿¡ ÀúÀåµÇ´Â °ªÀÌ 0Àΰ¡ÀÇ ¿©ºÎ¸¦ Á¶»çÇÏ¿© 0À̸é '1'À», ±×·¸Áö ¾ÊÀ¸¸é '0'À» Ãâ·ÂÇÏ´Â ZERO_FLAG Ãâ·ÂÀ» »ý¼ºÇÑ´Ù. < 8 Bit ALU Source > --****************************************************************** ENTITY alu IS PORT ( opcode : IN STD_LOGIC_VECTOR (2 DOWNTO 0); op_1 : IN STD_LOGIC_VECTOR (7 DOWNTO 0); op_2 : IN STD_LOGIC_VECTOR (7 DOWNTO 0); zero_a : OUT STD_LOGIC; alu_o : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); END alu; --****************************************************************** ARCHITECTURE alu_a OF alu IS -------------------------------------------------------------------- COMPONENT add8 PORT ( in1 : IN STD_LOGIC_VECTOR (7 DOWNTO 0); in2 : IN STD_LOGIC_VECTOR (7 DOWNTO 0); out1 : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); END COMPONENT; -------------------------------------------------------------------- SIGNAL temp_alu : STD_LOGIC_VECTOR (7 DOWNTO 0); SIGNAL add_result : STD_LOGIC_VECTOR (7 DOWNTO 0); -------------------------------------------------------------------- BEGIN -------------------------------------------------------------------- PROCESS(temp_alu) BEGIN IF temp_alu = "00000000" THEN zero_a <= '1'; ELSE zero_a <= '0'; END IF; END PROCESS; -------------------------------------------------------------------- ADD0 : ADD8 port map (op_1, op_2, add_result); -------------------------------------------------------------------- PROCESS(opcode,op_2,op_1) BEGIN CASE opcode IS WHEN "010" => temp_alu <= add_result; -- add WHEN "011" => temp_alu <= op_2 AND op_1; -- and WHEN "100" => temp_alu <= op_2 XOR op_1; -- xor WHEN "101" => temp_alu <= op_2; -- bypass for load WHEN "110" => temp_alu <= op_1; -- bypass for store WHEN OTHERS => temp_alu <= "00000000"; END CASE; END PROCESS; -------------------------------------------------------------------- alu_o <= temp_alu; -------------------------------------------------------------------- END alu_a; --******************************************************************* OP Äڵ忡 µû¶ó 5Á¾·ùÀÇ ¿¬»ê Áß Çϳª¸¦ ¼±ÅÃÇÏ¿© ó¸®ÇÏ´Ù. ¿©±â¼´Â 8 ºñÆ® Adder¸¦ ÄÄÇ»³ÍÆ®·Î ¼±¾ðÇÏ¿© ÀÌ¿ëÇϸç Ãâ·Â°á°ú°¡ '00000000'ÀÎ °æ¿ì ´Â Zero_aÀÇ °ªÀ» '1'·Î ÇÑ´Ù. Ç¥ 2. Op Code Table Instruction half if not zero skip if zero add and xor load store jump Op Code 000 001 010 011 100 101 110 111 °¢ OP ÄÚµåÀÇ ±â´É°ú 󸮳»¿ëÀº 2ȸ °ÁÂÀÇ Ç¥ 3À» ÂüÁ¶Çϱ⠹ٶõ´Ù. < 8Bit ALU Stimulus > addpat [op_1] { [ "00000000" @ 15 ns ], [ "00010001" @ 15 ns ], [ "00001111" @ 15 ns ], [ "01010101" @ 15 ns ] }; addpat [op_2] { [ "11100011" @ 20 ns ], [ "00001110" @ 30 ns ], [ "01010101" @ 40 ns ] }; addpat [opcode] { [ "000" @ 100 ns], [ "001" @ 200 ns], [ "010" @ 150 ns], [ "011" @ 100 ns], [ "100" @ 100 ns], [ "101" @ 100 ns], [ "110" @ 100 ns], [ "111" @ 100 ns] }; view opcode, op_1, op_2, zero_a, alu_o; ½Ã¹Ä·¹ÀÌ¼Ç °á°ú¸¦ °ËÁõÇÒ ¶§´Â À©µµÀÇ Zoomin ¸í·ÉÀ» »ç¿ëÇÏ¸é Æ¯Á¤ ºÎºÐ À» È®´ëÇÏ¿© ºÐ¼®ÇÒ ¼ö ÀÖÀ¸¸ç, Std_Logic_VectorÀÇ °æ¿ì´Â ¹ÙÀ̳ʸ® (Binary) ÇüÅ·Πǥ½ÃµÇ¹Ç·Î ¹ÙÀ̳ʸ®°¡ Àͼ÷ÇÏÁö¾ÊÀº »ç¿ëÀÚ´Â Verify¿¡¼ Change Bus Radix¸¦ ÀÌ¿ëÇÏ¿© ¿øÇÏ´Â ÇüÅÂÀÇ ¼ö½ÄÀ¸·Î º¯°æÇÏ¿© È®ÀÎÇÏ´Â °ÍÀÌ ÁÁ´Ù. 5. ·¹Áö½ºÅÍ(Register) ALUÀÇ ¼öÇà¿¡ µû¶ó »ý¼ºµÇ´Â ZERO_FLAG¿¡ ´ëÇÑ Á¤º¸¸¦ ÀúÀåÇϱâ À§ÇÏ¿© Enable ½ÅÈ£ ¹× ÃʱâÈ ½ÅÈ£¸¦ °®´Â 1 ºñÆ® FF¿¡ ´ëÇÑ ¼³°è°¡ ¿ä±¸µÈ´Ù. < 1 Bit Register Source > --******************************************************************** ENTITY reg1 IS PORT ( clk, rst, d, en : IN STD_LOGIC; q : OUT STD_LOGIC); END reg1; --******************************************************************** ARCHITECTURE reg1_a OF reg1 IS BEGIN PROCESS(clk, rst, d, en) BEGIN IF rst = '0' THEN q <= '0'; ELSIF en = '1' THEN IF clk = '0' AND clk'EVENT THEN q <= d; END IF; END IF; END PROCESS; END reg1_a; --******************************************************************** < 1 Bit Register Stimulus > addev [ pc_addr ] { [ "00001" @ 10 ns ], [ "00010" @ 20 ns ], [ "00011" @ 30 ns ], [ "01000" @ 40 ns ], [ "01110" @ 50 ns ], [ "11111" @ 60 ns ], [ "11011" @ 70 ns ] }; view pc_addr, inc_addr; ÇÁ·Î±×·¥ ¸Þ¸ð¸®ÀÇ À§Ä¡¸¦ °¡¸®Å°´Â PC ·¹Áö½ºÅÍÀÇ Å©±â°¡ 5 ºñÆ®À̹ǷΠÀ̸¦ À§ÇÑ 5 ºñÆ® ·¹Áö½ºÅÍÀÇ ¼³°è ¶ÇÇÑ ÇÊ¿äÇÏ´Ù. 5 ºñÆ® ·¹Áö½ºÅÍÀÇ °æ¿ì ´Â ÀÌ¹Ì µðÀÚÀÎÇÑ 1 ºñÆ® FFÀÎ REG1À» ÀÌ¿ëÇÏ¿© ±¸Á¶ÀûÀ¸·Î ±â¼úÀ» ÇÏ¸é Æí¸®ÇÏ´Ù. < 5Bit Register Source > --*************************************************************** ENTITY reg5 IS PORT ( ena : IN STD_LOGIC; rst_r : IN STD_LOGIC; clk_r : IN STD_LOGIC; dat_r : IN STD_LOGIC_VECTOR(4 DOWNTO 0); qr : OUT STD_LOGIC_VECTOR(4 DOWNTO 0)); END reg5; --*************************************************************** ARCHITECTURE reg5_a OF reg5 IS ----------------------------------------------------------------- COMPONENT reg1 PORT ( clk : IN STD_LOGIC; rst : IN STD_LOGIC; d : IN STD_LOGIC; en : IN STD_LOGIC; q : OUT STD_LOGIC); END COMPONENT; ----------------------------------------------------------------- BEGIN ----------------------------------------------------------------- u0 : reg1 port map (clk_r,rst_r,dat_r(0),ena,qr(0)); u1 : reg1 port map (clk_r,rst_r,dat_r(1),ena,qr(1)); u2 : reg1 port map (clk_r,rst_r,dat_r(2),ena,qr(2)); u3 : reg1 port map (clk_r,rst_r,dat_r(3),ena,qr(3)); u4 : reg1 port map (clk_r,rst_r,dat_r(4),ena,qr(4)); ----------------------------------------------------------------- END reg5_a; --*************************************************************** < 5 Bit Register Stimulus > addev [ena ] {[ 0 @ 10 ns ],[ 1 @ 20 ns ],[0 @ 70 ns],[1@150ns] }; addev [rst_r ]{ [ 0 @ 15 ns ],[ 1 @ 30 ns ] }; addpat[clk_r ]{ [ 1 @ 10 ns ],[ 0 @ 10 ns ] }; addpat[dat_r ]{ [ "00001" @ 40 ns ],[ "01010" @ 30 ns ] }; view ena, rst_r, clk_r, dat_r, qr; 8 ºñÆ® ·¹Áö½ºÅÍ´Â ÇÁ·Î±×·¥ ¸Þ¸ð¸®¿¡¼ ÀÐÀº ¸í·É¾î¸¦ ±â¾ïÇÏ´Â IR ·¹Áö ½ºÅÍ, ALUÀÇ ¿¬»ê °á°ú¸¦ ÀϽÃÀûÀ¸·Î ÀúÀåÇÏ´Â ALU ·¹Áö½ºÅÍ, µ¥ÀÌÅÍ ¸Þ¸ð¸®ÀÇ ³»¿ëÀ» ÀϽÃÀûÀ¸·Î ÀúÀåÇÏ´Â MEM ·¹Áö½ºÅÍ ±×¸®°í ACC ·¹Áö½ºÅÍ ÀÇ ¼³°è¸¦ À§ÇÏ¿© 8 Bit ·¹Áö½ºÅÍÀÇ ¼³°è°¡ ¿ä±¸µÈ´Ù. ¸¶Ä¡¸ç À̹ø¿¡´Â Multiplexer, Adder, Increase, ALU, F/F, ·¹Áö½ºÅÍ¿¡ ´ëÇÑ VHDL ¼Ò½º¸¦ ¼³¸íÇÏ¿´´Ù. VHDLÀ» ÀÌ¿ëÇÑ ÄÚµå´Â ÀϹÝÀûÀÎ °³¹ß ¾ð¾î¿¡ ºñÇÏ¿© °£´ÜÇÏ°í ´Ü¼øÇÏ´Ù. ¾Æ¸¶ C³ª PascalµîÀ» »ç¿ëÇØ º» µ¶ÀÚ¶ó¸é ´«À¸·Î Çѹø ÃË´Â Á¤µµ·Î ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ±×·¯³ª VHDLÀÌ ´Ù¸¥ ÇÁ·Î±×·¡¹Ö ¾ð¾î¿Í ´Ù¸¥ Á¡Àº Çϵå¿þ¾î ¼³°è¸¦ ¸ñÀû À¸·Î µðÀÚÀÎµÈ ¾ð¾î¶ó´Â Á¡ÀÌ´Ù. ¿ì¸®´Â C³ª PascalÀ» °¡Áö°í ¿øÇÏ´Â ÇÏµå ¿þ¾îÀÇ ±â´ÉÀ» ½Ã¹Ä·¹À̼ÇÇÒ ¼ö´Â ÀÖÀ» °ÍÀÌ´Ù. ±×·¯³ª ±× ¼Ò½º Äڵ带 ÀÌ¿ëÇÏ¿© Çϵå¿þ¾î¸¦ ¸¸µé ¼ö´Â ¾ø´Ù. ±×·¯¹Ç·Î VHDLÀ» ½ÇÁ¦ Çϵå¿þ¾î·Î ±¸ÇöÇÒ ¼ö ÀÖ´Â ±â¹ÝÀ» Á¦°øÇÑ´Ù´Â Á¡¿¡¼ ´Ù¸¥ ¾ð¾î¿ÍÀÇ Â÷À̸¦ µÎ¾î¾ß ÇÒ °ÍÀÌ´Ù. ´ÙÀ½¿¡´Â ³ª¸ÓÁö ºí·°¿¡ ´ëÇÏ¿© Source¿Í ½Ã¹Ä·¹À̼ÇÀ» À§ÇÑ ÀڷḦ ¼³¸íÅä·Ï ÇϰڴÙ. Âü°í 1 MyVHDL StationÀÇ ½Ã¹Ä·¹ÀÌ¼Ç ÆÄÀÏ ÀÛ¼º¿ä·É ½Ã¹Ä·¹À̼ÇÀ» ¼öÇàÇϱâ À§ÇØ ÀÔ·Â Port¿¡ ÇÒ´çÇÒ SignalÀÇ ¸®½ºÆ®¸¦ ÀÛ¼º ÇØ¾ßÇϴµ¥, À̸¦ ½ºÆ¼¹Ä·¯½º(Stimulus) ¶Ç´Â Å×½ºÆ® º¤ÅÍ(Test Vector)¶ó ºÎ¸¥´Ù. MyVHDL¿¡¼´Â ½ºÆ¼¹Ä·¯½º¸¦ ¿ÜºÎ¿¡¼ ÆÄÀÏ·Î ÀÛ¼ºÇÏ¿© ÀԷ¹ÞÀ» ¼ö ÀÖ°Ô µÇ¾î ÀÖÀ¸¸ç, ½Ã¹Ä·¹ÀÌ¼Ç °á°ú È®ÀÎ °úÁ¤¿¡¼ Ãâ·ÂÇÒ ½Ã±×³Î(Signa) lÀÇ ¸®½ºÆ®µµ ÀÌ ÆÄÀÏ¿¡¼ Á¤ÀÇÇϹǷΠĿ¸Çµå ÆÄÀÏ(Command File)À̶ó°í ÇÑ´Ù. ±âº» ¹®¹ý ±¸Á¶ . ADDEV : Add Event ½Ã¹Ä·¹À̼ÇÀÇ ½ÃÀÛ¿¡¼ ÁöÁ¤µÈ ½Ã°£¸¸Å Áö³ ½ÃÁ¡¿¡¼ÀÇ ½Ã±×³Î(Signal) °ªÀ» ¼³Á¤ÇÑ´Ù. ½Ã±×³¯ °ªÀ» º¯°æÇϱâ Àü±îÁö´Â ÀÌÀüÀÇ °ªÀÌ À¯ÁöµÈ´Ù. addev [signal name] { [ 'value' @ time (time resolution)], [...], ...}; . ADDPAT : Add Pattern ½Ã¹Ä·¹ÀÌ¼Ç ½ÃÀÛ¿¡¼ºÎÅÍ ³¡³¯ ¶§±îÁö ÁöÁ¤µÈ ÆÐÅÏÀ» ¹Ýº¹ÇÑ´Ù. addpat [signal name] { [ 'value' @ time (time resolution)], [...], ...}; . VIEW : Signal List for Result Display ½Ã¹Ä·¹ÀÌ¼Ç °á°ú¸¦ Vwaver·Î µð½ºÇ÷¹ÀÌÇÒ ¶§ Ç¥½ÃµÉ ½Ã±×³ÎÀ» ÁöÁ¤ÇÑ´Ù. view signal_name1, signal_name2, ....... Âü°í 2. Å×½ºÆ® º¥Ä¡(Test Bench)ÀÇ »ç¿ë ÀϹÝÀûÀ¸·Î VHDL Åø¿¡¼´Â ½Ã¹Ä·¹À̼ÇÀ» ¼öÇàÇϱâ À§Çؼ Å×½ºÆ® º¥Ä¡¸¦ »ç¿ëÇÑ´Ù. ¹°·Ð MyVHDL Station¿¡¼µµ Å×½ºÆ® º¥Ä¡¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª ÇöÀçÀÇ º£Å¸ ¹öÀü¿¡¼´Â ½Ã¹Ä·¹ÀÌ¼Ç ÆÄÀÏ »ç¿ëÀ» ±âº»À¸·Î ¼³Á¤ÇÏ ¿´±â¿¡ ¾Õ¿¡¼ ¼³¸íÇÑ ½ºÆ¼¹Ä·¯½º ÆÄÀÏÀ» ¹è¿ö¾ßÇÏ´Â °ÍÀ̰í Á¤½Ä ¹öÀü ¿¡¼´Â ½ºÆ¼¹Ä·¯½º¿¡ ÀÇÇÑ ¹æ¹ý»Ó¸¸ ¾Æ´Ï¶ó ÇöÀçÀÇ Ä¿¸Çµå ÆÄÀÏ ¹æ½ÄÀÇ ½Ã¹Ä·¹À̼ÇÀ» ¸ðµÎ »ç¿ëÇÒ ¼ö ÀÖ´Ù.