Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АК_практика_метода.doc
Скачиваний:
3
Добавлен:
18.11.2019
Размер:
1.23 Mб
Скачать

Завдання до практичної роботи

Завдання: ознайомитися з теоретичними відомостями про опис регістрів, тригерів та лічильників на мові VHDL, скласти опис схеми з памяттю згідно свого варіанту.

Варіант

Розрядність

Розмір стеку

Початкова адреса

Кінцева адреса

1

5

15

10

60

2

6

13

30

55

3

7

11

15

50

4

8

9

10

60

5

9

16

30

55

6

10

14

15

50

7

11

12

10

60

8

12

10

15

55

9

5

18

30

50

10

6

20

10

55

11

7

15

10

70

12

8

13

30

75

13

9

11

15

70

14

10

9

10

70

15

11

16

30

75

16

12

14

15

70

17

5

12

10

70

18

6

10

15

75

19

7

18

30

70

20

8

20

10

75

21

9

15

10

50

22

10

13

30

55

23

11

11

15

50

24

12

9

10

50

25

5

16

30

55

Практична робота №7 Проектування конвеєрних оп на vhdl. Цифрові фільтри. Декодери. Інтегратори.

Мета: ознайомитися з особливостями проектування на мові VHDL конвеєрних ОП.

Теоретичні відомості.

У ряді випадків автоматна модель (опис) пристрої дозволяють отримати швидку і ефективну реалізацію послідовних пристроїв. Зазвичай обчислювальний пристрій (ОП) складається з трьох основних частин (рис. 7.1):

Рис. 7.1 Струткура ОП

Регістр поточного стану (Sequential Current State Register). Цей регістр являє собою набір тактовані D-тригерів синхронізуються одним синхросигналом і використовується для зберігання коду поточного стану автомата. Очевидно, що для автомата з n станами потрібно log 2 (n) тригерів.

Логіка переходів (Combinational Next State Logic). Як відомо, кінцевий автомат може перебувати в кожен конкретний момент часу тільки в одному стані. Кожен тактовий імпульс викликає перехід пристрою з одного стану в інший. Правила переходу і визначаються комбінаційної схемою, званої логікою переходів. Наступне стан визначається як функція поточного стану і вхідного впливу.

Логіка формування виходу (Combinational Output Logic). Вихід цифрового автомата зазвичай визначається як функція поточного стану та вихідної установки (у випадку автомата Мілі). Формування вихідного сигналу пристрою визначається за допомогою логіки формування виходу.

Для забезпечення стабільної і безвідмовної роботи використовується скидання прострою в початковий стан. Таким чином завжди забезпечується ініціалізація пристрою в заздалегідь предорпеделенном сотоянии при першому тактовом імпульсі. У разі, якщо скид не передбачений, неможливо передбачити з якого початкового стану почне функціонування, що може привести до збоїв в роботі всієї системи. Особливо ця ситуація актуальна при включенні живлення системи. Тому ми настійно рекоммендуем використовувати схеми скидання і початкової установки при проектуванні пристроїв на ПЛІС. Зазвичай застосовують асинхронні схеми скидання, через те, що не потрібно використовувати дешифратор невикористовуваних (надлишкових) станів, що спрощує логіку переходів.

З іншого боку, через те, що ПЛІС, виконані по архітектурі FPGA мають достатнє число регістрів (тригерів), використання автоматних моделей дозволяє отримати досить швидкодіючу і, в той же час наочну реалізацію при пріємлімих витратах ресурсів.

Приклад інтегратора на VHDL

library ieee;

use ieee.std_logic_1164. all;

entity mealy is

port (clock, reset: in std_logic;

data_out: out std_logic;

data_in: in std_logic_vector (1 downto 0));

end mealy;

architecture behave of mealy is

type state_values ​​is (st0, st1, st2, st3, st4);

signal pres_state, next_state: state_values;

begin

- FSM register

statereg: process (clock, reset)

begin

if (reset = '0 ') then

pres_state <= st0;

elsif (clock'event and clock = '1 ') then

pres_state <= next_state;

end i f;

end process statereg;

- FSM combinational block

fsm: process (pres_state, data_in)

begin

case pres_state is

when st0 =>

case data_in is

when "00" => next_state <= st0;

when "01" => next_state <= st4;

when "10" => next_state <= st1;

when "11" => next_state <= st2;

when others => next_state <= (others <= 'x');

end case;

when st1 =>

case data_in is

when "00" => next_state <= st0;

when "10" => next_state <= st2;

when others => next_state <= st1;

end case;

when st2 =>

case data_in is

when "00" => next_state <= st1;

when "01" => next_state <= st1;

when "10" => next_state <= st3;

when "11" => next_state <= st3;

when others => next_state <= (others <= 'x');

end case;

when st3 =>

case data_in is

when "01" => next_state <= st4;

when "11" => next_state <= st4;

when others => next_state <= st3;

end cas e;

when st4 =>

case data_in is

when "11" => next_state <= st4;

when others => next_state <= st0;

end cas e;

when others => next_state <= st0;

end cas e;

end process fsm;

outputs: process (pres_state, data_in)

begin

case pres_state is

when st0 =>

case data_in is

when "00" => data_out <= '0 ';

when others => data_out <= '1 ';

end cas e;

when st1 => data_out <= '0 ';

when st2 =>

case data_in is

when "00" => data_out <= '0 ';

when "01" => data_out <= '0 ';

when others => data_out <= '1 ';

end cas e;

when st3 => data_out <= '1 ';

when st4 =>

case data_in is

when "10" => data_out <= '1 ';

when "11" => data_out <= '1 ';

when others => data_out <= '0 ';

end cas e;

when others => data_out <= '0 ';

end cas e;

end process outputs;

end behave;

Приклад декодера переходів має вигляд.

library ieee;

use ieee.std_logic_1164. al l;

entity moore is

port (clock, reset: in std_logic;

data_out: out std_logic;

data_in: in std_logic_vector (1 downto 0));

end moore;

architecture behave of moore is

type state_values ​​is (st0, st1, st2, st3, st4);

signal pres_state, next_state: state_values;

begin

- FSM register

statereg: process (clock, reset)

begin

if (reset = '0 ') then

pres_state <= st0;

elsif (clock = '1 'and clock'event) then

pres_state <= next_state;

end i f;

end process statereg;

- FSM combinational block

fsm: process (pres_state, data_in)

begin

case pres_state is

when st0 =>

case data_in is

when "00" => next_state <= st0;

when "01" => next_state <= st4;

when "10" => next_state <= st1;

when "11" => next_state <= st2;

when others => next_state <= (others <= 'x');

end cas e;

when st1 =>

case data_in is

when "00" => next_state <= st0;

when "10" => next_state <= st2;

when others => next_state <= st1;

end cas e;

when st2 =>

case data_in is

when "00" => next_state <= st1;

when "01" => next_state <= st1;

when "10" => next_state <= st3;

when "11" => next_state <= st3;

when others => next_state <= (others <= 'x');

end cas e;

when st3 =>

case data_in is

when "01" => next_state <= st4;

when "11" => next_state <= st4;

when others => next_state <= st3;

end cas e;

when st4 =>

case data_in is

when "11" => next_state <= st4;

when others => next_state <= st0;

end cas e;

when others => next_state <= st0;

end cas e;

end process fsm;

outputs: process (pres_state)

begin

case pres_state is

when st0 => data_out <= '1 ';

when st1 => data_out <= '0 ';

when st2 => data_out <= '1 ';

when st3 => data_out <= '0 ';

when st4 => data_out <= '1 ';

when others => data_out <= '0 ';

end cas e;

end process outputs;

end behave;