реклама на сайте
подробности

 
 
> M9K Altera не записывает некоторые данные, Cyclone 4 память через altsyncram
Golikov A.
сообщение Oct 9 2015, 15:36
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Всем привет!

Надо было сделать параметризуемую память, собираемую из банков М9К циклона. Сделали через altsyncram

CODE
altsyncram #(
.operation_mode ("BIDIR_DUAL_PORT"),
.width_a (DATA_WIDTH_A),
.width_byteena_a (DATA_WIDTH_A / BYTE_SIZE),
.width_b (DATA_WIDTH_B),
.widthad_a (ADDR_WIDTH_A),
.widthad_b (ADDR_WIDTH_B),
.numwords_a (2**ADDR_WIDTH_A),
.numwords_b (2**ADDR_WIDTH_B),
.outdata_reg_a ("UNREGISTERED"),
.outdata_reg_b ("UNREGISTERED"),
.ram_block_type ("M9K"),
.intended_device_family ("Cyclone IV E"),
.lpm_type ("altsyncram"),
.read_during_write_mode_mixed_ports ("DONT_CARE")
)
altsyncram_inst (
.address_a (addra),
.clock0 (clka),
.clocken0 (1'b1),
.data_a (dina),
.wren_a (wea),
.byteena_a (true_bea),
.q_a (douta) ,

.address_b (addrb),
.clock1 (clkb),
.clocken1 (1'b1),
.data_b (dinb),
.wren_b (true_web),
.q_b (doutb)
);


На тестах вот какая штука вылезла, если писать по порту А и читать по порту В все ОК, как это не делай.
Если писать по порту В удерживая врайт енайбл и каждый такт выдавая новые данные, а читать это по порту А, то же все хорошо.
Если писать по порту В, выдавая сигнал данные и адрес на 1 такт, а потом 2 такта пауза, то каждые вторые данные не записываются в память.
То есть в 0, 2, 4, 6, ... ячейки данные сохраняются а в 1, 3, 5, остаются старыми...

И в чем прикол я так и не понял... есть у кого какие мысли?

Повторили опыт с памятью генерированной мегавизордом, таже фигня,
Если до 1 клокового врайтенайбла за такт выставить данные и адрес, запись пройдет, и это только по порту В
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Golikov A.
сообщение Oct 12 2015, 06:46
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Да проблема на симуляции, сейчас в железе трудно достоверно проверить, но не думаю что альтеровская мегафункция сделанная через визард будет так себя вести в железе.

тестбенч вот такой


CODE
module Mem4KTest;

// Inputs
reg clka;
reg wea;
reg [3:0] bea;
reg [10:0] addra;
reg [31:0] dina;
reg clkb;
reg web;
reg [10:0] addrb;
reg [31:0] dinb;

// Outputs
wire [31:0] douta;
wire [31:0] doutb;

// Instantiate the Unit Under Test (UUT)
TestMem_4K
uut (
.clka(clka),
.wea(wea),
.bea(bea),
.addra(addra),
.dina(dina),
.douta(douta),
.clkb(clkb),
.web(web),
.addrb(addrb),
.dinb(dinb),
.doutb(doutb)
);

initial begin
// Initialize Inputs
clka = 0;
clkb = 0;

// Wait 100 ns for global reset to finish
#103;

// Add stimulus here
forever begin
clka = ~clka;
clkb = ~clkb;
#1;
#4;
end

end


integer i;
integer Correct;
integer InCorrect;

initial begin
// Initialize Inputs
wea = 0;
bea = 0;
addra = 0;
dina = 0;
web = 0;
addrb = 0;
dinb = 0;

// Wait 100 ns for global reset to finish
#100;

// Add stimulus here

bea = 4'b1111;

$display("Start write");

for(i = 0; i < 2048; i = i + 1)
begin
@(posedge clka)
begin
addra = i;
dina = i;
wea = 1;
end
@(posedge clka)
wea = 0;
@(posedge clka);
@(posedge clka);
end

@(posedge clka)
wea = 0;

$display("Start Read");


Correct = 0;
InCorrect = 0;

for(i = 0; i < 2049; i = i + 1)
begin
@(posedge clkb)
begin
if(i < 2048)
addrb = i;
#2;
if(i >= 1)
begin
if(doutb != (i-1))
begin
$display("Error %d: write %d - read %d", i , (i-1), doutb);
InCorrect = InCorrect + 1;
end
else
Correct = Correct + 1;
end
end
end



$display("Part 1, Correct %d - InCorrect %d", Correct, InCorrect);



$display("Start write");

for(i = 0; i < 2048; i = i + 1)
begin
@(posedge clkb)
begin
addrb = i;
dinb = 100*i;
@(posedge clkb)
//#2;
web = 1;
end
@(posedge clkb)
begin
//#2;
web = 0;
end
@(posedge clkb);
@(posedge clkb);
end

@(posedge clkb)
web = 0;

$display("Start Read");

Correct = 0;
InCorrect = 0;

for(i = 0; i < 2049; i = i + 1)
begin
@(posedge clka)
begin
if(i < 2048)
addra = i;
#2;
if(i >= 1)
begin
if(douta != 100*(i-1))
begin
$display("Error %d: write %d - read %d", i , 100*(i-1), douta);
InCorrect = InCorrect + 1;
end
else
Correct = Correct + 1;
end
end
end

$display("Part 2, Correct %d - InCorrect %d", Correct, InCorrect);

end


endmodule


в таком виде он работает


вот этот кусок

Код
for(i = 0; i < 2048; i = i + 1)
         begin
            @(posedge clkb)
               begin
                  addrb = i;
                  dinb = 100*i;
                  @(posedge clkb)                    -  если убрать этот такт задержки, пишутся только четные адреса, но только для порта B, для А работает и так и сяк
                  web = 1;
               end
            @(posedge clkb)
               begin
                  //#2;                                    - эта задержка не влияет
                  web = 0;
               end  
            @(posedge clkb);
            @(posedge clkb);                
         end
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Golikov A.   M9K Altera не записывает некоторые данные   Oct 9 2015, 15:36
- - DuHast   Метастабильность? Уверен, что если, для теста, буд...   Oct 9 2015, 19:08
- - Golikov A.   клок один (входа 2 подано одно и тоже), запись и ч...   Oct 9 2015, 19:37
|- - DuHast   Цитата(Golikov A. @ Oct 9 2015, 22:37) Ес...   Oct 11 2015, 13:13
- - Golikov A.   В общем и целом наблюдаем следующую вещь Берем 2 ...   Oct 12 2015, 12:07
- - warrior-2001   А что за симулятор? Сдается мне, что наблюдается а...   Oct 12 2015, 13:05
- - Golikov A.   Симулятор был квеста, пробовали что за зверь Модел...   Oct 12 2015, 20:31
- - warrior-2001   Если квеста - то принт в консоли вас спасет. В пер...   Oct 13 2015, 05:13
- - Golikov A.   принт в консоли ничего особенного не пишет. Модуль...   Oct 13 2015, 06:48
- - Golikov A.   --- upd нашел странный варнинг в консоли ЦитатаP...   Oct 13 2015, 07:59
- - Golikov A.   на что ругается понятно, Questa не осилила wand с...   Oct 13 2015, 09:00
- - warrior-2001   Цитата(Golikov A. @ Oct 13 2015, 09:48) п...   Oct 13 2015, 10:11
- - Golikov A.   прописал в настройках квартуса, в части симулятора...   Oct 13 2015, 10:37
- - warrior-2001   оба @(posedge clkb) - это один момент времени...   Oct 13 2015, 11:09
- - Golikov A.   почему один и тот же момент? @(posedge clkb) - зап...   Oct 13 2015, 11:32
- - warrior-2001   Хочется посмотреть весь ТБ. Не хочется по кускам к...   Oct 14 2015, 04:55
- - Golikov A.   да он в первом сообщении вроде как есть... web ...   Oct 14 2015, 08:09
- - Golikov A.   Во всем тестбенче блокирующие присвоения переписал...   Nov 3 2015, 08:58
- - XVR   Видимо потому что все присваивания и сэмплинг сигн...   Nov 3 2015, 11:06
- - Golikov A.   возможно... то есть видать я разошелся с моделью, ...   Nov 3 2015, 11:42


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 17:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01387 секунд с 7
ELECTRONIX ©2004-2016