Welcome, guest! Login / Register - Why register?
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
Your Name: Code Language: