Здравствуйте.
Есть приемопередатчик SPI (исходный код взят отсюда: https://www.eewiki.net/display/LOGIC/Serial...+Master+(VHDL)), переписывать его на Verilog я не стал, вроде бы в сочетании VHDL и Verilog в одном проекте ничего страшного нет. От внешнего устройства посредством приемопередатчика я получаю 8-битные пакеты открытых данных, потом формирую из них 64-битные пакеты открытых данных и передаю криптографическому блоку на шифрование. Между приемопередатчиком и криптографическим блоком "расположен" управляющий блок, предназначенный для задания настроек приемопередатчика, управления приемопередатчиком и формирования 64-битных пакетов данных. Код ниже (код с комментариями: http://paste.org/73758).
`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,
output reg enable_spi_1,
output reg cpol_spi_1,
output reg cpha_spi_1,
output reg count_spi_1,
output reg [31:0] clk_div_spi_1,
output reg [31:0] addr_spi_1,
output reg [7:0] tx_data_spi_1,
input busy_spi_1,
input [7:0] rx_data_spi_1
);
parameter count_64 = 57;
reg count;
always @ (rx_plain or busy_spi_1)
begin
cpol_spi_1 = 1;
cpha_spi_1 = 1;
count_spi_1 = 0;
clk_div_spi_1 = 32'b 1;
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)
begin
cpol_spi_1 = 1;
cpha_spi_1 = 1;
count_spi_1 = 0;
clk_div_spi_1 = 32'b 1;
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;
9'd 8 : block_0 [15:8] <= data_rd;
9'd 16 : block_0 [23:16] <= data_rd;
9'd 24 : block_0 [31:24] <= data_rd;
9'd 32 : block_0 [39:32] <= data_rd;
9'd 40 : block_0 [47:40] <= data_rd;
9'd 48 : block_0 [55:48] <= data_rd;
9'd 56 : block_0 [63:56] <= data_rd;
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];
9'd 8 : data_wr = block_0 [15:8];
9'd 16 : data_wr = block_0 [23:16];
9'd 24 : data_wr = block_0 [31:24];
9'd 32 : data_wr = block_0 [39:32];
9'd 40 : data_wr = block_0 [47:40];
9'd 48 : data_wr = block_0 [55:48];
9'd 56 : data_wr = block_0 [63:56];
default : data_wr = block_0 [7:0];
endcase
end
data_wr = 64'b 0;
count = 9'b 0;
end
endtask
endmodule
Суть проблемы в следующем: в процессе синтеза (ISE Design Suite 14.4) получаю следующие предупреждения:
WARNING:Xst:647 - Input <rx_plain> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <rx_data_spi_1> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <result_2> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
При этом структура проекта "разваливается". Организация процесса считывания данных через цикл также выдает ошибку, т.к. count не константа:
if ((busy_spi_1 == 0) && (result_1 == 1))
for (count = 0; count > 57; count = count + 8)
tx_plain [count + 7: count] = rx_data_spi_1;
else tx_plain = 64'b 0;
Это мой первый относительно большой проект на HDL-языках, до этого писал только на C/C++, поэтому некоторые конструкции могут быть C-подобными, за что прошу простить.