Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2 Семестр / Отчеты / 12 варик / От_ЛР8_изм_ЭиС_данные_удалены

.pdf
Скачиваний:
26
Добавлен:
07.06.2022
Размер:
974.92 Кб
Скачать

На рис. 4.1–4.2 представлен результаты моделирования в двух режимах.

В промежуток 0-2000нс промоделирована работа первого сигнала, 2200-

3800нс – второго, 4000-5000нс – третьего, 5400-6400нс – четвертого, 6800-

7600нс – пятого, 8000-8800нс – шестого, 9200-10400нс – седьмого, 10800-

12100 нс – восьмого и 12800-14000нс – девятого.

Рисунок 4.1 - Результат моделирования (Timing)

Рисунок 4.2 - Результат моделирования (Functional)

Результат совпадает с планом моделирования, представленным в таб.

4.1.

1.5Описание программы

Ниже приведён листинг кода программы.

library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity Lab8 is

port(

x:in std_logic_vector(5 downto 0); C_ext, C_int, R, nread: in std_logic; S_OP: in std_logic_vector(1 downto 0);

11

result, C_out: out std_logic );

end;

architecture synth of Lab8 is

signal in1: std_logic_vector(5 downto 0); signal tmpX: std_logic_vector(3 downto 0);

signal A, B, o1, o2: std_logic_vector(2 downto 0); type statetype is (S0,S1,S2,S3,S4,S5,S6,S7,S8,S9,S10); signal state: statetype;

signal A_OP:std_logic_vector(1 downto 0);

signal cnt_tmp, y, res_out : std_logic_vector(4 downto 0); begin

-- счётчик process(C_ext,R) begin

if R='1' then cnt_tmp <= (others => '0'); elsif rising_edge(C_ext) then

cnt_tmp <= (cnt_tmp + '1'); end if;

end process; --входы

process(C_ext,R) begin

if R='1' then in1 <= (others => '0'); elsif rising_edge(C_ext) then

in1 <= x; end if;

end process; -- задача

process(all) begin

case in1(3 downto 0) is

when "0000" => y <= "11001"; when "0001" => y <= "11011"; when "0010" => y <= "10010"; when "0011" => y <= "10011"; when "0100" => y <= "11101"; when "0101" => y <= "10101"; when "0110" => y <= "10110"; when "0111" => y <= "10111"; when "1000" => y <= "11010"; when "1001" => y <= "01001"; when "1010" => y <= "01010"; when "1011" => y <= "01011"; when "1100" => y <= "11110"; when "1101" => y <= "01101"; when "1110" => y <= "01110";

12

when "1111" => y <= "01111"; when others => y <= "XXXXX";

end case; end process;

-- операции

A <= in1(5 downto 3); B <= in1(2 downto 0); o1 <= A xor not(B); o2 <= A - B + '1';

-- код операции process(C_ext,R) begin

if R='1' then A_OP <= (others => '0'); elsif rising_edge(C_ext) then

A_OP <= S_OP; end if;

end process; process(all) begin

if A_OP = "00" then res_out <= cnt_tmp; elsif A_OP = "01" then res_out <= y;

elsif A_OP = "10" then res_out <= (o1 & '0' & '0'); else res_out <= (o2 & '0' & '0');

end if; end process;

process(C_int,nread) begin

if R = '1' then state <= S0; C_out <= '0';

result <= '0';

elsif rising_edge(C_int) then case(state) is

when S0 =>

result <= res_out(4); C_out <= '0';

if nread = '0' then C_out <= '1'; state <= S1;

end if; when S1 =>

C_out <= '0'; state <= S2; when S2 =>

result <= res_out(3); C_out <= '1';

state <= S3; when S3 =>

13

C_out <= '0'; state <= S4; when S4 =>

result <= res_out(2); C_out <= '1';

state <= S5; when S5 => C_out <= '0'; state <= S6; when S6 =>

result <= res_out(1);

if A_OP(1) = '1' then state <= S0; else

C_out <= '1'; state <= S7; end if;

when S7 => C_out <= '0'; state <= S8; when S8 =>

result <= res_out(0); C_out <= '1';

state <= S9; when S9 => C_out <= '0'; state <= S0; when others => state <= S0; end case;

end if; end process;

end;

В entity ... port описаны входы и выходы. Далее описаны все

необходимые сигналы.

Первый процесс - счетчик количества операций. Передний фронт C_ext.

Второй - хранения входа x. Передний фронт C_ext.

Третий - описание декодирования (задачи) с помощью case.

Далее идёт описание логической и арифметической операций.

Следующий за этим процесс - хранение кода операции.

14

Дальше - конечный автомат, описанный одним case, для вывода результата.

На рисунке 5.1 представлена схема из RTL Viewer для кода, написанном на VHDL.

 

 

 

 

 

state

 

 

 

 

 

S0

 

 

 

 

 

S1

 

A_OP[1..0]

 

S2

S_OP[1..0]

 

PRE

 

 

S3

 

D

Q

A_OP[1]

S4

