var38 (1083914), страница 2
Текст из файла (страница 2)
=~a&~b&c&(~d|d)|b&~c&d&(~a|a)|a&~b&c&(~d|d)|~b&~c&~d&(~a|a);
=~a&~b&c|b&~c&d|a&~b&c|~b&~c&~d;
=~b&c|b&~c&d|~b&~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 |
F1= ~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;
=~a&c&d&(~b|b)|~a&~c&~d&(~b|b)|a&~c&~d&(~b|b)|a&c&d&(~b|b);
=~a&c&d|~a&~c&~d|a&~c&~d|a&c&d;
= c&d|~c&~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 |
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;
=~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;
Программная часть:
Программа состоит из верхнего модуля HDL (он же основной код) и файла пользовательских ограничений
Код основного модуля используя комбинационную логику:
Top.v
`timescale 1ns / 1ps
module chast1(
input a,
input b,
input c,
input d,
input clk,
output reg [5:0] F
);
always @ (posedge clk)
begin
F [5] = a&b|a&~b&c|a&~b&~c&d;
F [4] = ~a&b&~c|b&c|a&~b&~c&~d;
F [3] = ~a&c|a&b&~c|~a&~b&~c&d|a&~b&~c&~d;
F [2] = ~b&c|b&~c&d|~b&~c&~d;
F [1] = c&d|~c&~d;
F [0] = d; end
endmodule
Для тестирования работы программы был написан файл тестирования:
`timescale 1ns / 1ps
module chast1_tb;
// Inputs
reg a=1'b0;
reg b=1'b0;
reg c=1'b0;
reg d=1'b0;
reg clk=1'b0;
// Outputs
wire [5:0] F;// = 0;
// Instantiate the Unit Under Test (UUT)
chast1 uut (
.a(a),
.b(b),
.c(c),
.d(d),
.clk(clk),
.F(F)
);
always #25 clk=~clk;
initial begin
// Initialize Inputs
#100
a=1'b0;
b=1'b0;
c=1'b0;
d=1'b1;
#100
a=1'b0;
b=1'b0;
c=1'b1;
d=1'b0;
#100
a=1'b0;
b=1'b0;
c=1'b1;
d=1'b1;
#100
a=1'b0;
b=1'b1;
c=1'b0;
d=1'b0;
#100
a=1'b0;
b=1'b1;
c=1'b0;
d=1'b1;
#100
a=1'b0;
b=1'b1;
c=1'b1;
d=1'b0;
#100
a=1'b0;
b=1'b1;
c=1'b1;
d=1'b1;
#100
a=1'b1;
b=1'b0;
c=1'b0;
d=1'b0;
#100
a=1'b1;
b=1'b0;
c=1'b0;
d=1'b1;
#100
a=1'b1;
b=1'b0;
c=1'b1;
d=1'b0;
#100
a=1'b1;
b=1'b0;
c=1'b1;
d=1'b1;
#100
a=1'b1;
b=1'b1;
c=1'b0;
d=1'b0;
#100
a=1'b1;
b=1'b1;
c=1'b0;
d=1'b1;
#100
a=1'b1;
b=1'b1;
c=1'b1;
d=1'b0;
#100
a=1'b1;
b=1'b1;
c=1'b1;
d=1'b1;
end
endmodule
Ниже представлен код файла пользовательских ограничений
raspinovka.ucf:
NET "clk" LOC = "L15";
NET "F[0]" LOC = "U18" ;
NET "F[1]" LOC = "M14" ;
NET "F[2]" LOC = "N14" ;
NET "F[3]" LOC = "L14" ;
NET "F[4]" LOC = "M13" ;
NET "F[5]" LOC = "D4" ;
NET "F[6]" LOC = "P16" ;
NET "F[7]" LOC = "N12";
NET "a" LOC = "P15";
NET "b" LOC = "C14";
NET "c" LOC = "D14";
NET "d" LOC = "A10";
RTL- схема
Technology Schematic:
Тестирование модуля top в isim:
Часть 2.
4.2.1. Используя возможности отладочной платы ALTYS в САПР ISE Webpack (версия 13.2, http://Xilinx.com,) cпроектировать, проверить на модели правильность функционирования и реализовать восьмиразрядное арифметико-логическое устройство с заданной системой команд (системы команд см. в вариантах заданий в Приложении 5.1.2).
I Поразрядные операции
11 - Операнд1–ИСКЛЮЧАЮЩЕЕ ИЛИ–(НЕ-Операнд 2)
II Логические операции
1 - Операнд1–логическое_И–Операнд2
III Битовые операции
1 - логический сдвиг Операнд1 влево на число разрядов, задаваемых Операнд2
IV Арифметические операции
1 - сложение
V Прочие операции
6 - репликация Операнд1
Теоретическая часть:
Для того что бы выполнить это задание надо написать 2 модуля – модуль ввода данных, и арифметическо-логическое устройство. Верхним уровнем программы выбран HDL. Был создан файл TOP.v, объединяющий модули ALU.v (модуль выполнения функций) и Decoder.v (модуль обработки поступающего сигнала).
В отличие от первой части, в данной задаче для закрепления функций в модуле декодера потребовалось дополнительное подключение кнопок BTND (выполняемая операция), BTNU (операнд 1), BTNL (операнд 2) , BTNC (сигнал включения ALU). Закрепление осуществляется оператором “case”, с помощью которого каждому сигналу присваивается соответствующее значение, задаваемое переключателями SW0,SW1, SW2, SW3 (4-х разрядный числа, присвоение поразрядно от младшего к старшему соответственно).
После расшифровки поступившего сигнала программа должна выполнить соответствующую функцию над операторами. В начале мы имеем 3 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
);
always @ (posedge clk)
begin
if (en == 1'b1)
begin
case (funk)
4'b0000: res = op_a ^ (~op_b);
4'b0001: res = op_a && op_b;
4'b0010: res = op_a << op_b;
4'b0011: res = op_a + op_b;
4'b0100: res = {2{op_a}}; default: res = 8'b00000000;
endcase
end
else
begin
res = 8'b00000000;
end
end
endmodule
// Код
top.ucf:
NET "clk" LOC = "L15";
NET "com_bat[0]" LOC = "N4";
NET "com_bat[1]" LOC = "P4";
NET "com_bat[2]" LOC = "P3";
NET "com_bat[3]" LOC = "F5";
NET "data_kn[0]" LOC = "A10";
NET "data_kn[1]" LOC = "D14";
NET "data_kn[2]" LOC = "C14";
NET "data_kn[3]" LOC = "P15";
NET "led[0]" LOC = "U18" ;
NET "led[1]" LOC = "M14" ;
NET "led[2]" LOC = "N14";
NET "led[3]" LOC = "L14" ;
NET "led[4]" LOC = "M13" ;
NET "led[5]" LOC = "D4" ;
NET "led[6]" LOC = "P16";
NET "led[7]" LOC = "N12";
Для тестирования работы ALU был написан файл тестирования:
// ALU.v
`timescale 1ns / 1ps
module test;
// Inputs
reg [3:0] data_kn;
reg [3:0] com_bat;
reg clk=1'b0;
// Outputs
wire [7:0] led;
// Instantiate the Unit Under Test (UUT)
top uut (
.data_kn(data_kn),
.com_bat(com_bat),
.clk(clk),
.led(led)
);
always #5 clk=~clk;
initial begin
#50
data_kn = 4'b1010; //число 1 ///
com_bat = 4'b0001; // запомнили число 1
#40
data_kn = 4'b0001; // число 2 ///
com_bat = 4'b0010; // запомнили число 2
#40
data_kn = 4'b0100; // код функции (в АЛУ)
com_bat = 4'b0100; // запомнили функцию
#40
com_bat = 4'b1000; // en = 1
#40
data_kn = 4'b0000; // код функции №1 (АЛУ)
com_bat = 4'b0100;
#40
data_kn = 4'b0001; // код функции №2 (АЛУ)
com_bat = 4'b0100;
#40
data_kn = 4'b0010; // код функции №3 (АЛУ)
com_bat = 4'b0100;
#40
data_kn = 4'b0011; // код функции №4 (АЛУ)
com_bat = 4'b0100;
#40
data_kn = 4'b0100; // код функции №5 (АЛУ)
com_bat = 4'b0100;
#40
data_kn = 4'b0010;
com_bat = 4'b0100;
end
endmodule
Таблицы истинности:















