РОЗРОБЛЕННЯ VHDL-МОДЕЛІ КОМП'ЮТЕРА

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Кафедра ЕОМ

Інформація про роботу

Рік:
2005
Тип роботи:
Курсовий проект
Предмет:
Теорія і проектування комп’ютерних систем та мереж
Група:
СКС

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти і науки України Національний університет “Львівська політехніка” Кафедра ЕОМ Курсовий проект З дисципліни “Теорія і проектування комп’ютерних систем та мереж” НА ТЕМУ : ”РОЗРОБЛЕННЯ VHDL-МОДЕЛІ КОМП'ЮТЕРА” Львів 2005 АНОТАЦІЯ В даній курсовій роботі розглядаються методи проектування мікропроцесора методом опису його архітектуримовою опису апаратних засобів HDL в редакторі AHDL фірми ALDEC. Тут використовується спрощена модель процесора. Але з погляду на навчання, цього цілком достатньо, тому що цю структуру легкомодифікувати (за рахунок використання лінгвістичних методів опису) і створити потрібну структуру, в залежності від метуи його застосування До того ж, розвиток лінгвістичних методів, дає можливість проектувати системи, влегкому для сприйняття людиною вигляді- програмному. Використання обєктно-орієнтованих моделей дозволяє писати досить таки потужні проекти. ЗМІСТ ЗАВДАННЯ НА КУРСОВИЙ ПРОЕКТ .............................................................................. 4 ВСТУП ..................................................................................................................................................... 5 Структура мікрокомп(ютера ................................................................. 6 Проектування інформаційного тракту .................................................. 7 2.1 Проектування блока АЛП .................................................................... 8 Проектування керуючого автомата ....................................................... 9 Симуляція роботи мікрокомп(ютера ...................................................... 12 Висновки ..................................................................................................... 13 ЛІТЕРАТУРА ........................................................................................................... 14 ДОДАТОК .................................................................................................................15 ЗАВДАННЯ НА ПРОЕКТУВАННЯ У розроблену VHDL-модель комп’ютера розробленого в методичних вказівках внести такі зміни : Зовнішня пам(ять команд об(ємом 128x8 Регістровий файл (RF) внести у внутрішню структуру Інформаційного тракту Додати блок FIFO 16х4 До системи команд мікропроцесора GNOME додати інструкцію : Resd_fifo acc<=fifo Вступ Мета курсового проекту полягає в опануванні методів проектування вузлів комп'ютерних систем на прикладі створення моделі однокристального комп'ютера з використанням мови апаратного опису VHDL, виконанні симуляції з наступним тестуванням роботи мікропроцесорної системи на функціональному рівні. Розроблюваний універсальний однокристальний мікрокомп'ютер є різновидом універсальних комп'ютерів. Він містить усі стандартні пристрої, необхідні для реалізації цифрової системи мінімальної конфігурації, а саме — процесор, пам'ять команд, пам'ять даних, внутрішній тактовий генератор. Основою мікрокомп'ютера, що проектується, є мікропроцесор Gnome — 4-розрядний гіпотетичний неконвеєрний RISC мікропроцесор, зі спрощеною системою команд та типів адресування. Основну увагу під час розробки мікропроцесора приділено проектуванню архітектури мікрокомп'ютера з використанням мови апаратного опису VHDL, оскільки при проектуванні НВІС (надвеликих інтегральних схем) з використанням рівнів архітектурного, логічного, топологічного проектування успіх розробки найбільшою мірою залежить від результатів попереднього, архітектурного рівня проектування. Вибраний спосіб побудови моделі пристрою за допомогою мови VHDL та інструментального засобу Active-VHDL фірми Aldec забезпечує можливість швидкої модифікації архітектури, є самоописовим, тобто він дозволяє швидко виявляти та усувати хиби проектування. Альтернативою опису моделі за допомогою мов апаратного опису є схемотехнічний синтез та синтез архітектури мікрокомп'ютера з використанням функцій алгебри логіки. Синтез архітектури мікрокомп'ютера з використанням функцій алгебри логіки вимагає від розробника опису схеми в термінах заданої множини логічних функцій. Такий підхід є ефективний при побудові пристроїв невеликої складності. Суто теоретично функціонування мікрокомп'ютера можна описати даним способом, але через велику складність він є неприйнятним. Метод схемотехнічного синтезу базується на синтезі з використанням як окремих логічних функцій, так і елементів, що побудовано на основі логічних функцій. Схемотехнічний дизайн є зручним і наочним для схем невеликої складності. Він дозволяє зручно втілювати евристичні схемотехнічні рішення. Проте цей метод є практично неприйнятним для схем великої складності (від 10 тисяч логічних елементів), оскільки складно формулюється, не дає змоги швидко модифікувати проект, вчасно виявляти та усувати хиби проектування. Незручність схемотехнічного проектування складних систем дала поштовх розробці низки мов проектування. Зокрема, на початку 80-х років Міністерство оборони США підтримало розробку мови VHDL (VHSIC hardware description language) в рамках програми VHSIC (very high-speed 1C). Цю ініціативу було підтримано Інститутом інженерів електриків та електронників (IEEE) з метою розробки стандарту мови — IEEE Standard 1076-1987. Згодом Міністерством Оборони США доповнило стандарт IEEE Standard 1076-1987 власним стандартом MIL-STD-454, який регламентував сам процес проектування НВІС із використанням мови VHDL. Інститутом IEEE запроваджено стандарт Std-1164 бібліотеки мови VHDL уведенням багаторівневої логіки, яка необхідна в моделюванні роботи інтегральної схеми, запроваджено стандарт Std-1029 регламентації способів верифікації та тестування проекту. В 1993 році запроваджено новий IEEE стандарт мови VHDL 1076-1993, що доповнив існуючий. Поширення набула абревіатура VHDL-87TaVHDL-93. Мова VHDL дозволяє охопити водночас декілька рівнів проектування — від архітектурного до логічного. Ця мова апаратного опису дає змогу описати пристрій як на поведінковому, так і на структурному рівнях та провести симуляцію. Тут синтез топології кристала виконують засобами автоматизованого синтезу на основі поведінкового та структурного описів пристрою. У складних проектах застосування мови VHDL та потужного засобу логічного синтезу дозволяє синтезувати пристрої, які за ефективністю перевищують аналогічні, з використанням схемотехнічного методу синтезу. Структура мікрокомп'ютера Базова структура мікрокомп'ютера містить мікропроцесор Gnome, бллок FIFO та блок зовнішньої пам'яті (рис. 1). Наведена структура мікрокомп'ютера не є функціонально завершеною, оскільки нема інформаційного зв'язку на вивід даних з комп'ютера. З погляду учбового функціонального проектування таке обмеження не є критичним. До того ж, запропоновану структуру мікропроцесора можна доповнити додатковими компонентами з метою розширення функціональних можливостей мікрокомп'ютера.  Рис.1. Структура мікрокомп'ютера Інформаційний тракт мікропроцесора Gnome Інформаційний тракт складається з таких компонентів: 1. Восьмирозрядний мультиплексор МІ Мультиплексор МІ формує фізичну адресу комірки пам'яті. Для пам'яті програм виділено адресний простір з фізичними адресами від 00h до 7fh 2. Програмно-доступні регістри PC, Z, С, АСС Семирозрядний регістр PC призначено для зберігання вмісту лічильника команд. Регістри Z та С є однорозрядними регістрами-тригерами, які зберігають поточне значення регістра ознаки нульового значення та регістра ознаки переносу. АСС - чотирирозрядний регістр, який виконує роль акумулятора. 3. Регістр інструкцій IR Призначено для зберігання коду прочитаної інструкції. Керуючі сигнали ld_ir та ld_ir_lsn дозволяють завантажувати в регістр IR як 8-розрядне слово інструкції (табл.2), так і 4-розрядне слово даних з Регістроого файлу. Таблиця 1 Ld_ir Ld_ir_lsn Дія  0 1 0 1 Збереження вмісту IR без змін  0 1 Завантаження в молодші розряди регістра інструкцій IR 4-розрядного слова з Регістрового файлу.  1 0 Завантаження в IR 8-розрядної інструкції з шини даних   4.Мультиплексор М2 Формує дані для АЛП, якщо керуючий сигнал rfifo=0 тоді в АЛП на вхід поступають 4 розрядні дані з шини даних IR, інакше 4 розрядні дані з черги. Арифметико-логічний пристрій АЛП є комбінаційним пристроєм, який виконує певні операції над вхідними операндами. Для випадку розглядуваного мікропроцесора Gnome першим вхідним операндом АЛП (рис.8) є поточна інформація з акумулятора сиr_асс, другим операндом є молодші 4 біти регістра команд сиr_іr, а також поточні значення ознак переносу curr_carry та нуля curr_zero. На виході блок АЛП залежно від коду операції alu_op формує результат: наступне значення акумулятора next_acc, отримане значення ознаки переносу next_carry, отримане значення ознаки нуля next_zero. Блок АЛП виконує невелику кількість операцій над 4-розрядними операндами (табл.4), що зумовлено простою системою команд мікропроцесора.  Рис. 3. Структурна схема АЛП Таблиця 3  Допоміжні елементи В інформаційному тракті мікропроцесора Gnome присутні повторювачі, інвертори та інші логічні елементи, які забезпечують формування керуючих сигналів та інформації на шині даних. Керуючий автомат Проектування керуючого автомата є складним та багатогранним етапом проектування, оскільки вимагає від розробника розуміння особливостей функціонування пристрою, вміння вибрати та ефективно спроектувати абстрактний автомат. Керуючий автомат — один з найважливіших блоків мікропроцесора. Спільно з генератором тактових імпульсів, який формує сигнал синхронізації clock, керуючий автомат забезпечує проходження подій в мікропроцесорі в правильній послідовності, тобто декодування інструкції та генерацію відповідних керуючих сигналів для реалізації елементарних операцій інформаційним трактом в циклах IF, ID, EX, встановлення в початковий стан вузлів мікропроцесора при надходженні сигналу встановлення в початковий стан reset. Множину керуючих сигналів складають сигнали read, write, ld_ir, ld_ir_lsn, inc_pc, jump_pc, alu_op, rdf, rfifo. Розглянемо детально, які значення керуючих сигналів формуються пристроєм керування на кожному циклі виконання інструкції. 1. Цикл вибирання інструкцій (Instruction Fetch cycle -IF) Завантаження з пам'яті інструкцій, інкремент значення лічильника команд PC на одиницю: read=l write=0 ld_ir=l ld_ir_lsn=0 inc_pc=l jump_pc=0 alu_op=000 (NOP) W_R=0 перехід до циклу ID 2. Цикл декодування інструкції/вибирання операнда з регістрового файлу (Instruction decode/register fetch cycle - ID) Для інструкцій LOAD_DIR, ADD_DIR, XOR_DIR, TEST_DIR, операндом яких є значення РЗП RO-R15, виконується читання та запис в молодші 4 розряди регістра IR значення з регістрового файлу: W_R=0 read=0 write=0 ld_ir=0 ld_ir_lsn=l inc_pc=l jump_pc=0 alu_op=000 (NOP) перехід до циклу ЕХ Для інструкції Load_Ram READ <= '1'; LD_IR <= '1'; Решта нулі перехід до циклу ЕХ Для решти інструкцій, які не вимагають завантаження усі керуючі сигнали присвоюються нулю перехід до циклу ЕХ З. Цикл виконання (Execute cycle - EX) У даному циклі керуючі сигнали залежать від інструкції, це зумовлено відмінністю в множині мікрооперацій, виконуваних інформаційним трактом, для конкретної інструкції. Інструкції виконуються формуванням сигналів alu_op, inc_pc, jump_pc, write, W_R, read, rdf, rfifo. . Розглянемо типові приклади формування керуючих сигналів для інструкції групи: • ADD_DIR (група арифметико-логічних операцій): alu_op=010 (ADD_OP) перехід до циклу IF • STORE_DIR (група операцій збереження результату): write=l перехід до циклу IF • JUMP (група операцій умовних та безумовних переходів): jump_pc=l перехід до циклу IF STORE_DIR(група операцій збереження результату): WRITE <= '1'; перехід до циклу IF Read_fifo (операція завантаження результату з черги): rdf <= '1'; rfifo <= '1'; alu_op <= pass_op; перехід до циклу IF  Симуляція роботи мікрокомп(ютера:   Висновки Виконання даного курсового проекту надало мені можливість вивчити методи проектування основних вузлів процесора на ПЛМ. Я вдосконалив свої знання і вміння працювати в системі VHDL самостійно проектувати вузли процесора, максимально використовуючи при цьому засоби AHDL-редактора ЛІТЕРАТУРА 1 .Методичні вказівки до циклу лабораторних робіт з курсу "Теорія і проектування комп'ютерних систем та мереж" для підготовки спеціалістів та магістрів на базі напрямку "Комп'ютерна інженерія" / Укл. Дунець Б.Р., Мельник А.О., Троценко В.В. - Львів: Видавництво ДУ "Львівська політехніка", 1999.-25с. Методичні вказівки до дипломного проектування для студентів спеціальності 22.01 "Обчислювальні машини, системи, комплекси та мережі". - Львів, ЛШ, 1993. Michael John Sebastian Smith Addison-Wesley Publishing Company VLSI Design Series 1,040 pages ISBN: 0-201-50022-1 June 1997 J.H. Henness, D.A.Patterson: Computer Architecture A Quantitative Approach, Morgan Kaufman Publishers, 1990 P.J. Ashenden: The VHDL Cookbook, First Edition, University of Adelaide, Australia, 1990 Інтернет сайт фірми Aldec Inc. http://www.aldec.com/ ДОДАТОК Gen_Defs ibrary IEEE; use IEEE.STD_LOGIC_1164.all; package Gen_Defs is -- Asynchronous level-sensetive memory type type memory is array (0 to 127) of std_logic_vector(7 downto 0); type REGFILE is array (0 to 15) of std_logic_vector(3 downto 0); -- MCU Instruction Set constant CLEAR_C : std_logic_vector(7 downto 0) := "00000000"; constant SET_C : std_logic_vector(7 downto 0) := "00000001"; constant SKIP_C : std_logic_vector(7 downto 0) := "00000010"; constant SKIP_Z : std_logic_vector(7 downto 0) := "00000011"; constant read_fifo: std_logic_vector(7 downto 0) := "00000111"; constant LOAD_IMM : std_logic_vector(3 downto 0) := "0001"; constant ADD_IMM : std_logic_vector(3 downto 0) := "0010"; constant STORE_DIR: std_logic_vector(3 downto 0) := "0011"; constant LOAD_DIR : std_logic_vector(3 downto 0) := "0100"; constant ADD_DIR : std_logic_vector(3 downto 0) := "0101"; constant XOR_DIR : std_logic_vector(3 downto 0) := "0110"; constant TEST_DIR : std_logic_vector(3 downto 0) := "0111"; constant JUMP : std_logic := '1'; -- ALU Operation Codes constant NOP_OP : std_logic_vector(2 downto 0) := "000"; -- translate A constant PASS_OP : std_logic_vector(2 downto 0) := "001"; -- translate B constant ADD_OP : std_logic_vector(2 downto 0) := "010"; -- OUT = A + B + Ci; form C constant XOR_OP : std_logic_vector(2 downto 0) := "011"; -- OUT = A ^ B constant AND_OP : std_logic_vector(2 downto 0) := "100"; -- OUT = A & B; form Z constant SET_CARRY_OP: std_logic_vector(2 downto 0) := "101"; -- C = 1 constant CLR_CARRY_OP: std_logic_vector(2 downto 0) := "110"; -- C = 0 end Gen_Defs; SysMemory library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.STD_LOGIC_ARITH.all; use IEEE.STD_LOGIC_UNSIGNED.all; use WORK.GEN_DEFS.all; entity SysMemory is port( ADDRESS: in std_logic_vector(6 downto 0); nCSB : in std_logic; nOEB : in std_logic; DATA : out std_logic_vector(7 downto 0) ); end SysMemory; architecture Behavior of SysMemory is begin Read_Write: process (ADDRESS, nCSB, nOEB) variable mem_array: Memory := (others => "00000000"); -- variable sel : std_logic_vector(1 downto 0); variable index : integer range 0 to 127; begin -- ROM program. --- counter status mem_array(5) := CLEAR_C; -- clear_c mem_array(6) := READ_FIFO ; -- READ_FIFO mem_array(7) := STORE_DIR & "0000"; -- store_dir r0 r0- counter mem_array(8) := read_fifo ; -- READ_FIFO mem_array(9) := STORE_DIR & "0001"; -- store_dir r1 r1- data register mem_array(10) := LOAD_DIR & "0000"; -- load_dir r0 -- Memory behavior description index := CONV_INTEGER(ADDRESS); if nCSB = '1' then DATA <= "ZZZZZZZZ"; else if nOEB = '0' then DATA <= mem_array(index); else DATA <= "ZZZZZZZZ"; end if; end if; end process; end Behavior; --------------------------------------------------------------------------------------------------- regfiles library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.STD_LOGIC_ARITH.all; use IEEE.STD_LOGIC_UNSIGNED.all; use WORK.GEN_DEFS.all; entity regfiles is port( ADDRESSR: in std_logic_vector(3 downto 0); clk : in std_logic; nWER : in std_logic; ACCR : in std_logic_vector(3 downto 0); DATAR : out std_logic_vector(3 downto 0) ); end regfiles; architecture Behavior of regfiles is begin Read_Write: process (clk) variable reg_array: REGFILE := (others => "0000"); variable index : integer range 0 to 15; begin if clk'Event and clk='1' then if nWER = '1' then reg_array(CONV_INTEGER(ADDRESSR)) := ACCR; -- memory write end if; end if; DATAR <= reg_array(index); end process; end Behavior; ALU library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.STD_LOGIC_ARITH.all; use IEEE.STD_LOGIC_UNSIGNED.all; use WORK.GEN_DEFS.all; entity ALU is port( CURR_ACC : in std_logic_vector(3 downto 0); CURR_IR : in std_logic_vector(3 downto 0); CURR_CARRY: in std_logic; CURR_ZERO : in std_logic; ALU_OP : in std_logic_vector(2 downto 0); NEXT_ACC : out std_logic_vector(3 downto 0); NEXT_CARRY: out std_logic; NEXT_ZERO : out std_logic ); end ALU; architecture Behavior of ALU is begin PerformOperation: process (CURR_ACC, CURR_IR, CURR_CARRY, CURR_ZERO, ALU_OP) variable sm: std_logic_vector(4 downto 0); begin case ALU_OP is when PASS_OP => NEXT_ACC <= CURR_IR; NEXT_CARRY <= CURR_CARRY; NEXT_ZERO <= CURR_ZERO; when ADD_OP => sm := ('0' & CURR_ACC) + ('0' & CURR_IR) + ("0000" & CURR_CARRY); NEXT_ACC <= sm(3 downto 0); NEXT_CARRY <= sm(4); if sm(3 downto 0) = "0000" then NEXT_ZERO <= '1'; else NEXT_ZERO <= '0'; end if; when XOR_OP => NEXT_ACC <= CURR_ACC xor CURR_IR; NEXT_CARRY <= CURR_CARRY; NEXT_ZERO <= CURR_ZERO; when AND_OP => NEXT_ACC <= CURR_ACC and CURR_IR; NEXT_CARRY <= CURR_CARRY; NEXT_ZERO <= not((CURR_ACC(3) and CURR_IR(3)) or (CURR_ACC(2) and CURR_IR(2)) or (CURR_ACC(1) and CURR_IR(1)) or (CURR_ACC(0) and CURR_IR(0))); when SET_CARRY_OP => NEXT_ACC <= CURR_ACC; NEXT_CARRY <= '1'; NEXT_ZERO <= CURR_ZERO; when CLR_CARRY_OP => NEXT_ACC <= CURR_ACC; NEXT_CARRY <= '0'; NEXT_ZERO <= CURR_ZERO; when others => NEXT_ACC <= CURR_ACC; NEXT_CARRY <= CURR_CARRY; NEXT_ZERO <= CURR_ZERO; end case; end process; end Behavior; Datapath library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.STD_LOGIC_ARITH.all; use IEEE.STD_LOGIC_UNSIGNED.all; entity Datapath is port( -- Control Unit Interface CLK : in std_logic; RESET : in std_logic; WRITE : in std_logic; READ : in std_logic; JUMP_PC : in std_logic; INC_PC : in std_logic; LD_IR : in std_logic; LD_IR_LSN : in std_logic; ALU_OP : in std_logic_vector(2 downto 0); IR_DATA : out std_logic_vector(7 downto 0); Z_ST : out std_logic; C_ST : out std_logic; -- External Memory Interface ADDRESS: out std_logic_vector(6 downto 0); DATA : in std_logic_vector(7 downto 0); nCSB : out std_logic; -- nWEB : out std_logic; nOEB : out std_logic; -- from fifo Qf : in std_logic_vector(3 downto 0); full : in std_logic; rdf : out std_logic; rfifo : in std_logic; rdfcu : in std_logic; fullcu : out std_logic ); end Datapath; architecture Behavior of Datapath is component ALU is port( CURR_ACC : in std_logic_vector(3 downto 0); CURR_IR : in std_logic_vector(3 downto 0); CURR_CARRY: in std_logic; CURR_ZERO : in std_logic; ALU_OP : in std_logic_vector(2 downto 0); NEXT_ACC : out std_logic_vector(3 downto 0); NEXT_CARRY: out std_logic; NEXT_ZERO : out std_logic ); end component ALU; component regfiles is port( ADDRESSR: in std_logic_vector(3 downto 0); clk : in std_logic; nWER : in std_logic; ACCR : in std_logic_vector(3 downto 0); DATAR : out std_logic_vector(3 downto 0) ); end component regfiles; signal IR, NEXT_IR : std_logic_vector(7 downto 0); -- Instruction Register signal ACC, NEXT_ACC: std_logic_vector(3 downto 0); -- ACCumulator signal Z, NEXT_Z : std_logic; -- Z flag signal C, NEXT_C : std_logic; -- C flag signal PC, NEXT_PC : std_logic_vector(6 downto 0); -- Program Counter signal ACCRNEXT, DATARNEXT, ADDRESSRNEXT : std_logic_vector(3 downto 0); signal IRMUX : std_logic_vector(3 downto 0); signal rdf_dp,full_dp : std_logic; begin -- Memory Control Signals nCSB <= '0'; nOEB <= not READ; -- Address Bus (Multiplexer M1) ADDRESS <= PC; -- Data to PC (Multiplexer M2 and SM) NEXT_PC <= IR(6 downto 0) when JUMP_PC = '1' else PC + 1 when INC_PC = '1' else PC; -- Data to IR NEXT_IR <= DATA when LD_IR = '1' else (IR(7 downto 4) & DATARNEXT) when LD_IR_LSN = '1' else IR; --REG ADDRES ADDRESSRNEXT <=IR(3 DOWNTO 0); -- FROM ALU IRMUX <= Qf when rfifo = '1' else IR(3 downto 0); -- State signals to Control Unit Z_ST <= Z; C_ST <= C; IR_DATA <= IR; -- Datapath registers implementation Registers: process (CLK, RESET) begin if RESET = '1' then -- asynchronous reset PC <= "0000000"; IR <= "00000000"; ACC <= "0000"; Z <= '0'; C <= '0'; elsif CLK'Event and CLK = '1' then PC <= NEXT_PC; IR <= NEXT_IR; ACC <= NEXT_ACC; Z <= NEXT_Z; C <= NEXT_C; end if; end process; rdf <= rdf_dp; rdf_dp <= rdfcu; fullcu <= full_dp; full_dp <= full; -- ALU connections U0: component ALU port map( CURR_ACC => ACC, CURR_IR => IRMUX, CURR_CARRY => C, CURR_ZERO => Z, ALU_OP => ALU_OP, NEXT_ACC => NEXT_ACC, NEXT_CARRY => NEXT_C, NEXT_ZERO => NEXT_Z ); U1: component regfiles port map( ADDRESSR => ADDRESSRNEXT, clk => CLK, nWER => WRITE, ACCR => NEXT_ACC, DATAR => DATARNEXT ); end Behavior; ------- ControlUnit library IEEE; use IEEE.STD_LOGIC_1164.all; use WORK.GEN_DEFS.all;ControlUnit entity ControlUnit is port( CLK : in std_logic; RESET : in std_logic; IR_DATA : in std_logic_vector(7 downto 0); Z_ST : in std_logic; C_ST : in std_logic; WRITE : out std_logic; READ : out std_logic; JUMP_PC : out std_logic; INC_PC : out std_logic; LD_IR : out std_logic; LD_IR_LSN : out std_logic; ALU_OP : out std_logic_vector(2 downto 0); -- fofo-- rdf : out std_logic; rfifo : out std_logic; full : in std_logic ); end ControlUnit; architecture Behavior of ControlUnit is type MachineStates is (I_F, I_D, E_X); signal STATE, NEXT_STATE: MachineStates; begin -- Control Unit is implemented as Mealy FSM StateRegister: process (CLK) begin if CLK'Event and CLK = '1' then if RESET = '1' then STATE <= I_F; else STATE <= NEXT_STATE; end if; end if; end process; Transition_and_Output_Function: process (CLK) begin READ <= '0'; WRITE <= '0'; JUMP_PC <= '0'; INC_PC <= '0'; LD_IR <= '0' LD_IR_LSN <= '0'; ALU_OP <= "000"; rfifo <= '0'; rdf <= '0'; case STATE is when I_F => READ <= '1'; INC_PC <= '1'; LD_IR <= '1'; NEXT_STATE <= I_D; when I_D => if IR_DATA(7 downto 4) = ADD_DIR or IR_DATA(7 downto 4) = XOR_DIR or IR_DATA(7 downto 4) = LOAD_DIR or IR_DATA(7 downto 4) = TEST_DIR then LD_IR_LSN <= '1'; end if; NEXT_STATE <= E_X; when E_X => if IR_DATA = CLEAR_C then ALU_OP <= CLR_CARRY_OP; end if; if IR_DATA = SET_C then ALU_OP <= SET_CARRY_OP; end if; if IR_DATA = SKIP_C then if C_ST = '1' then INC_PC <= '1'; end if; end if; if IR_DATA = SKIP_Z then ALU_OP <= PASS_OP; if Z_ST = '1' then INC_PC <= '1'; end if
Антиботан аватар за замовчуванням

08.02.2013 15:02-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!