мануал (1083917), страница 2
Текст из файла (страница 2)
Программа состоит из верхнего модуля HDL (он же основной код) и файла пользовательских ограничений
Код основного модуля используя комбинационную логику:
`timescale 1ns / 1ps
module chast1(
input a,
input b,
input c,
input d,
input clk,
output reg [6:0] F
);
always @ (posedge clk)
begin
F [6] = a&b&~c&d|a&b&c;
F [5] = a&~b|a&b&~c&~d|~a&b&d|~a&b&c&~d;
F [4] = b&~c&~d|~b&~c&d|~b&c&d|~b&c&~d;
F [3] =~c&~d|c&d;
F [2] = ~d;
F [1] = 0;
F [0] = 0;
end
endmodule
Код основного модуля используя явные функции:
`timescale 1ns / 1ps
module chast1(
input a,
input b,
input c,
input d,
output reg [6:0] F
);
always @*
begin
F [6] = a*b*~c*d+a*b*c;
F [5] = a*~b+a*b*~c*~d+~a*b*d+~a*b*c*~d;
F [4] = b*~c*~d+~b*~c*d+~b*c*d+~b*c*~d;
F [3] = ~c*~d+c*d;
F [2] = ~d;
F [1] = 0;
F [0] = 0;
end
endmodule
Ресурсы ПЛИС затраченные на работу, RTL- и технологическая схема при использовании комбинационной логики:
Ресурсы ПЛИС затраченные на работу, RTL- и технологическая схема при использовании явных функций
Для тестирования работы программы был написан файл тестирования:
`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 [6: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
Снимок программы симуляции показан в приложении 1.
Из него видно, что программа выдает правильные ответы, в правильных положениях согласно таблице истинности.
Ниже представлен код файла пользовательских ограничений 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 "a" LOC = "P15";
NET "b" LOC = "C14";
NET "c" LOC = "D14";
NET "d" LOC = "A10";
Часть 2.
4.2.1. Используя возможности отладочной платы ALTYS в САПР ISE Webpack (версия 13.2, http://Xilinx.com,) cпроектировать, проверить на модели правильность функционирования и реализовать восьмиразрядное арифметико-логическое устройство с заданной системой команд (системы команд см. в вариантах заданий в Приложении 5.1.2).
I Поразрядные операции
10. (НЕ-Операнд1)–ИСКЛЮЧАЮЩЕЕ_ИЛИ – Операнд2
II Логические операции
2. (НЕ-Операнд1)–логическое_И–Операнд2
III Битовые операции
2. логический сдвиг Операнд1 вправо на число разрядов, задаваемых Операнд2
IV Арифметические операции
2. вычитание (из Операнда1 вычитается Операнд2)
V Прочие операции
7. репликация Операнд2
Теоретическая часть:
Для того что бы выполнить это задание надо написать 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 присваивается определённое значение. Для пунктов III и V потребовалось введение дополнительных блоков в коде ALU. Для установки в 1 разряда Операнд1, номер которого задаёт Операнд2 был введён сигнал zamena , которому изначально присвоено значение op_a. В зависимости от значения op_b с помощью оператора “case” соответствующему разряду присваивается значение «1».
Программная часть:
Программа состоит из верхнего модуля 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 = {op_b,op_b};
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 был написан файл тестирования:
`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 #25 clk=~clk;
initial begin
#50
data_kn = 4'b1010;
#55
com_bat = 4'b0001;
#60
data_kn = 4'b0000;
#65
com_bat = 4'b0010;
#70
data_kn = 4'b0010;
#75
com_bat = 4'b0100;
#80
com_bat = 4'b1000;
end
endmodule
Снимок программы симуляции показан в приложении 2.
Из него видно, что программа выдает правильные ответы, в правильных положениях согласно заданным функциям.
Таблицы истинности:
I Поразрядные операции
10. (НЕ-Операнд1)–ИСКЛЮЧАЮЩЕЕ_ИЛИ – Операнд2
| a | b | c |
| 0 | 0 | 1 |
| 0 | 0 | 1 |
| 0 | 0 | 1 |
| 0 | 0 | 1 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
II Логические операции
2. (НЕ-Операнд1)–логическое_И–Операнд2
| a | b | c |
| 0 | 0 | 0 |
| 0 | 0 | 0 |
| 0 | 0 | 0 |
| 0 | 0 | 0 |
| 1 | 1 | 0 |
| 1 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 0 |
III Битовые операции
2. логический сдвиг Операнд1 вправо на число разрядов, задаваемых Операнд2
| a | b | c |
| 0 | 0 | 0 |
| 0 | 0 | 0 |
| 0 | 0 | 0 |
| 0 | 0 | 0 |
| 1 | 0 | 0 |
| 1 | 0 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
IV Арифметические операции
2. вычитание (из Операнда1 вычитается Операнд2)
| b | b | c |
| 0 | 0 | 0 |
| 0 | 0 | 0 |
| 0 | 0 | 0 |
| 0 | 0 | 0 |
| 1 | 0 | 1 |
| 1 | 0 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
V Прочие операции
7. репликация Операнд2
| b | с |
| 0 | 0 |
| 0 | 1 |
| 0 | 0 |
| 0 | 1 |
| 0 | 0 |
| 1 | 1 |
| 0 | 0 |
| 1 | 1 |
Часть 3.















