Здравствуйте. Столкнулся с такой проблеммой: Написал на Verilog модуль SPI который загружает 16 регистров, и когда его выбирают (CS=0) выдает данные наружу. Но Quartus не хочет создавать символ для него. Вернее, в отчете пишет что создал,
Info: Running Quartus II Create Symbol File
Info: Version 9.1 Build 222 10/21/2009 SJ Full Version
Info: Processing started: Tue May 07 09:37:26 2013
Info: Command: quartus_map --read_settings_files=on --write_settings_files=off INDUC_10MHz -c INDUC_10MHz_GLV --generate_symbol=N:\Altera\INDUC_8MHz\SHIFT_TO_ARM.v
Info: Quartus II Create Symbol File was successful. 0 errors, 0 warnings
Info: Peak virtual memory: 158 megabytes
Info: Processing ended: Tue May 07 09:37:29 2013
Info: Elapsed time: 00:00:03
Info: Total CPU time (on all processors): 00:00:02
а в результате символ в папке проекта не появляется :(
Собственно сам файл:
/*
Выходной регистр для хранения м передачи данных в ARM. Начальные установки по сигналу START начала измерения (импульсный).
По WRITE заносим данные в сдвиговый регистр. Этим же сигналом сбрасывается NEXT, а после записи устанавливатся, сигнализируя о готовности принять след. слово.
По каждой записи в регистр увеличиваем счетчик слов WORD. А данные записываем в регистр определяемый состоянием WORD и Q (частота).
После записи 17 слов (16 слов данных об уровне сигнала (по 4 для каждой частоты) и 1 слово счетчик частоты входного сигнала по SDIN) выдаем сигнал READY для ARM.
По внешнему сигналу CS и нашему READY разрешаем сдиг всех регистров в SDATA.
*/
module UPR_ARM(CLK, CS, START, WRITE, DATA_IN, SDIN, Q, WORD, READY, NEXT, SDATA);
input CLK; //тактовые импульсы для сдига данных по SPI в SDATA
input CS; //chip select по нему разрешаем сдвиг
input START; //начало процесса, равносильно сбросу
input WRITE; //запсь данных, т.е. данные на DATA_IN готовы и по этому сигналу, записываем данные во внутренние регистры.
input [15:0]DATA_IN;
input SDIN; //вход сдвигового регистра. Забирает данные при передаче по SPI из регистра хранения измеренной частоты.
output [1:0]Q; //режим, а вообще это частота или цикл измерения. Нужно знать куда писать
output [1:0]WORD; //для внешнего мультиплексора, чтобы зна откуда брать данные
output SDATA;
output READY;
output NEXT;
wire SDATA;
reg [15:0] DATA [0:1] [0:1]; //16 регистров по 16 разрядов
reg [1:0]Q;
reg [1:0]WORD;
reg READY;
reg NEXT;
always@*
if (START == 1)
begin
WORD = 2'b0;
Q = 2'b0;
READY = 0;
end
assign SDATA= CS ? 1'bz : DATA[0][0][15]; //если CS не выбран (лог.1), то на выходе 3-е сост. Если выбран, то на выход старший регистр (старшими битами вперед)
always@(posedge WRITE)
if(CS) //загружаем в регистры когда CS=1(не передаем по SPI), по переднему фронту WRITE
begin
NEXT = 0;
DATA[WORD][Q] = DATA_IN; //сохраняем значение в регистре
WORD = WORD+1;
if(WORD == 2'b0)
begin
Q = Q + 1;
if (Q == 2'b0) READY = 1;
end
NEXT = 1;
end
always@(negedge CLK) //сдвигаем по заднему фронту, при CS=0
if(!CS)
begin //сдвиг всех регистров в ARM по заднему фронту. Наружу данные выводятся со старшего бита регистра DATA[0][0]
DATA[0][0][15:0] <= {DATA[0][0][14:0],DATA[1][0][15]};
DATA[1][0][15:0] <= {DATA[1][0][14:0],DATA[2][0][15]};
DATA[2][0][15:0] <= {DATA[2][0][14:0],DATA[3][0][15]};
DATA[3][0][15:0] <= {DATA[3][0][14:0],DATA[0][1][15]};
DATA[0][1][15:0] <= {DATA[0][1][14:0],DATA[1][1][15]};
DATA[1][1][15:0] <= {DATA[1][1][14:0],DATA[2][1][15]};
DATA[2][1][15:0] <= {DATA[2][1][14:0],DATA[3][1][15]};
DATA[3][1][15:0] <= {DATA[3][1][14:0],DATA[0][2][15]};
DATA[0][2][15:0] <= {DATA[0][0][14:0],DATA[1][2][15]};
DATA[1][2][15:0] <= {DATA[1][2][14:0],DATA[2][2][15]};
DATA[2][2][15:0] <= {DATA[2][2][14:0],DATA[3][2][15]};
DATA[3][2][15:0] <= {DATA[3][2][14:0],DATA[0][3][15]};
DATA[0][3][15:0] <= {DATA[0][3][14:0],DATA[1][3][15]};
DATA[1][3][15:0] <= {DATA[1][3][14:0],DATA[2][3][15]};
DATA[2][3][15:0] <= {DATA[2][3][14:0],DATA[3][3][15]};
DATA[3][3][15:0] <= {DATA[3][3][14:0],SDIN};
end
endmodule