var42_new (1083780), страница 2
Текст из файла (страница 2)
=a&b&d|~b&~c&~d|b&c&~d;
ab|cd | 00 | 01 | 11 | 10 |
00 | 1 | 0 | 0 | 0 |
01 | 0 | 1 | 1 | 1 |
11 | 0 | 1 | 1 | 1 |
10 | 1 | 0 | 0 | 0 |
F4=~a&~b&~c&~d|~a&~b&c&d|~a&b&~c&~d|~a&b&c&d|a&b&~c&~d|a&b&c&d|a&~b&~c&~d|a&~b&c&d;
F4=~a&~c&~d&(~b|b)|~b&c&d&(~a|a)|b&c&d&(~a|a)|a&~c&~d&(~b|b)|=
=~a&~c&~d|~b&c&d| b&c&d| a&~c&~d=~c&~d&(~a|a)|c&d(~b&b)=
=~c&~d|c&d;
ab|cd | 00 | 01 | 11 | 10 |
00 | 1 | 0 | 1 | 0 |
01 | 1 | 0 | 1 | 0 |
11 | 1 | 0 | 1 | 0 |
10 | 1 | 0 | 1 | 0 |
F3=~a&~b&~c&~d|~a&~b&c&~d|~a&b&~c&~d|~a&b&c&~d|a&b&~c&~d|a&b&c&~d|a&~b&~c&~d|a&~b&c&~d;
F3=~a&~b&~d&(~c|c)|~a&b&~d&(~c|c)|a&b&~d&(~c|c)|a&~b&~d&(~c|c)|=
=~a&~b&~d|~a&b&~d|a&b&~d|a&~b&~d=~a&~d|a&~d=~d
ab|cd | 00 | 01 | 11 | 10 |
00 | 1 | 0 | 0 | 1 |
01 | 1 | 0 | 0 | 1 |
11 | 1 | 0 | 0 | 1 |
10 | 1 | 0 | 0 | 1 |
F2=0;
ab|cd | 00 | 01 | 11 | 10 |
00 | 0 | 0 | 0 | 0 |
01 | 0 | 0 | 0 | 0 |
10 | 0 | 0 | 0 | 0 |
11 | 0 | 0 | 0 | 0 |
F1=0;
ab|cd | 00 | 01 | 11 | 10 |
00 | 0 | 0 | 0 | 0 |
01 | 0 | 0 | 0 | 0 |
11 | 0 | 0 | 0 | 0 |
10 | 0 | 0 | 0 | 0 |
F0=~a&~b&~c&d|~a&~b&c&d|~a&b&~c&d|~a&b&c&d|a&b&~c&d|a&b&c&d|a&~b&~c&d|a&~b&c&d;
F0=~a&~b&d|~a&b&d|a&b&d|a&~b&d|=~a&d|a&d=d;
ab|cd | 00 | 01 | 11 | 10 |
00 | 0 | 1 | 1 | 0 |
01 | 0 | 1 | 1 | 0 |
11 | 0 | 1 | 1 | 0 |
10 | 0 | 1 | 1 | 0 |
Программная часть:
Программа состоит из верхнего модуля HDL (он же основной код) и файла пользовательских ограничений
Код основного модуля используя комбинационную логику:
`timescale 1ns / 1ps
module chast1(
input a,
input b,
input c,
input d,
input clk,
output reg [7:0] F
);
always @ (posedge clk)
begin
F [7] = a&b|a&c&~d|a&~b&d;
F [6] = ~a&~b&d| b&~c&~d|~a&b&c|~a&~b&c&~d| a&~b&~c&~d;
F [5] = a&b&d|~b&~c&~d|b&c&~d;
F [4] =~c&~d|c&d;
F [3] = ~d;
F [2] = 0;
F [1] =0;
F [0] = d;
end
endmodule
Код основного модуля используя явные функции:
`timescale 1ns / 1ps
module chast1(
input a,
input b,
input c,
input d,
output reg [7:0] F
);
always @*
begin
F [7] = a*b+a*c*~d+a*~b*d;
F [6] = ~a*~b*d+ b*~c*~d+~a*b*c+~a*~b*c*~d+ a*~b*~c*~d;
F [5] = a*b*d+~b*~c*~d+b*c*~d;
F [4] =~c*~d+c*d;
F [3] = ~d;
F [2] = 0;
F [1] =0;
F [0] = d;
end
endmodule
Тестирование модуля top в isim:
RTL схема:
Technology schem:
Часть 2.
4.2.1. Используя возможности отладочной платы ALTYS в САПР ISE Webpack (версия 13.2, http://Xilinx.com,) cпроектировать, проверить на модели правильность функционирования и реализовать восьмиразрядное арифметико-логическое устройство с заданной системой команд (системы команд см. в вариантах заданий в Приложении 5.1.2).
I Поразрядные операции
6. (НЕ-Операнд1)-ИЛИ-Операнд2
II Логические операции
6 - Операнд1–логическое_И–Операнд2
III Битовые операции
6. установка в 1 разряда Операнд1, номер которого задаётся Операнд2
IV Арифметические операции
6. квадрат Операнд2 (используя операции сложения со сдвигом)
V Прочие операции
11. вывод большего операнда
Теоретическая часть:
Для того что бы выполнить это задание надо написать 2 модуля – модуль ввода данных, и арифметическо-логическое устройство. Верхним уровнем программы выбран HDL. Был создан файл TOP.v, объединяющий модули ALU.v (модуль выполнения функций) и Decoder.v (модуль обработки поступающего сигнала).
В отличие от первой части, в данной задаче для закрепления функций в модуле декодера потребовалось дополнительное подключение кнопок BTND (выполняемая операция), BTNU (операнд 1), BTNL (операнд 2) , BTNC (сигнал включения ALU). Закрепление осуществляется оператором “case”, с помощью которого каждому сигналу присваивается соответствующее значение, задаваемое переключателями SW0,SW1, SW2, SW3 (4-х разрядные числа, присвоение поразрядно от младшего к старшему соответственно).
После расшифровки поступившего сигнала программа должна выполнить соответствующую функцию над операторами. В начале мы имеем три 4-х разрядных значения: операнды 1 и 2 и номер функции fun, выполняемой над операндами. Для вывода значений был введён 8-ми разрядный сигнал RESULT. С помощью оператора “case’ зависимости от значения fun сигналу RESULT присваивается определённое значение.
Программная часть:
Программа состоит из верхнего модуля TOP.v, файла ALU.v, файла desifrator.v и файла пользовательских ограничений raspinovka.ucf
Код основного модуля TOP.v:
`timescale 1ns / 1ps
module top(
input [3:0] data_kn,
input [3:0] com_bat,
input clk,
output [7:0] led
);
wire [7:0] res_sig;
wire [3:0] a_sig, b_sig, fun_sig;
wire en_sig;
assign led = res_sig;
desifrator desifrator_INST0 (.data(data_kn),
.comanda(com_bat),
.clk(clk),
.a(a_sig),
.b(b_sig),
.fun(fun_sig),
.en(en_sig));
ALU ALU_INST0 (.op_a(a_sig),
.op_b(b_sig),
.funk(fun_sig),
.clk(clk),
.en(en_sig),
.res(res_sig));
Endmodule
Код desifrator.v:
`timescale 1ns / 1ps
module desifrator(
input [3:0] data,
input [3:0] comanda,
input clk,
output reg [3:0] a,
output reg [3:0] b,
output reg [3:0] fun,
output reg en
);
always @ (posedge clk)
case (comanda)
4'b0001: a = data;
4'b0010: b = data;
4'b0100: fun = data;
4'b1000: en = 1'b1;
default en = 1'b0;
endcase
endmodule
Код ALU.v:
`timescale 1ns / 1ps
module ALU(
input [3:0] op_a,
input [3:0] op_b,
input [3:0] funk,
input clk,
input en,
output reg [7:0] res
);
reg [3:0] ustanovka;
always @(posedge clk)
if (funk == 4'b0010)
begin
ustanovka = op_a;
case(op_b)
4'b0001 : ustanovka [0] = 1'b1;
4'b0010 : ustanovka [1] = 1'b1;
4'b0100 : ustanovka [2] = 1'b1;
4'b1000 : ustanovka [3] = 1'b1;
endcase
end
reg [7:0] kvadr;
always @(posedge clk)
begin
if (funk == 4'b0011)
begin
kvadr = (op_b[0]!=0)? op_b : 0;
kvadr = (op_b[1]!=0)? kvadr + (op_b << 2'b01) : kvadr;
kvadr = (op_b[2]!=0)? kvadr + (op_b << 2'b10) : kvadr;
kvadr = (op_b[3]!=0)? kvadr + (op_b << 2'b11) : kvadr;
end
end
reg [3:0] bigest;
always @(posedge clk)
if (funk == 4'b0100)
begin
if(op_a>op_b)
bigest <= op_a;
else
bigest <=op_b;
end