мануал (1083838), страница 3
Текст из файла (страница 3)
Теоретическая часть:
Для реализации данного задания требуется написать 2 модуля – модуль ввода данных и счётчик. Верхним уровнем программы выбран HDL. Был создан файл TOP.v, объединяющий модули shetchik.v (сам счётчик) и Decoder.v (модуль обработки поступающего сигнала).
Декодер взят фактически из второй части с учётом нового условия (перераспределение присваиваемых значений).
Т.к. вводимые данные составляют 4 бита, а выходные должны быть 8 битные, реализована система достраивания операндов. В которой они сравниваются и к тому который больше в конец дописываются 1111, а тому что меньше соответственно 0000.
Для того, чтобы процесс счёта был виден невооружённым глазом был введён делитель, замедляющий процесс, а сам результат выведен на диоды LED0 – LED7.
В моём случае делитель задан параметром num, что реализовано с помощью конструкции “always” и “if”. В данном блоке не находится сигналов, которым присваивается другое значение в другом блоке, поэтому программа не выдала конфликта.
Программная часть:
Программа состоит из верхнего модуля top.v, файла shetchik.v, файла Decoder.v и файла пользовательских ограничений raspinovka.ucf.
Код top.v:
`timescale 1ns / 1ps
module top(
input [3:0] data_in,
input [3:0] command_in,
input clk,
output [7:0] led
);
wire [7:0] q_sig;
wire [7:0] a_sig;
wire [7:0] b_sig;
wire en_sig;
assign led = q_sig;
decoder decoder_INST0 (.data(data_in),
.command(command_in),
.bol(a_sig),
.men(b_sig),
.clk(clk),
.en(en_sig));
schet schet_INST0 (.bol(a_sig),
.men(b_sig),
.clk(clk),
.en(en_sig),
.q(q_sig));
endmodule
Код Decoder.v:
`timescale 1ns / 1ps
module decoder(
input [3:0] data,
input [3:0] command,
input clk,
output reg [7:0] bol,
output reg [7:0] men,
output reg en
);
reg [3:0] a;
reg [3:0] b;
always @ (posedge clk)
begin
case (command)
4'b0001: a = data;
4'b0010: b = data;
4'b1000: en = 1'b1;
default : en = 1'b0;
endcase
bol <= {a >= b}?{a, 4'b1111}:{b, 4'b1111};
men <= {b >= a}?{a, 4'b0000}:{b, 4'b0000};
end
endmodule
Код shetchik.v:
`timescale 1ms / 1ns
module schet(
input clk,
input en,
input [7:0] bol,
input [7:0] men,
output reg [7:0] q
);
parameter num =23'b11111111111111111111111;
reg [22:0] count = 23'b00000000000000000000000;
reg clk_loc = 1'b0;
reg [7:0] v;
reg vp = 1'b0;
reg l;
reg [7:0] m = 0;
reg [7:0] s;
always @ (posedge clk)
begin
if (en == 1) l = 1'b1;
if (l == 1) count = count + 1;
if (count == num)
begin
clk_loc = !clk_loc;
count = 0;
end
end
always @(posedge clk_loc)
begin
if (vp != 1)
begin
vp = 1;
v = bol;
s = m;
end
if (v >= men)
begin
v = v - men;
s = s + 1;
end
if (v < men) q <= s;
end
endmodule
Файл распиновки:
NET "clk" LOC = "L15";
NET "command_in[0]" LOC = "N4";
NET "command_in[1]" LOC = "P4";
NET "command_in[2]" LOC = "P3";
NET "command_in[3]" LOC = "F5";
NET "data_in[3]" LOC = "P15";
NET "data_in[2]" LOC = "C14";
NET "data_in[1]" LOC = "D14";
NET "data_in[0]" LOC = "A10";
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" ;
Для тестирования работы счётчика был написан файл тестирования:
`timescale 1ns / 1ps
module top_tb;
// Inputs
reg [3:0] data_in;
reg [3:0] command_in;
reg clk;
// Outputs
wire [7:0] led;
// Instantiate the Unit Under Test (UUT)
top uut (
.data_in(data_in),
.command_in(command_in),
.clk(clk),
.led(led)
);
always #1 clk=!clk;
initial begin
// Initialize Inputs
data_in = 0;
command_in = 0;
clk = 0;
// Wait 100 ns for global reset to finish
#50;
data_in = 4'b0101;
command_in = 4'b0001;
#50
data_in = 4'b1010;
command_in = 4'b0010;
#50
command_in = 4'b1000;
#50
command_in = 4'b0100;
// Add stimulus here
end
endmodule
Снимок программы симуляции показан в приложении 3.
Из него видно, что программа выдает правильные значения.
Приложение 1.
Результат работы тестовой программы ISIM к первой части данной работы.
Приложение 2
Результат работы тестовой программы ISIM ко второй части данной работы.
Приложение 3.
Результат работы тестовой программы ISIM к третьей части данной работы.















