บทที่ 8 โปรแกรม...
Transcript of บทที่ 8 โปรแกรม...
เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 66
บทท 8 โปรแกรม LogicWorks
วตถประสงคของการเรยนในบทน
ใชโปรแกรม LogicWorks เพอออกแบบและจ าลองการท างานของวงจรเชงผสมและวงจรเชงล าดบ
จ าลองการท างานของวงจรบวก (adder)
การออกแบบโดยแยกเปนมอดล (module)
เลอกใชไอซ (Integrated Circuit: IC) ในตระกล TTL
ใชอปกรณอนพตเอาตพต เชน สวตช ปมกด LED 7-segment
จ าลองการท างานของวงจรควบคมปมน า (water pump controller)
ใชแผนภาพเวลา (timing diagram)
ใชภาษา VHDL เพอสรางเครองสถานะจ ากด (Finite-State Machine: FSM)
ใชพรอม (Programmable Read-Only Memory: PROM) และแรม (Random Accessed Memory: RAM)
มดสายไฟหลายๆ เสนรวมกน
ในบทน เราจะมาดการออกแบบวงจรโดยใชโปรแกรม LogicWorks ผมคดมาเฉพาะตวอยางทนสตจ าเปนตองใช
ในการท าโครงงาน และใชท าความเขาใจการท างานไมโครโพรเซสเซอร การใชงานโปรแกรม LogicWorks ท
นอกเหนอจากน นสตสามารถศกษาไดจากคมอการใชงานโปรแกรม
วงจรบวก (Adder)
ตวอยางแรกลองท าวงจรบวกแบบงายๆ กอน ขนแรกกท าวงจรบวกเตมอตรา (full adder) ส าหรบบวกเลข 1 บต
กอน หลงจากนนใสสวตชส าหรบปอนอนพตเขาไปทดสอบ ใส LED หรอ probe ส าหรบดเอาตพต ดรปท 8.1
รปท 8.1 วงจรบวกเตมอตรา (full adder)
เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 67
ตอไปถาเราจะท าวงจรบวกขนาด 4 บต กเอาวงจรบวกเตมอตรา 4 ตวมาตอขนานกน อาจจะใชวธ copy & paste
แตเรามวธทดกวานนคอ สรางมอดลวงจรบวกเตมอตราขนมากอน แลวใชมอดลน ซ าไดหลายๆ ครง การสราง
มอด ล เร มจาก New -> Model Wizard -> Create a new, empty model และ Open the new model as an
independent design -> Structural circuit และปอนช อมอดล เชน FullAdder ขนตอไปใสขาอนพต A, B,
Carry-in และขาเอาตพต Sum, Carry-out จากนนออกแบบมอดลตามทตองการ แลวก save เกบไว เวลาจะ
เรยกใชก New -> Model Wizard -> Select an existing file และ Create a new symbol with the specified
model attached -> Pin locations (กด next) -> ตงชอส าหรบ new part เชน FullAdder -> New Lib (ตงชอ
เชน MyLib จะไดไมไปปนกบ library อน) -> กด Finish เสรจแลวจะม FullAdder ใหเลอกจากใน View ->
Parts Palette ทอยทางขวามอ
รปท 8.2 วงจรบวกขนาด 4 บต ทสรางจากมอดล FullAdder
เราอาจจะท าวงจรบวกขนาด 4 บตเกบไวเปนอกมอดลหนง ส าหรบท าวงจรบวกขนาดใหญขน เชน 8, 16, 32 บต
จะไดไมตองเอาวงจรบวกเตมอตรามาตอกนทละบต
เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 68
การเลอกใชไอซ (IC) ในตระกล TTL
ไอซยอมาจาก Integrated Circuit (IC) หรอเรยกวา “วงจรรวม” สวน TTL ยอมาจากชอเทคโนโลยทใชท าวงจร
รวมคอ “Transistor Transistor Logic” มไอซส าเรจรปในตระกล TTL ใหเลอกใชมากมาย เชน 74LS83 ในรปท
8.3 เวลาคนหาใน parts palette ใหใชคยเวรด “74_83”
รปท 8.3 วงจรรวม TTL เบอร 74LS83 หรอ 4-bit binary full adder with fast carry (ซาย)
และสญลกษณในโปรแกรม LogicWorks (ขวา)
ปมกด
โดยปกตปมกดแบบทเมอปลอยแลวจะเดงขนเองอตโนมต ขณะกดจะใหคา 0 เมอปลอยจะใหคา 1 ดรปท 8.4
เมอน าหลายๆ ปมมาประกอบกนกเปนคยบอรด
รปท 8.4 ปมกด SPDT Pushbutton (ซาย) คยบอรดทสรางขนจากปมกดหลายๆ อน (ขวา)
เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 69
7-Segment
7-Segment คอหลอดไฟ 7 ดวง ส าหรบแสดงคา 0 – 9 (ฐานสบ) หรอ 0 – F (ฐานสบหก) หลอดไฟดวงท
แปดเอาไวแสดงจดทศนยม รปท 8.5
รปท 8.5 7-Segment
วงจรควบคมปมน า
ผมเอาวงจรปมน าในบทท 5 รปท 5.14 มาท าในโปรแกรม LogicWorks กจะไดดงรปท 8.6 ดฟลปฟลอปทใชใน
โปรแกรม LogicWorks คอ “D Flip Flop wo/SQ/” ซงจะท างาน (Q = D) ทขอบขาข น และรเซต (Q = 0)
ทนทท R มคาเปน 0 นสตอาจจะใช binary switch แทนสญญาณนาฬกาแลวใชเมาสคลกเพอสรางสญญาณ
นาฬกาเอง จะไดสงเกตดการเปลยนแปลงของคาตางๆ ไดทน
รปท 8.6 วงจรควบคมปมน าในโปรแกรม LogicWorks (แบบ schematic)
เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 70
ใหต งช อสายไฟเปน Reset, Clock, State, Sensor_up, Sensor_dn, Pump เม อจ าลองการท างานของวงจร
สญญาณเหลาน จะไปปรากฏในแผนภาพเวลาทอยดานลางของจอภาพดงรปท 8.7 (ปรบ Timing Options เปน
Retain forever)
รปท 8.7 แผนภาพเวลาของวงจรควบคมปมน าในโปรแกรม LogicWorks
VHDL
VHDL ย อ ม า จ า ก VHSIC Hardware Description Language (VHIC ค อ Very High Speed Integrated
Circuits) เปนภาษาทใชอธบายฮารดแวร ดงนนการออกแบบฮารดแวรสามารถท าไดในลกษณะคลายๆ กบการ
เขยนโปรแกรม จากประสบการณสอนของผม ยงไมควรใหนสตใช VHDL เพราะ VHDL มทงสวนทคอมไพลเปน
ฮารดแวรไดจรง และสวนทคอมไพลเปนฮารดแวรไมได เชน if-else, for-loop, while-loop ค าสงเหลาน ใชเพอ
ทดสอบการท างานของวงจรเทานน แตนสตมกจะใชค าสงในสวนทคอมไพลเปนฮารดแวรไมไดเพอท างานสง
อาจารย ผมอนโลมใหใช VHDL ไดเฉพาะกบ FSM ทมขนาดใหญ เพอลดความยงยากในการออกแบบ FSM
วธการสรางมอดลแบบ VHDL มขนตอนเหมอนการสรางมอดลแบบปกต ขนแรกเลอก Model Wizard ในขน
ตอไปเปลยนตวเลอกจาก Structural circuit เปน VHDL เมอเขยน VHDL เสรจแลวกลองเลอก VHDL ->
Compile ดวามขอผดพลาด (error) หรอไม
เปรยบเทยบการออกแบบวงจรดวยเครองมอแบบ schematic (ซาย) และ hardware description language (ขวา)
Wire a, b, c, d, e;
And(a, b, d)
Or(d, c, e)
ในบทน ผมจะแสดงภาษา VHDL เฉพาะสวนทจ าเปนส าหรบการท า FSM สวนทนอกเหนอจากน นสตสามารถ
ศกษาเพมเตมไดจากหนงสอ “ภาษา VHDL ส าหรบการออกแบบวงจรดจตอล” ดในรายการอางองทายบท
เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 71
FSM ของปมน าเขยนแบบน
library IEEE;
use IEEE.std_logic_1164.all;
entity Water_pump_VHDL is
port (
reset : in std_logic;
clock : in std_logic;
sensor : in std_logic_vector(1 downto 0);
pump : out std_logic
);
end Water_pump_VHDL;
architecture arch1 of Water_pump_VHDL is
type state_type is (s0, s1);
signal state : state_type;
begin
state_p: process(clock, reset)
begin
if reset = '0' then
state <= s0;
elsif clock'event and clock = '1' then -- positive edge
case state is
when s0 =>
if sensor(1 downto 0) = "00" then state <= s0; end if;
if sensor(1 downto 0) = "01" then state <= s0; end if;
if sensor(1 downto 0) = "10" then state <= s1; end if;
if sensor(1 downto 0) = "11" then state <= s1; end if;
when s1 =>
if sensor(1 downto 0) = "00" then state <= s0; end if;
if sensor(1 downto 0) = "01" then state <= s1; end if;
if sensor(1 downto 0) = "10" then state <= s1; end if;
if sensor(1 downto 0) = "11" then state <= s1; end if;
end case;
end if;
end process state_p;
output_p: PROCESS(state,sensor)
begin
case state is
when s0 =>
if sensor(1 downto 0) = "00" then pump <= '1'; end if;
if sensor(1 downto 0) = "01" then pump <= '1'; end if;
if sensor(1 downto 0) = "10" then pump <= '0'; end if;
if sensor(1 downto 0) = "11" then pump <= '0'; end if;
when s1 =>
if sensor(1 downto 0) = "00" then pump <= '1'; end if;
if sensor(1 downto 0) = "01" then pump <= '0'; end if;
if sensor(1 downto 0) = "10" then pump <= '0'; end if;
if sensor(1 downto 0) = "11" then pump <= '0'; end if;
end case;
end process output_p;
end arch1;
เวลาท าโครงงานนสตอาจจะลากสายไฟ state ออกมาแสดงเปนเอาตพตดวย จะไดร วา FSM ท างานไปถง state
ไหนแลว เรยกใชมอดลทสรางจาก VHDL ไดเหมอนมอดลปกต ดรปท 8.8
เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 72
รปท 8.8 วงจรควบคมปมน าในโปรแกรม LogicWorks (แบบ VHDL)
พรอม (PROM) และแรม (RAM)
วธการสรางมอดลประเภทหนวยความจ าใน LogicWorks ใหไปท Simulation -> PROM/RAM/PLA Wizard
จะมใหเลอก 3 ประเภทคอ PLA, PROM และ RAM ในทน จะขออธบายเฉพาะสองประเภทหลง
PROM คอ programmable read-only memory เปนหนวยความจ าแบบลบเลอนไมได (non-volatile) คอเมอ
ไฟดบขอมลกยงอย ปกตจะเขยนคาลงในพรอมไดเพยงครงเดยว เหมอนแผน CD/DVD การเขยนตองใช
อปกรณพเศษตางหาก เมอเขยนแลวถงจะน ามาใชเปน ROM แบบ read-only ได พรอมหลายชนดสามารถน า
กลบมาเขยนใหมได เชน EEPROM หรอ electronically erasable PROM
แรม (RAM) ในทน หมายถงเอสแรม (RAM) เปนหนวยความจ าแบบลบเลอนได คอเมอไฟดบขอมลจะหาย
หมด การอานและเขยนขอมลท าไดงาย ลองสรางแรมทม Address lines = 3, Bits per word = 2 และ Enter hex
data manually จะไดแรมขนาด 23 = 8 ชอง แตละชองเกบขอมลได 2 บต ก าหนดคาในแรมเปน 1 1 2 2 1 2 2
2 ตอนนสงทบรรจอยในแรมคอตารางคาความจรงส าหรบสถานะถดไป (next state) และเอาตพต (output) ของ
วงจรปมน า ดงน (A2A1A0 คอ สถานะปจจบน ตวรบรตวบนและตวลาง D1D0 คอ สถานะถดไปและเอาตพต ใน
วงเลบคอเลขฐานสบของ D1D0)
A2A1A0 D1D0
000 01 (1)
001 01 (1)
010 10 (2)
011 10 (2)
100 01 (1)
101 10 (2)
110 10 (2)
111 10 (2)
รปท 8.9 แสดงวงจรควบคมปมน าแบบใชพรอม ทจรงแลวพรอมกคอตารางทใชเกบคาคงท จะน าไปประยกต
เพอเกบคาอะไรกได เชน ตารางคา sine, cos, tan หรอ logarithm เปนตน หรอจะใชแทนวงจรเชงผสมโดยเกบ
ตารางคาความจรงกได แตในทางปฏบตไมคอยท ากนเพราะใชจ านวนทรานซสเตอรมากกวาการออกแบบดวยเกต
เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 73
รปท 8.9 วงจรควบคมปมน าในโปรแกรม LogicWorks (แบบใช PROM)
ตอไปลองสรางแรมทม Address lines = 4, Chip enables = 1, Bits per word = 8, Common I/O pins จะได
ตารางเกบคาขนาด 24 = 16 ชอง แตละชองเกบขอมลได 8 บต ดงรปท 8.10 ขา A 4 บตใชระบเลขทอย
(address) ทตองการอานหรอเขยน ขา DIO 8 บตคอพอรตเขาออกไดสองทาง (bi-directional port) ทใชทงอาน
และเขยน แผนภาพเวลาการอานและเขยนแรมแสดงในรปท 8.11 แรมจะท างานได CE ตองเปน 0 เสมอ เวลา
อานคาจากแรมให WE = 1, A = address ทเราตองการ คาจะออกมาทาง DIO หลงจาก AA (address access)
time สวนเวลาเขยนคาลงแรมให WE = negative pulse, A = address ทเราตองการ การเขยนจะเสรจทขอบขาขน
ของ WE ตองใหเลขทอยมากอนขอบขาข นอยางนอย AW (address valid to end of write) time และตองให
ขอมลมากอนกอนขอบขาขนอยางนอย DW (data to write time overlap) time แผนภาพเวลาของไอซจรงๆ จะม
เงอนไขทางเวลาทซบซอนกวาน มาก ทอธบายมาเปนเพยงสวนหนงเทานน ในโปรแกรม LogicWorks จะไมม
เงอนไขทางเวลา เชน สมมตไดวา AA, AW, DW time มคาเปนศนย (หรอจะก าหนดใหมคากได)
ถา CE = 1 ขา DIO ทงหมดจะเปนคา z ใชในกรณทตองการตดแรมออกจากบสขอมลทมอปกรณหลายตวเกาะ
อย
รปท 8.10 แรมขนาด 24 x 8 บต
เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 74
รปท 8.11 แผนภาพเวลา (ซาย) การอานและ (ขวา) เขยนแรม
การมดสายไฟหลายๆ เสนรวมกน
โดยปกตบสขอมลทใชเชอมตออปกรณหลายๆ ชนมกจะมสายไฟจ านวนมาก เชน 8, 16, 32, 64 เราสามารถใช
ค าสง Schematic -> New Breakout -> เตม D0..7 เพอมดสายไฟ 8 เสนรวมกน เวลายายต าแหนงจะไดไมตอง
ยายสายไฟทละเสน ดตวอยางในรปท 8.12 เวลาจะดงแคบางเสนจากมดออกมาใชก New Breakout แค D6..7
แลวเอาไปแปะไวกบมดเดม
รปท 8.12 การมดสายไฟหลายๆ เสนรวมกน
หนวยควบคม (Control Unit)
ธรรมชาตของฮารดแวรคอ มนออกแบบยากกวาการเขยนโปรแกรม เชน จะออกแบบวงจรคณยงไง? แตเราทราบ
วา m x n คอ m บวกกน n ครง ดงนนแทนทเราจะออกแบบวงจรคณ เรากใชวงจรบวกซงออกแบบงายกวามาก
และใชวงจรบวกเพยงตวเดยวกพอ แตใชซ า n ครง โดยมหนวยควบคมซงกคอ FSM เปนตวก าหนดจงหวะการ
ท างาน ผมออกแบบเครองคดเลขงายๆ ทท าการคณไดโดยใชวงจรบวกเพยงสองตวในรปท 8.13 ในขนน ยงไมม
ตวควบคม สญญาณทมาจากตวควบคม ผมใส binary switch ไว เพอใหนสตทดลองเลนดได อยากใหสญญาณ
ควบคมยงกโยกสวตชเอาเอง
เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 75
รปท 8.13 วงจรคณทใชวงจรบวกสองตว (ไมม FSM)
สวนประกอบของวงจรในรปท 8.13 มดงน
Shift Register เปน shift register ขนาด 4 บต (74_95) ใชเกบตวถกด าเนนการ (operand) ท ผใช
ปอนเขามาทางคยบอรด โดยเลอน (shift) เขาไปเกบทละ 1 บต ถา MODE = 0 จะเปนเลอนซายคอ
เมอไดขอบขาลงท CLK1 จะเลอนซายไป 1 บต โดย SER IN (serial in) จะเขาไปแทนท LSB (MSB
จะหายไป) ถา MODE = 1 เปนการโหลดคาจากขา D, C, B, A เขาไปเกบในเรจสเตอร ขา QD, QC,
QB, QA เอาตพตคาปจจบนของเรจสเตอรอยตลอดเวลา
Register A และ B เปนเรจสเตอรขนาด 4 บต (Reg-4 inv CLR) ถาเกดขอบขาขนท CLK จะเปนการ
โหลดคาจากขา D3, D2, D1, D0 เขาไปเกบในเรจสเตอร ขา Q3, Q2, Q1, Q0 เอาตพตคาปจจบน
ของเรจสเตอรอยตลอดเวลา ขา CLR ใชรเซตคาในเรจสเตอรใหเปนศนย โดยให CLR = 0 จะรเซต
ทนท ไมตองรอใหเกดขอบขาขนหรอขอบขาลงท CLK
เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 76
บฟเฟอรสามสถานะ (tri-state buffer) ขนาด 4 บต (Buffer-4 T.S.) สงเกตวาขาเอาตพตของเรจส
เตอรทกตวจะตอกบบฟเฟอรสามสถานะกอนลงบสขอมล (data bus) ถา OE = 0 จะน าคา D3, D2,
D1, D0 ลงบสขอมล แตถา OE = 1 จะใหคา z (ตดออกจากบสขอมล)
คยบอรด อยทางซายมปม 0, 1, Reset (เมอกดจะรเซตคาใน shift register ใหเปน 0), x, = นอกจาก
การรเซตคาใน shift register แลวผมตองการใหโหลดคาลงไปไดดวย เพราะการคณ ShiftReg = RegA
x RegB จะท าดงน
RegA = operand 1 (คาบวก)
RegB = operand 2 (คาบวก)
ShiftReg = 0 // reset
while RegB > 0 do
ShiftReg = ShiftReg + RegA // load
RegB = RegB – 1
end while
ดงนนปม Reset จงท างานไดทงเปน reset หรอ load ข นอยกบวา multiplexor (Mux-2x4 T.S.) จะ
เลอกคาอะไร ระหวางคาศนยกบคาจากบสขอมลเพอโหลดลง shift register ถา S0 = 0 จะเลอกคาศนย
ถา S0 = 1 จะเลอกคาจากบสขอมล
วงจรบวก 2 ตว (74_83) ตวซายใชค านวณ ShiftReg + RegA ตวขวาใชค านวณ RegB – 1
การคณมขนตอนดงน
1. กดปม Reset เพอท าให Shift Register มคาเปนศนย
2. ปอนคาตวถกด าเนนการ (operand) ตวแรก โดยกดปม 0 หรอ 1
3. กดปม Multiply (x) เปนการสนสดการปอนคา
4. ให OE ของ Buffer 1 มคาเปน 0 เพอเอาคาใน Shift Register ลง Data Bus
5. ใหขอบขาขนท CLK ของ Register A เพอเขยนคาจาก Data Bus ลง Register A
6. รเซตคาใน Shift Register ใหเปน 0
7. ปอนคาตวถกด าเนนการ (operand) ตวทสอง โดยกดปม 0 หรอ 1
8. กดปม Equal (=) เปนการสนสดการปอนคา (OE ของ Buffer 1 ยงมคาเปน 0)
9. ใหขอบขาขนท CLK ของ Register B เพอเขยนคาจาก Data Bus ลง Register B (และในเวลา
เดยวกนให OE ของ Buffer 1 มคากลบเปน 1)
10. รเซตคาใน Shift Register ใหเปน 0 และใหขา S0 (select) ของ MUX มคา 1 เพราะตอไปเรา
จะเขยนคาจาก Data Bus ลง Shift Register เทานน (จะไมรเซตแลว)
11. เรมท าการคณโดยให OE ของ Buffer 2 มคาเปน 0 เพอเอาคา Shift Register + Register A
ลง Data Bus
12. กดปม Reset (Load) เพอเขยนคาจาก Data Bus ลง Shift Register (และในเวลาเดยวกนให
OE ของ Buffer 2 มคากลบเปน 1)
13. ให OE ของ Buffer 3 มคาเปน 0 เพอเอาคา Register B – 1 ลง Data Bus
เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 77
14. ใหขอบขาขนท CLK ของ Register B เพอเขยนคาจาก Data Bus ลง Register B (และในเวลา
เดยวกนให OE ของ Buffer 3 มคากลบเปน 1)
15. ตรวจสอบดสญญาณ Terminate วาเปน 1 หรอไม ถา Terminate = 0 ใหกลบไปท าขอท 11 ถา
Terminate = 1 แสดงวาการคณเสรจแลว ผลลพธอยใน Shift Register
จากขนตอนขางตน นสตจะตองโยกสวตชเพอควบคมการท างานของวงจรเพอท าการคณ แตทจรงแลวเราสามารถ
สราง FSM เพอใหควบคมการท างานใหเปนไปตามขนตอนทเราตองการได กอนอนมาดกอนวา FSM ตองม
อนพตและเอาตพตอะไรบาง
อนพต:
clock สญญาณนาฬกา
reset ใชรเซต FSM ใหเรมท างานท initial state
mul มคาเปน 0 เมอมการกดปม Multiply (x)
eq มคาเปน 0 เมอมการกดปม Equal (=)
term มคาเปน 1 เมอ Register B มคาเทากบศนย
เอาตพต:
sel สงไปควบคมขา select ของ MUX
oe1 สงไปควบคม Buffer 1
oe2 สงไปควบคม Buffer 2
oe3 สงไปควบคม Buffer 3
we1 สงไปควบคมการเขยน Shift Register
(ท างานทขอบขาขน)
we2 สงไปควบคมการเขยน Register A
(ท างานทขอบขาขน)
we3 สงไปควบคมการเขยน Register B
(ท างานทขอบขาขน)
เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 78
สราง FSM ทมขาอนพตเอาตพตตามทก าหนด แลวเชอมเขากบวงจรเดมทออกแบบไวจะไดดงรปท 8.14
รปท 8.14 วงจรคณทใชวงจรบวกสองตว (ม FSM)
เรมตนใชงานใหกดปม Reset FSM แลวกใชงานเหมอนเครองคดเลขปกต ปอนตวถกด าเนนการตวแรก
กดปม Multiply (x) ปอนตวถกด าเนนการตวทสอง กดปม Equal (=) ผลลพธของการคณจะอยใน Shift
Register
เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 79
โคด VHDL ทใชสราง FSM เปนดงน
library IEEE;
use IEEE.std_logic_1164.all;
entity Multiplier_FSM is
port(
clock : in std_logic;
reset : in std_logic;
mul : in std_logic;
eq : in std_logic;
term : in std_logic;
sel : out std_logic;
oe1 : out std_logic;
oe2 : out std_logic;
oe3 : out std_logic;
we1 : out std_logic;
we2 : out std_logic;
we3 : out std_logic
);
end Multiplier_FSM;
architecture arch1 of Multiplier_FSM is
type state_type is (s0,s1,s2,s3,s4,s5,s6,s7,s8);
signal state : state_type;
begin
state_p: process(clock, reset)
begin
if reset = '0' then
state <= s0;
elsif clock'event and clock = '1' then -- positive edge
case state is
when s0 => -- load default values
state <= s1;
when s1 => -- ShiftReg = 0
state <= s2;
when s2 => -- wait for oper1
if mul = '0' then state <= s3; end if;
when s3 => -- RegA = ShiftReg, ShiftReg = 0
state <= s4;
when s4 => -- wait for oper2
if eq = '0' then state <= s5; end if;
when s5 => -- RegB = ShifReg, ShifReg = 0
state <= s6;
when s6 => -- Start multiplication
state <= s7;
when s7 =>
state <= s8;
when s8 =>
if term = '0' then state <= s6; end if; end case;
end if;
end process state_p;
เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 80
output_p: PROCESS(state,mul,eq,term)
begin
case state is
when s0 =>
sel <= '0'; -- default
oe1 <= '1'; oe2 <= '1'; oe3 <= '1';
we1 <= '1'; we2 <= '0'; we3 <= '0';
when s1 =>
we1 <= '0'; -- ShiftReg = 0
when s2 =>
we1 <= '1'; -- restore
oe1 <= '0'; -- DataBus = ShiftReg
when s3 =>
we2 <= '1'; -- RegA = DataBus (ShiftReg)
we1 <= '0'; -- ShiftReg = 0
when s4 =>
we2 <= '0'; -- restore
we1 <= '1'; -- restore
when s5 =>
we3 <= '1'; -- RegB = DataBus (ShiftReg)
we1 <= '0'; -- ShiftReg = 0
when s6 =>
we3 <= '0'; -- restore
we1 <= '1'; -- restore
sel <= '1'; -- Mux = DataBus
oe1 <= '1'; -- restore
oe2 <= '0'; -- DataBus = ShiftReg + RegA
when s7 =>
we1 <= '0'; -- ShiftReg = DataBus (ShiftReg + RegA)
oe2 <= '1'; -- restore
oe3 <= '0'; -- DataBus = RegB - 1
when s8 =>
we1 <= '1'; -- restore
we3 <= '1'; -- RegB = DataBus (RegB - 1)
oe3 <= '1'; -- restore
end case;
end process output_p;
end arch1;
เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 81
วงจรคณเชงผสม
ในการออกแบบฮารดแวร เราสามารถประนประนอม (tradeoff) ระหวาง “ขนาดของวงจร” (นบเปนจ านวน
ทรานซสเตอร) กบ “เวลาทตองใช” (นบเปนจ านวนรอบของสญญาณนาฬกา) ในตวอยางทแลว เราท าการคณ
โดยใชวงจรบวกเทานน แตตองใชจ านวนรอบของสญญาณนาฬกามาก ตวอยางน จะแสดงใหเหนวาเราออกแบบ
วงจรคณใหเปนวงจรเชงผสม (combinational circuit) ไดเลย ซงไมตองใชสญญาณนาฬกา แตวงจรจะมขนาด
ใหญมาก
ถาเราเขยน m x n หมายถง m คณ n หรอ m + … + m จ านวน n ตว เราเรยกวา m วาตวตงคณ (multiplicand)
และเรยก n วาตวคณ (multiplier) การออกแบบวงจรคณกใชหลกการเดยวกบท เราคณเลขในกระดาษทด
ตวอยาง เชน การคณเลขขนาด 4 บต 0101 x 1100 ท าไดดงน
จะเหนวาตองหาผลบวกรวมของทงสแถว (ตวตงคณทเลอนไปทางซาย) ถงจะไดผลคณ ในการน ตองใชวงจรบวก
ขนาด 4 บตจ านวน 3 ตว ลกศรหมายถง ใหเอาตวทด (ถาม) ไปใสตรง MSB ของวงจรบวกตวถดไป สงเกตวา
ผลลพธของการคณเลขขนาด 4 บตจะมขนาดไมเกน 8 บต รปท 8.15 แสดงการออกแบบวงจรคณดวยวธทกลาว
มาขางตน
เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 82
รปท 8.15 วงจรคณเชงผสม
เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 83
ในรปท 8.15 ถาจะขยายขนาดวงจรคณใหท าไดมากกวา 4 บต จะตองใชสายไฟและวงจรบวกมากขน นสตควร
มดสายไฟรวมกน (ใชค าสง breakout) และสรางมอดลส าหรบการบวกทมากกวา 4 บต หรออาจจะยบเกต and
หลายๆ ตวใหเปนมอดลเดยว พยายามวางสายไฟและมอดลใหเปนระเบยบ เพอใหงายตอการท าความเขาใจและ
ตรวจสอบหากมขอผดพลาดเกดขน
สงเกตวาวงจรทผมออกแบบมลกษณะทซ าซอนกน ท าใหใชวธ copy & paste ได ซงจะชวยลดเวลาทตองใชเมาส
ท างานลงไปไดมาก
เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 84
เอกสารประกอบ (ส าหรบอานเพมเตม)
ทจรงแลวมวงจรคณทดกวาตวอยางทท าใหดในบทนมาก เปนการคณโดยใชอลกอรทม Booth’s multiplication
ซงมความหนวง (delay) นอยและใชจ านวนเกตไมมาก
http://en.wikipedia.org/wiki/Booth's_multiplication_algorithm
บทท 3 Multiplication with Partially Redundant Multiples ในหนงสอ Michael J. Flynn, Stuart F.
Oberman, Advanced Computer Arithmetic Design, Wiley-Interscience, 2001.
แบบฝกหด
1. จงทดลองใชงานวงจรตวอยางในบทน บนโปรแกรม LogicWorks นกเรยนสามารถดาวนโหลดไฟลวงจร
ตวอยางไดจากเวบไซตของรายวชา
2. การค านวณแฟกทอเรยล (factorial) ของ n เมอ n > 0 อธบายดวยรหสเทยม (pseudocode) ดงน
Line 01: s = 1;
Line 02: while (n > 0) {
Line 03: s = s * n;
Line 04: n = n – 1;
Line 05: }
จงตอบค าถามตอไปนพรอมทงใหเหตผลประกอบ
2.1 วถขอมล (data path) ตอไปนสามารถค านวณแฟกทอเรยลไดหรอไม
2.2 ถา ALU ไมสามารถท าค าสง s * n ได ตองเอา s บวกกน n ครง (เปลยน Multiplier เปน Adder)
วถขอมลนจะยงค านวณแฟคทอเรยลไดหรอไม
3. จงแกไขวถขอมลในขอ 2 เพอใหค านวณ Line 03: s = s * n และ Line 04: n = n – 1 ไดพรอมๆ กน ให
จดวางมอดลตางๆ และสายไฟใหม แตหามเพมมอดลใหมลงไป (Hint: เลกใช MUX)
4. เรมท าโครงงานไดแลว ดรายละเอยดในบทท 14 โครงงานเครองคดเลข
รายการอางอง
[1] LogicWorks LogicWorks 5 Interactive Software, Prentice Hall, 2003.
[2] ช านาญ ปญญาใส, วชรากร หนทอง, ภาษา VHDL ส าหรบการออกแบบวงจรดจตอล, ซเอดยเคชน, 2547.