Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)
Paste
Pasted as Verilog by Oleg_D ( 12 years ago )
`timescale 1ns / 1ps
module spi_1_control(
input [63:0] rx_plain, // Блок входных данных (открытые, после дешифрования)
output reg [63:0] tx_plain, // Блок выходных данных (открытые, для шифрования)
output reg enable_1, // Вход разрешения на передачу данных (закрытых)
input result_1, // Выход разрешения на прием данных (открытых)
////////////////////////////////////////////////////////////////////////////
// Input и Output для первого приемопередатчика SPI
///////////////////////////////////////////////////////////////////////////
output reg enable_spi_1, // Разрешение на работу, 1 - работа разрешена
output reg cpol_spi_1, // Полярность тактового сигнала (0 или 1)
output reg cpha_spi_1, // Фаза тактового сигнала (0 или 1)
output reg count_spi_1, // Непрерывный режим передачи больших массивов данных (0 - отключен)
output reg [31:0] clk_div_spi_1, // Установка скорости передачи (число тактов системного тактового сигнала на 0,5 периода sclk)
output reg [31:0] addr_spi_1, // Адрес целевого устройства
output reg [7:0] tx_data_spi_1, // Данные для передачи
input busy_spi_1, // Состояние приемопередатчика (0 - ожидание, 1 - выполнение транзакции)
input [7:0] rx_data_spi_1 // Считанные данные
);
parameter count_64 = 57; // Предельная величина счетчика для приемопередатчика блоков по 64 бита
reg count;
////////////////////////////////////////////////////////////////////////////
// Функционирование первого приемопередатчика SPI (прием-передача открытых данных)
///////////////////////////////////////////////////////////////////////////
// Передача блока зашифрованных данных
always @ (rx_plain or busy_spi_1) // Получен блок входных данных от КСп
begin
cpol_spi_1 = 1; // Полярность тактового сигнала (0 или 1)
cpha_spi_1 = 1; // Фаза тактового сигнала (0 или 1)
count_spi_1 = 0; // Непрерывный режим передачи больших массивов данных (0 - отключен)
clk_div_spi_1 = 32'b 1; // Установка скорости передачи (число тактов системного тактового сигнала на 0,5 периода sclk)
addr_spi_1 = 32'b 0; // Адрес целевого устройства
enable_spi_1 = 1;
if (busy_spi_1 == 0)
begin
task_transmit (tx_data_spi_1, rx_plain, count_64); // Передача расшифрованных данных enable_1 = 1;
end
else tx_data_spi_1 = 8'b 0;
end
always @ (rx_data_spi_1 or busy_spi_1 or result_1) // Получен блок входных данных от приемопередатчика SPI
begin
cpol_spi_1 = 1; // Полярность тактового сигнала (0 или 1)
cpha_spi_1 = 1; // Фаза тактового сигнала (0 или 1)
count_spi_1 = 0; // Непрерывный режим передачи больших массивов данных (0 - отключен)
clk_div_spi_1 = 32'b 1; // Установка скорости передачи (число тактов системного тактового сигнала на 0,5 периода sclk)
addr_spi_1 = 32'b 0; // Адрес целевого устройства
enable_spi_1 = 1;
if ((busy_spi_1 == 0) && (result_1 == 1))
begin
task_resive (rx_data_spi_1, tx_plain, count_64); // Прием данных для зашифрования
end
else tx_plain = 64'b 0;
end
task task_resive;
input [7:0] data_rd; // Считывемые данные
output reg [63:0] block_0; // Блок полученных данных
input [8:0] count_value; // Предельное значение счетчика
integer count; // Текущее значение счетчика
begin // Прием данных
@ (count_value or data_rd)
for (count = 0; count < count_value; count = count + 8)
begin
case (count)
9'd 0 : block_0 [7:0] <= data_rd; //0
9'd 8 : block_0 [15:8] <= data_rd; //1
9'd 16 : block_0 [23:16] <= data_rd; //2
9'd 24 : block_0 [31:24] <= data_rd; //3
9'd 32 : block_0 [39:32] <= data_rd; //4
9'd 40 : block_0 [47:40] <= data_rd; //5
9'd 48 : block_0 [55:48] <= data_rd; //6
9'd 56 : block_0 [63:56] <= data_rd; //7
default : block_0 <= 64'b 0;
endcase
end
block_0 <= 64'b 0;
count = 9'b 0;
end
endtask
task task_transmit;
output reg [7:0] data_wr; // Передаваемые данные
input [63:0] block_0; // Блок данных для передачи
input [8:0] count_value; // Пороговое значение счетчика
integer count; // Текущее значение счетчика
begin
@ (count_value or block_0)
for (count = 0; count < count_value; count = count + 8)
begin
case (count)
9'd 0 : data_wr = block_0 [7:0]; //0
9'd 8 : data_wr = block_0 [15:8]; //1
9'd 16 : data_wr = block_0 [23:16]; //2
9'd 24 : data_wr = block_0 [31:24]; //3
9'd 32 : data_wr = block_0 [39:32]; //4
9'd 40 : data_wr = block_0 [47:40]; //5
9'd 48 : data_wr = block_0 [55:48]; //6
9'd 56 : data_wr = block_0 [63:56]; //7
default : data_wr = block_0 [7:0];
endcase
end
data_wr = 64'b 0;
count = 9'b 0;
end
endtask
endmodule
Revise this Paste
Children: 73757