мануал (1083838), страница 2
Текст из файла (страница 2)
Программная часть:
Программа состоит из верхнего модуля 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&~b | a&b | ~a&~b&c&d;
F [6] = ~a&~b&~c | ~a&~b&~d | a&b;
F [5] = ~a&~b&~c | ~a&~b&~d | a&~b | ~a&b&c&d;
F [4] = ~a&~b&~c | ~a&~b&~d | ~a&~c&d | ~a&c&~d | a&c;
F [3] = ~a&c&~d | ~a&b&~d | a&~b&~c&~d | a&d;
F [2] = ~a&~b&d | ~a&~b&c | a&~b&d | a&~b&c | a&b&~c&~d;
F [1] = ~c&d | c&~d;
F [0] = d;
end
endmodule
Ресурсы ПЛИС затраченные на работу, 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 [7: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 "F[7]" LOC = "N12";
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 Поразрядные операции
7. Операнд1–ИЛИ–(НЕ-Операнд2)
II Логические операции
5. НЕ-((НЕ-Операнд1)–логическое_И–Операнд2)
III Битовые операции
4. арифметический сдвиг Операнд1 вправо на число разрядов, задаваемых Операнд2
IV Арифметические операции
5. квадрат Операнд1 (используя операции сложения со сдвигом)
V Прочие операции
9. инверсия Операнд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 и номер функции funk, выполняемой над операндами. Для вывода значений был введён 8-ми разрядный сигнал res. С помощью оператора “case’ зависимости от значения funk сигналу res присваивается определённое значение.
Программная часть:
Программа состоит из верхнего модуля TOP.v, файла ALU.v, файла desifrator.v и файла пользовательских ограничений raspinovka.ucf
Код основного модуля TOP.v:
`timescale 1ns / 1ps
module TOP(
input [3:0] data_rich,
input [3:0] com_kn,
input CLK,
output [7:0] diodi
);
wire [7:0] result;
wire [3:0] OPER1_sig, OPER2_sig, f_sig;
wire en_sig;
assign diodi = result;
Decoder Decoder_INST0 (
.DATA(data_rich),
.COM(com_kn),
.CLK(CLK),
.OPER_I(OPER1_sig),
.OPER_II(OPER2_sig),
.fun(f_sig),
.ALU_EN(en_sig)
);
ALU ALU_INST0 (
.OPER_1(OPER1_sig),
.OPER_2(OPER2_sig),
.FUN(f_sig),
.CLK(CLK),
.ALU_EN(en_sig),
.RESULT(result)
);
endmodule
Код desifrator.v:
`timescale 1ns / 1ps
module Decoder(
input [3:0] DATA,
input [3:0] COM,
input CLK,
output reg [3:0] OPER_I, OPER_II, fun,
output reg ALU_EN
);
always @(posedge CLK)
case (COM)
4'b0001 : OPER_I = DATA;
4'b0010 : OPER_II = DATA;
4'b0100 : fun = DATA;
4'b1000 : ALU_EN = 1'b1;
default ALU_EN = 1'b0;
endcase
endmodule
Код ALU.v:
`timescale 1ns / 1ps
module ALU(
input [3:0] OPER_1,
input [3:0] OPER_2,
input [3:0] FUN,
input ALU_EN,
input CLK,
output reg [7:0] RESULT
);
reg [7:0] kvadr;
always @(posedge CLK)
begin
if (FUN == 4'b0100)
begin
kvadr = (OPER_1[0]!=0)? OPER_1 : 0;
kvadr = (OPER_1[1]!=0)? kvadr + (OPER_1 << 2'b01) : kvadr;
kvadr = (OPER_1[2]!=0)? kvadr + (OPER_1 << 2'b10) : kvadr;
kvadr = (OPER_1[3]!=0)? kvadr + (OPER_1 << 2'b11) : kvadr;
end
end
always @(posedge CLK)
begin
if(ALU_EN == 1'b1)
begin
case(FUN)
4'b0000 : RESULT = (OPER_1 | (~OPER_2));
4'b0001 : RESULT = ~((~OPER_1) && OPER_2);
4'b0010 : RESULT = ( OPER_1 >>> OPER_2);
4'b0100 : RESULT = kvadr;
4'b1000 : RESULT = ~OPER_2;
endcase
end
else
begin
RESULT = 8'b00000000;
end
end
endmodule
Код top.ucf:
NET "CLK" LOC = "L15";
NET "com_kn[0]" LOC = "N4";
NET "com_kn[1]" LOC = "P4";
NET "com_kn[2]" LOC = "P3";
NET "com_kn[3]" LOC = "F5";
NET "data_rich[0]" LOC = "A10";
NET "data_rich[1]" LOC = "D14";
NET "data_rich[2]" LOC = "C14";
NET "data_rich[3]" LOC = "P15";
NET "diodi[0]" LOC = "U18";
NET "diodi[1]" LOC = "M14" ;
NET "diodi[2]" LOC = "N14" ;
NET "diodi[3]" LOC = "L14" ;
NET "diodi[4]" LOC = "M13" ;
NET "diodi[5]" LOC = "D4" ;
NET "diodi[6]" LOC = "P16" ;
NET "diodi[7]" LOC = "N12" ;
Для тестирования работы ALU был написан файл тестирования:
`timescale 1ns / 1ps
module test;
// Inputs
reg [3:0] OPER_1;
reg [3:0] OPER_2;
reg [3:0] FUN;
reg ALU_EN=1'b1;
reg CLK=1'b0;
// Outputs
wire [7:0] RESULT;
// Instantiate the Unit Under Test (UUT)
ALU uut (
.OPER_1(OPER_1),
.OPER_2(OPER_2),
.FUN(FUN),
.ALU_EN(ALU_EN),
.CLK(CLK),
.RESULT(RESULT)
);
always #5 CLK=!CLK;
initial begin
#50
OPER_1=4'b0101;
OPER_2=4'b1010;
FUN=4'b0000;
#50
FUN=4'b0001;
#50
FUN=4'b0010;
#50
FUN=4'b0100;
#50
FUN=4'b1000;
end
endmodule
Снимок программы симуляции показан в приложении 2.
Из него видно, что программа выдает правильные ответы, в правильных положениях согласно заданным функциям.
Таблицы истинности:
I Поразрядные операции
7. Операнд1–ИЛИ–(НЕ-Операнд2)
| a | b | c |
| 0 | 0 | 1 |
| 0 | 0 | 1 |
| 0 | 0 | 1 |
| 0 | 0 | 1 |
| 0 | 1 | 0 |
| 1 | 0 | 1 |
| 0 | 1 | 0 |
| 1 | 0 | 1 |
II Логические операции
5. НЕ-((НЕ-Операнд1)–логическое_И–Операнд2)
| a | b | c |
| 0 | 0 | 1 |
| 0 | 0 | 1 |
| 0 | 0 | 1 |
| 0 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 0 | 0 |
III Битовые операции
4. арифметический сдвиг Операнд1 вправо на число разрядов, задаваемых Операнд2
| a | b | c |
| 0 | 0 | 0 |
| 0 | 0 | 0 |
| 0 | 0 | 0 |
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
IV Арифметические операции
5. квадрат Операнд1 (используя операции сложения со сдвигом)
| b | b | c |
| 0 | 0 | 0 |
| 0 | 0 | 0 |
| 0 | 0 | 0 |
| 0 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 1 |
V Прочие операции
9. инверсия Операнд2
| b | с |
| 0 | 1 |
| 0 | 1 |
| 0 | 1 |
| 0 | 1 |
| 0 | 1 |
| 0 | 1 |
| 1 | 0 |
| 1 | 0 |
Часть 3.
4.3.1. Используя возможности отладочной платы ALTYS в САПР ISE Webpack (версия 13.2, http://Xilinx.com,) cпроектировать, проверить на модели правильность функционирования и реализовать схему управляемого восьмиразрядного двоичного счетчика (варианты работы счетчика см. в Приложении 5.1.3).
Варианты работы счетчика:
5. Целочисленное деление большего операнда на меньший и вывод частного..