C_ext

 

 

 

 

 

 

 

clk

S5

 

 

 

 

 

 

 

ENA

 

nread

 

 

 

 

 

 

S6

 

 

CLR

 

reset

S7

 

 

 

 

 

R

 

 

 

 

S8

 

 

 

 

 

S9

 

 

 

 

 

S10

 

 

in1[5..0]

 

 

x[5..0]

 

PRE

 

Add1

 

 

D

Q

 

 

 

 

 

A[3..0]

 

 

 

 

 

1' h1 --

+

 

 

 

 

B[3..0]

 

 

 

ENA

 

 

 

 

CLR

1' h1 --

 

 

 

 

 

 

ADDER

 

 

 

 

 

o1[0]

 

 

 

 

 

o1[1]

 

 

 

 

 

o1[2]

 

 

 

 

 

Equal2

 

 

 

A[1..0]

 

 

 

 

 

B[1..0]

=

 

 

 

 

2' h2 --

 

 

 

 

 

EQUAL

 

 

 

 

 

Mux3

 

 

 

 

 

SEL[2..0]

 

 

 

 

 

 

OUT

 

 

 

8' hAB --

DATA[7..0]

 

 

 

 

 

MUX

 

 

 

 

Mux2

 

 

 

 

 

SEL[3..0]

 

 

 

 

16' hDDCE --

 

OUT

 

 

 

DATA[15..0]

 

 

 

 

MUX

 

 

 

 

Mux1

 

 

 

 

 

SEL[3..0]

 

 

 

 

16' hFF13 --

 

OUT

 

 

 

DATA[15..0]

 

 

 

 

MUX

 

 

 

 

Mux0

 

 

 

 

 

SEL[2..0]

 

 

 

 

 

 

OUT

 

 

 

8' h1F --

DATA[7..0]

 

 

 

 

 

MUX

 

 

 

 

Equal1

 

 

 

A[1..0]

 

 

 

 

 

B[1..0]

=

 

 

 

 

2' h1 --

 

 

 

Add0

 

EQUAL

 

 

 

 

cnt_tmp[4..0]

 

A[4..0]

 

 

PRE

 

 

 

+

 

 

5' h01 --

B[4..0]

 

D

Q

 

 

 

 

 

 

ADDER

 

ENA

 

 

 

 

 

CLR

 

 

 

 

 

Equal0

 

 

 

A[1..0]

 

 

 

 

 

B[1..0]

=

 

 

 

 

2' h0 --

 

 

 

 

 

EQUAL

 

 

 

 

1

0

 

 

 

 

 

1

 

 

 

 

C_out

 

WideOr0

 

 

res_out~[2..0]

 

 

SEL

 

 

DATAA

 

 

OUT0

 

 

DATAB

 

 

MUX21

 

 

Selector1

 

WideOr1

 

 

 

SEL[4..0]

 

Add2

OUT

 

 

A[2..0]

 

2' h1 --

 

+

B[2..0]

DATA[4..0]

3' h1 --

 

 

ADDER

 

 

WideOr2

 

SELECTOR

nread C_int

 

 

 

Selector0

res_out~[7..3]

res_out[4..0]

SEL[5..0]

 

 

 

 

SEL

 

OUT

 

 

 

2' h0 --

 

SEL

 

DATAA

 

DATAA

 

 

 

OUT0

 

 

 

DATAB

 

 

 

 

DATA[5..0]

 

OUT0

 

 

DATAB

 

MUX21

 

 

 

 

SELECTOR

MUX21

 

 

C_out~reg0

 

 

PRE

 

 

 

D

Q

 

 

ENA

 

 

 

CLR

 

 

 

Рисунок 1.5 – Схема из RTL viewer

result~reg0

 

PRE

 

 

D

Q

result

ENA

 

 

CLR

 

 

 

 

C_out

1.6Моделирование кода

На рис. 6.1–6.2 представлен результаты моделирования в двух режимах.

В промежуток 0-2000нс промоделирована работа первого сигнала, 22003800нс – второго, 4000-5000нс – третьего, 5400-6400нс – четвертого, 68007600нс – пятого, 8000-8800нс – шестого, 9200-10400нс – седьмого, 1080012100 нс – восьмого и 12800-14000нс – девятого.

15

Рисунок 6.1 - Результат моделирования (Timing)

Рисунок 6.1 - Результат моделирования (Functional)

Результат моделирования совпадает со значениями из таблицы истинности, представленной в таблице 4.1.

16

ВЫВОДЫ

В ходе данной работы были освоены навыки совместного использования устройств средней степени интеграции.

Разработана обобщенная функциональная схема и описаны его основные части.

Были составлены таблицы истинности для операционного блока и план моделирования.

Была собрана на холсте .bdf и промоделирована в двух режимах (timing

иfunctional) схема вычислительного блока, выполняющего заданные операции

иосуществляющего приём входных данных и выдачу результата.

Спомощью VHDL было описано то же устройство.

Результаты моделирования каждой схемы соответствует её таблице

истинности.

17