krend

Проблемы С Ramb18 Xilinx

11 сообщений в этой теме

krend    0

Добрый день. у меня есть недопонимание в работе ramb18. Не могу понять в чем проблема. Для того чтобы понять суть работы блока ОЗУ работаю только с одним портом (второй просто не подключаю).

Некоторые моменты для меня остаются загадкой -

1 Почему при записи данных в ОЗУ (WE_A = 2'b11) результат записи оказывается сразу на выходе?

2 При отключении записи в ОЗУ (WE_A = 2'b00) (на временной диаграмме заметно, что на выход перестали проходить данные с входа) пытаюсь вынуть из ячеек памяти введенные данные, подавая на вход (ADDRA) адреса ячеек памяти, куда я до этого сохранил данные. но на выходе ничего... Я так понимаю, что мне нужно как-то переключить ramb в режим чтения из памяти, подав определенный сигнал куда-то, но понять не могу как мне это сделать...

Прилагаю временную диаграмму, файл тестбенча и даташит на ramb18, непосредственно схему с ее атрибутами.


Файл тест бенча

/ Verilog test fixture created from schematic C:\23\project_28_09_priemnik\schem.sch - Wed Dec 31 23:30:50 2008
`timescale 1ns / 1ps
module schem_schem_sch_tb();
// Inputs
reg [13:0] addres_a;
reg enable_a;
reg clk;
reg [15:0] data_in;
reg[1:0] we_a;
reg [1:0] dip_a;
reg reg_a;
reg SSRA;
// Output
wire [1:0] dop_a;
wire [15:0] out_A;

// Instantiate the UUT
schem UUT (
.SSRA(SSRA),
.reg_a(reg_a),
.dop_a(dop_a),
.dip_a(dip_a),
.addres_a(addres_a),
.out_A(out_A),
.enable_a(enable_a),
.clk(clk),
.data_in(data_in),
.we_a(we_a)
);
// Initialize Inputs

 initial begin
addres_a = 14'b00000000000000; // 14-ти разрядная шина адреса порта А
enable_a =1;	 // вход сигнала разрешения первого порта
clk = 0;		 // тактовый сигнал
data_in=16'h000f;	 // входные 16-ти разрядные шины данных
we_a=2'b11;		 // 2 разрядный вход, объединяющий сигналы разрешения записи соответствующего байта данных в первый порт
dip_a=2'b00;	 // 2 разрядная входная шина, применяемая для осуществления контроля четности информационных данных первого порта
reg_a=1;		 // вход сигнала разрешения синхронизации выходного регистра первого порта
SSRA=0;		 // вход сигнала синхронного сброса/установки первого порта
end

always begin
#5 clk=!clk;
end

/*
начальные установки такие ставим RAMB18 на запись (we_a=2'b11 - запись идет в два байта, хотя мои данные можно записывать и в один байт)
в первую ячейку памяти (addres_a = 14'b00000000000000) подаем данные (data_in=16'h000f). Вход сигнала разрешения должен быть всегда включен, так как иначе ничего
записывается (enable_a =1). сигнала синхронного сброса/установки ставим в ноль (SSRA=0) обойдемся пока без него.

*/

initial begin

#100
addres_a=14'b00000000000001;
data_in=16'h00ff;
//# 30 dip_a=2'b11;


#100 addres_a=14'b00000000000011;
data_in=16'h00f0;

// we_a = 0 запись не идет
// c этого момента хочу вытянуть значения из ячеек памяти, но ничего не выходит.
#100
we_a=0;
data_in=16'h0af;
addres_a = 14'b00000000000001;

# 200 addres_a = 14'b00000000000000;
data_in=16'h0005;

#200 addres_a = 14'b00000000000010;
end
endmodule

post-169113-0-37035900-1443692276_thumb.jpg

post-169113-0-64941800-1443692293_thumb.jpg

ramb18_2.pdf

Изменено пользователем krend

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Vascom    646

Покажи содержимое модуля schem.

И в даташиту написано, что wea не используется в режиме SDP.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
krend    0

содержимое модуля schem

Дело в том, что я использую режим TDP (true dual port), а не SDP(simple dual port). как я понял, в режиме SDP используется две шины данных для передачи одного значения на выход.

также нашел вот такой вот мануал (прикреплен к сообщению). вроде со своей стороны ошибки не заметил. При we = 0 и при подаче на вход адреса на выход должно подаваться данные по указанному адресу.

////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 1995-2013 Xilinx, Inc. All rights reserved.
////////////////////////////////////////////////////////////////////////////////
// ____ ____
// / /\/ /
// /___/ \ / Vendor: Xilinx
// \ \ \/	 Version : 14.6
// \ \		 Application : sch2hdl
// / /		 Filename : schem.vf
// /___/ /\	 Timestamp : 10/01/2015 14:54:59
// \ \ / \
// \___\/\___\
//
//Command: C:\Xilinx\14.6\ISE_DS\ISE\bin\nt\unwrapped\sch2hdl.exe -sympath C:/23/project_28_09_priemnik/ipcore_dir -intstyle ise -family virtex5 -verilog schem.vf -w C:/23/project_28_09_priemnik/schem.sch
//Design Name: schem
//Device: virtex5
//Purpose:
// This verilog netlist is translated from an ECS schematic.It can be
// synthesized and simulated, but it should not be modified.
//
`timescale 1ns / 1ps
module schem(addres_a,
		 clk,
		 data_in,
		 dip_a,
		 enable_a,
		 reg_a,
		 SSRA,
		 we_a,
		 dop_a,
		 out_A);
input [13:0] addres_a;
input clk;
input [15:0] data_in;
input [1:0] dip_a;
input enable_a;
input reg_a;
input SSRA;
input [1:0] we_a;
output [1:0] dop_a;
output [15:0] out_A;


RAMB18 #(

	 .INITP_00(256'h0000000000000000000000000000000000000000000000000000000000000000),

	 .INITP_01(256'h0000000000000000000000000000000000000000000000000000000000000000),
	 .DOA_REG(0), .WRITE_MODE_A("READ_FIRST"),

	 .INITP_02(256'h0000000000000000000000000000000000000000000000000000000000000000),
	 .INIT_A(18'h00000), .READ_WIDTH_A(9), .SRVAL_A(18'h00000),

	 .INITP_03(256'h0000000000000000000000000000000000000000000000000000000000000000),
	 .WRITE_WIDTH_A(9), .DOB_REG(0),


	 .INIT_00(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_01(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_02(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_03(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_04(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_05(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_06(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_07(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_08(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_09(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_0A(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_0B(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_0C(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_0D(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_0E(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_0F(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_10(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_11(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_12(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_13(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_14(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_15(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_16(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_17(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_18(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_19(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_1A(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_1B(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_1C(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_1D(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_1E(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_1F(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_20(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_21(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_22(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_23(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_24(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_25(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_26(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_27(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_28(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_29(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_2A(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_2B(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_2C(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_2D(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_2E(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_2F(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_30(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_31(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_32(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_33(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_34(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_35(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_36(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_37(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_38(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_39(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_3A(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_3B(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_3C(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_3D(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_3E(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INIT_3F(256'h0000000000000000000000000000000000000000000000000000000000000000),
	 .INIT_B(18'h00000),


	 .INITP_04(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INITP_05(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INITP_06(256'h0000000000000000000000000000000000000000000000000000000000000000),



	 .INITP_07(256'h0000000000000000000000000000000000000000000000000000000000000000),
	 .INIT_FILE("NONE"), .READ_WIDTH_B(0), .SIM_COLLISION_CHECK("ALL"),
	 .SRVAL_B(18'h00000), .WRITE_MODE_B("WRITE_FIRST"), .WRITE_WIDTH_B(0) )
	 XLXI_1 (.ADDRA(addres_a[13:0]),
			 .ADDRB(),
			 .CLKA(clk),
			 .CLKB(),
			 .DIA(data_in[15:0]),
			 .DIB(),
			 .DIPA(dip_a[1:0]),
			 .DIPB(),
			 .ENA(enable_a),
			 .ENB(),
			 .REGCEA(reg_a),
			 .REGCEB(),
			 .SSRA(SSRA),
			 .SSRB(),
			 .WEA(we_a[1:0]),
			 .WEB(),
			 .DOA(out_A[15:0]),
			 .DOB(),
			 .DOPA(dop_a[1:0]),
			 .DOPB());
endmodule

ug190_1.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Vascom    646

Если память двухпортовая, то адрес для записи и адрес для чтения подаются по разным шинам. В этом весь смысл двухпортовости.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
UTSource

Найдите миллионы труднодоступных

электронных компонентов

krend    0

я думал, что смысл двухпортовости в том, что я могу параллельно в одну память по двум разным шинам данных (и шинам адреса) либо вынимать данные из ОЗУ, либо записывать их в ОЗУ. при этом у меня есть возможность ставить приоритет для каждой отдельной шины - WRITE_MODE_A("READ_FIRST"), WRITE_MODE_B("WRITE_FIRST"). При вашем описании блока рам данные свойства теряют смысл.

Переделал на скорую руку схему, как вы сказали результат прежний...

// Verilog test fixture created from schematic C:\23\project_28_09_priemnik\schem.sch - Wed Dec 31 23:30:50 2008
`timescale 1ns / 1ps
module schem_schem_sch_tb();
// Inputs
  reg [13:0] addres_a;
  reg enable_a;
  reg clk;
reg [15:0] data_in;
reg[1:0] we_a;
reg [1:0] dip_a;
reg reg_a;
reg SSRA;
reg [13:0] adr_B;
reg [1:0] we_B;
// Output
wire [1:0] dop_a;
  wire [15:0] out_A;
wire [15:0] out_B;
// Instantiate the UUT
  schem UUT (
.SSRA(SSRA),
.reg_a(reg_a),
.dop_a(dop_a),
.dip_a(dip_a),
 .addres_a(addres_a),
 .out_A(out_A),
 .enable_a(enable_a),
 .clk(clk),
 .data_in(data_in),
 .we_a(we_a),
 .adr_B(adr_,
 .out_B(out_,
 .we_B(we_
  );
// Initialize Inputs

   initial begin
 addres_a = 14'b00000000000000;  // 14-ти разрядная шина адреса порта А
 enable_a =1;	    // вход сигнала разрешения первого порта
 clk = 0;		 // тактовый сигнал
 data_in=16'h000f;	  // входные 16-ти разрядные шины данных
 we_a=2'b11;		  // 2 разрядный вход, объединяющий сигналы разрешения записи соответствующего байта данных в первый порт
 dip_a=2'b00;	    // 2 разрядная входная шина, применяемая для осуществления контроля четности информационных данных первого порта
 reg_a=0;		 // вход сигнала разрешения синхронизации выходного регистра первого порта
 SSRA=0;		  // вход сигнала синхронного сброса/установки первого порта
 adr_B= 14'b00000000000000;
 we_B=2'b00;
 end

always begin
#5 clk=!clk;
end

/*
начальные установки такие ставим RAMB18  на запись (we_a=2'b11 - запись идет в два байта, хотя мои данные можно записывать и в один байт)
в первую ячейку памяти (addres_a = 14'b00000000000000) подаем данные (data_in=16'h000f). Вход сигнала разрешения должен быть всегда включен, так как иначе ничего
записывается (enable_a =1).  сигнала синхронного сброса/установки ставим в ноль (SSRA=0) обойдемся пока без него.

*/

initial begin

#100
addres_a=14'b00000000000001;
data_in=16'h00ff;
//# 30 dip_a=2'b11;


#100 addres_a=14'b00000000000011;
data_in=16'h00f0;

// we_a = 0  запись не идет
// c этого момента хочу вытянуть значения из ячеек памяти, но ничего не выходит.
#100
we_a=0; 
data_in=16'h0af;
addres_a = 14'b00000000000001;

# 200
adr_B = 14'b00000000000001;
addres_a=14'b00000000000011;
data_in=16'h0005;

#200
adr_B = 14'b00000000000011;
addres_a=14'b00000000000001;
end
endmodule

post-169113-0-48792500-1443704821_thumb.jpg

post-169113-0-02012000-1443704830_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Vascom    646

Попробуй сделать модуль не из схемы, а мастером создания блочной памяти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Vascom    646

И ещё раз. Тебе нужна single port ram или всё же dual port ram?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
krend    0

в ip core все получилось, как нужно. Но нужно довести дело до конца с ramb18...

нужна single port ram.

// Verilog test fixture created from schematic C:\23\project_28_09_priemnik\bram_ip_core.sch - Fri Oct 02 10:49:27 2015
`timescale 1ns / 1ps
module bram_ip_core_bram_ip_core_sch_tb();
// Inputs
reg [3:0] addr;
reg wea;
reg clk;
reg en_a;
reg [15:0] din;
// Output
wire [15:0] out_A;

// Instantiate the UUT
bram_ip_core UUT (.addr(addr),
.din(din),
.en_a(en_a),
.wea(wea),
.clk(clk),
.out_A(out_A)
);
// Initialize Inputs
 initial begin
en_a=1;
wea=1;
clk=0;
din=16'h000f;
addr=4'b0001;

end


always
#5 clk=!clk;


initial begin
# 100
wea=0;
din=16'h00ff;
addr=4'b0001;

end


endmodule

post-169113-0-88588200-1443774145_thumb.jpg

post-169113-0-59337000-1443774151_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Vascom    646

Раз получилось, то так и используй. Он же тебе сгенерил файлы все.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас