На рис. 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