de memoria pequeña está tomando el 47% de un chip Xilinx 1.8MillionGates!

O

omara007

Guest
Hi folks

Estoy tratando de mapa de mi memoria codificada en VHDL Xilinx distribuido RAM ..Estoy usando Xilinx Spartan-3A chip DSP (XC3SD1800A-4fg676) y Xilinx ISE 11.3.

Estoy enfrentando 2 problema:
1.Síntesis XST se está utilizando mucho tiempo ..aproximadamente 5,5 horas.
2.La utilización de chips de memoria de sólo el 47% es de 1,8 millones de chip equivalente puerta.

La memoria RAM se destina a tener 8 sincrónica escribir puertos y 8 puertos de lectura asincrónica.

El código se muestra aquí:
Código:IEEE biblioteca;

ieee.std_logic_1164.all uso;

ieee.numeric_std.all uso;- Declaración de la entidad ---------------------------------------------- ----------

rregfile_dp entidad es

puerto (

CLK: in std_logic;

rst_n: in std_logic;

- Escribir Puerto -------------------------------------

- Port-0

wr_en0: in std_logic; - Escriba Habilitar

addrs0_wr: en el signo (rg_addrs_width-1 downto 0); - Escriba las direcciones

data0_wr: en la firma (rg_data_width-1 downto 0); - Escribir datos

- Port-1

wr_en1: in std_logic; - Escriba Habilitar

addrs1_wr: en el signo (rg_addrs_width-1 downto 0); - Escriba las direcciones

data1_wr: en la firma (rg_data_width-1 downto 0); - Escribir datos

- Port-2

wr_en2: in std_logic; - Escriba Habilitar

addrs2_wr: en el signo (rg_addrs_width-1 downto 0); - Escriba las direcciones

data2_wr: en la firma (rg_data_width-1 downto 0); - Escribir datos

- Port-3

wr_en3: in std_logic; - Escriba Habilitar

addrs3_wr: en el signo (rg_addrs_width-1 downto 0); - Escriba las direcciones

data3_wr: en la firma (rg_data_width-1 downto 0); - Escribir datos

- Port-4

wr_en4: in std_logic; - Escriba Habilitar

addrs4_wr: en el signo (rg_addrs_width-1 downto 0); - Escriba las direcciones

data4_wr: en la firma (rg_data_width-1 downto 0); - Escribir datos

- Port-5

wr_en5: in std_logic; - Escriba Habilitar

addrs5_wr: en el signo (rg_addrs_width-1 downto 0); - Escriba las direcciones

data5_wr: en la firma (rg_data_width-1 downto 0); - Escribir datos

- Port-6

wr_en6: in std_logic; - Escriba Habilitar

addrs6_wr: en el signo (rg_addrs_width-1 downto 0); - Escriba las direcciones

data6_wr: en la firma (rg_data_width-1 downto 0); - Escribir datos

- Port-7

wr_en7: in std_logic; - Escriba Habilitar

addrs7_wr: en el signo (rg_addrs_width-1 downto 0); - Escriba las direcciones

data7_wr: en la firma (rg_data_width-1 downto 0); - Escribir datos- Leer Puertos --------------------------------------

- Port-0

addrs0_rd: en el signo (rg_addrs_width-1 downto 0); - Leer Dirección

data0_rd: fuera firmado (rg_data_width-1 downto 0); - Leer datos

- Port-1

addrs1_rd: en el signo (rg_addrs_width-1 downto 0); - Leer Dirección

data1_rd: fuera firmado (rg_data_width-1 downto 0); - Leer datos

- Port-2

addrs2_rd: en el signo (rg_addrs_width-1 downto 0); - Leer Dirección

data2_rd: fuera firmado (rg_data_width-1 downto 0); - Leer datos

- Port-3

addrs3_rd: en el signo (rg_addrs_width-1 downto 0); - Leer Dirección

data3_rd: fuera firmado (rg_data_width-1 downto 0); - Leer datos

- Port-4

addrs4_rd: en el signo (rg_addrs_width-1 downto 0); - Leer Dirección

data4_rd: fuera firmado (rg_data_width-1 downto 0); - Leer datos

- Port-5

addrs5_rd: en el signo (rg_addrs_width-1 downto 0); - Leer Dirección

data5_rd: fuera firmado (rg_data_width-1 downto 0); - Leer datos

- Port-6

addrs6_rd: en el signo (rg_addrs_width-1 downto 0); - Leer Dirección

data6_rd: fuera firmado (rg_data_width-1 downto 0); - Leer datos

- Port-7

addrs7_rd: en el signo (rg_addrs_width-1 downto 0); - Leer Dirección

data7_rd: fuera firmado (rg_data_width-1 downto 0)); - Leer datosrregfile_dp entidad final;

- Fin de la Declaración de la entidad -------------------------------------------- ------ Arquitectura Declaración ---------------------------------------------- ----

RTL arquitectura de rregfile_dp esregfile_type tipo es array (natural rango <>) de la firma (rg_data_width-1 downto 0);

raccum_reg señal: regfile_type (0 a (2 ** rg_addrs_width) -1);empezar - RTL arquitectura-------------------------------------------------- --------

- Proceso de escritura

-------------------------------------------------- --------

proc_wraccum: process (clk, rst_n) es

empezar - proceso proc_wraccum

si rst_n = '0 'then - reset asíncrono (bajo activa)

raccum_reg <= (others => (others => '0 '));

clk'event elsif y = '1 'y luego - flanco de reloj aumento de

si wr_en0 = '1 ', entonces

raccum_reg (to_integer (addrs0_wr)) <= data0_wr;

END IF;si wr_en1 = '1 ', entonces

raccum_reg (to_integer (addrs1_wr)) <= data1_wr;

END IF;si wr_en2 = '1 ', entonces

raccum_reg (to_integer (addrs2_wr)) <= data2_wr;

END IF;si wr_en3 = '1 ', entonces

raccum_reg (to_integer (addrs3_wr)) <= data3_wr;

END IF;si wr_en4 = '1 ', entonces

raccum_reg (to_integer (addrs4_wr)) <= data4_wr;

END IF;si wr_en5 = '1 ', entonces

raccum_reg (to_integer (addrs5_wr)) <= data5_wr;

END IF;si wr_en6 = '1 ', entonces

raccum_reg (to_integer (addrs6_wr)) <= data6_wr;

END IF;si wr_en7 = '1 ', entonces

raccum_reg (to_integer (addrs7_wr)) <= data7_wr;

END IF;

END IF;

proc_wraccum proceso final;

-------------------------------------------------- ---------------------------------------------------------- --------

- Leer Proceso

-------------------------------------------------- --------

data0_rd <= raccum_reg (to_integer (addrs0_rd));

data1_rd <= raccum_reg (to_integer (addrs1_rd));

data2_rd <= raccum_reg (to_integer (addrs2_rd));

data3_rd <= raccum_reg (to_integer (addrs3_rd));

data4_rd <= raccum_reg (to_integer (addrs4_rd));

data5_rd <= raccum_reg (to_integer (addrs5_rd));

data6_rd <= raccum_reg (to_integer (addrs6_rd));

data7_rd <= raccum_reg (to_integer (addrs7_rd));

-------------------------------------------------- --------RTL arquitectura de vanguardia;

- Fin de la Arquitectura Declaración -------------------------------------------

 
omara007 escribió:Estoy tratando de mapa de mi memoria codificada en VHDL Xilinx distribuido RAM ..
Estoy usando Xilinx Spartan-3A chip DSP (XC3SD1800A-4fg676) y Xilinx ISE 11.3.Estoy enfrentando 2 problema:

1.
Síntesis XST se está utilizando mucho tiempo ..
aproximadamente 5,5 horas.

2.
La utilización de chips de memoria de sólo el 47% es de 1,8 millones de chip equivalente puerta.

 
Hola,

Usted puede utilizar Xilinx CoreGen para generar el código de memoria RAM para usted, o tener una mirada en una nota técnica de Doulos en el que se compara una gran cantidad de técnicas de escritura RAM:

# http://www.doulos.com/knowhow/fpga/technotes/index.php Technote1

Devas

 
shitansh escribió:Que yo había escrito el código de SRAM en verilog utilizando matriz de dos dimensiones, y de esta manera a las pequeñas código de tiempo de síntesis y la utilización de RAM núcleo era demasiado, para mí también!El proble con arreglo bidimensional para mí en la herramienta Actel, yo cambio de código y que estaba trabajando muy bien para mí y problema resuelto.

 
¿Cuál es el valor de "rg_data_width" & "rg_data_width"?

 
omara007 escribió:

, ¿cómo te las arreglas para resolverlo (con ejemplos de código, si es posible) ..
 
palai_santosh escribió:

¿Cuál es el valor de "rg_data_width" & "rg_data_width"?
 
Creo que son muy conscientes del problema de la utilización de memorias distribuidas.
Parece un problema de codificación.Es si las declaraciones son intencionales??Imaginemos el caso en que dos o más puertos de escribir quiero escribir.
Su tratando de inferir 1K flops para hacer este archivo reg ...Alta después de 1 hora 9 minutos:Sólo para agregar ..
Desde la mirada de su diseño, su no a la memoria que te da tiempo de síntesis de alto.Su no el de los puertos de un particular, reg.
Usted está utilizando 8 puertos de leer y escribir 8 puertos.Este código está tratando de realizar un gran mux
42-bit 32-a-1 multiplexor y ocho de ellos.Alta después de 10 minutos:pruebe esta ...Esperamos que esto va a resolver su problema.
IEEE biblioteca;
ieee.std_logic_1164.all uso;
ieee.numeric_std.all uso;

- Declaración de la entidad ---------------------------------------------- ----------
rregfile_dp entidad es
genérico (
rg_addrs_width: integer: = 5;
rg_data_width: integer: = 42);
puerto (
CLK: in std_logic;
rst_n: in std_logic;
- Escribir Puerto -------------------------------------
- Port-0
wr_en0: in std_logic; - Escriba Habilitar
addrs0_wr: en el signo (rg_addrs_width-1 downto 0); - Escriba las direcciones
data0_wr: en la firma (rg_data_width-1 downto 0); - Escribir datos
- Port-1
wr_en1: in std_logic; - Escriba Habilitar
addrs1_wr: en el signo (rg_addrs_width-1 downto 0); - Escriba las direcciones
data1_wr: en la firma (rg_data_width-1 downto 0); - Escribir datos
- Port-2
wr_en2: in std_logic; - Escriba Habilitar
addrs2_wr: en el signo (rg_addrs_width-1 downto 0); - Escriba las direcciones
data2_wr: en la firma (rg_data_width-1 downto 0); - Escribir datos
- Port-3
wr_en3: in std_logic; - Escriba Habilitar
addrs3_wr: en el signo (rg_addrs_width-1 downto 0); - Escriba las direcciones
data3_wr: en la firma (rg_data_width-1 downto 0); - Escribir datos
- Port-4
wr_en4: in std_logic; - Escriba Habilitar
addrs4_wr: en el signo (rg_addrs_width-1 downto 0); - Escriba las direcciones
data4_wr: en la firma (rg_data_width-1 downto 0); - Escribir datos
- Port-5
wr_en5: in std_logic; - Escriba Habilitar
addrs5_wr: en el signo (rg_addrs_width-1 downto 0); - Escriba las direcciones
data5_wr: en la firma (rg_data_width-1 downto 0); - Escribir datos
- Port-6
wr_en6: in std_logic; - Escriba Habilitar
addrs6_wr: en el signo (rg_addrs_width-1 downto 0); - Escriba las direcciones
data6_wr: en la firma (rg_data_width-1 downto 0); - Escribir datos
- Port-7
wr_en7: in std_logic; - Escriba Habilitar
addrs7_wr: en el signo (rg_addrs_width-1 downto 0); - Escriba las direcciones
data7_wr: en la firma (rg_data_width-1 downto 0); - Escribir datos

- Leer Puertos --------------------------------------
- Port-0
addrs0_rd: en el signo (rg_addrs_width-1 downto 0); - Leer Dirección
data0_rd: fuera firmado (rg_data_width-1 downto 0); - Leer datos
- Port-1
addrs1_rd: en el signo (rg_addrs_width-1 downto 0); - Leer Dirección
data1_rd: fuera firmado (rg_data_width-1 downto 0); - Leer datos
- Port-2
addrs2_rd: en el signo (rg_addrs_width-1 downto 0); - Leer Dirección
data2_rd: fuera firmado (rg_data_width-1 downto 0); - Leer datos
- Port-3
addrs3_rd: en el signo (rg_addrs_width-1 downto 0); - Leer Dirección
data3_rd: fuera firmado (rg_data_width-1 downto 0); - Leer datos
- Port-4
addrs4_rd: en el signo (rg_addrs_width-1 downto 0); - Leer Dirección
data4_rd: fuera firmado (rg_data_width-1 downto 0); - Leer datos
- Port-5
addrs5_rd: en el signo (rg_addrs_width-1 downto 0); - Leer Dirección
data5_rd: fuera firmado (rg_data_width-1 downto 0); - Leer datos
- Port-6
addrs6_rd: en el signo (rg_addrs_width-1 downto 0); - Leer Dirección
data6_rd: fuera firmado (rg_data_width-1 downto 0); - Leer datos
- Port-7
addrs7_rd: en el signo (rg_addrs_width-1 downto 0); - Leer Dirección
data7_rd: fuera firmado (rg_data_width-1 downto 0)); - Leer datosrregfile_dp entidad final;
- Fin de la Declaración de la entidad -------------------------------------------- -----

- Arquitectura Declaración ---------------------------------------------- ----
RTL arquitectura de rregfile_dp es

regfile_type tipo es array (natural rango <>) de la firma (rg_data_width-1 downto 0);
raccum_reg señal: regfile_type (0 a (2 ** rg_addrs_width) -1);

empezar - RTL arquitectura

-------------------------------------------------- --------
- Proceso de escritura
-------------------------------------------------- --------

proc_wraccum: process (clk, rst_n) es
Wen_sel variable: std_logic_vector (7 downto 0);
empezar - proceso proc_wraccum
Wen_sel: = wr_en0 & wr_en1 & wr_en2 & wr_en3 & wr_en4 & wr_en5 & wr_en6 & wr_en7;
si rst_n = '0 'then - reset asíncrono (bajo activa)
raccum_reg <= (others => (others => '0 '));
clk'event elsif y = '1 'y luego - flanco de reloj aumento de
caso (Wen_sel) es
cuando "10000000" => raccum_reg (to_integer (addrs0_wr)) <= data0_wr;
cuando "01000000" => raccum_reg (to_integer (addrs1_wr)) <= data1_wr;
cuando "00100000" => raccum_reg (to_integer (addrs2_wr)) <= data2_wr;
cuando "00010000" => raccum_reg (to_integer (addrs3_wr)) <= data3_wr;
cuando "00001000" => raccum_reg (to_integer (addrs4_wr)) <= data4_wr;
cuando "00000100" => raccum_reg (to_integer (addrs5_wr)) <= data5_wr;
cuando "00000010" => raccum_reg (to_integer (addrs6_wr)) <= data6_wr;
cuando "00000001" => raccum_reg (to_integer (addrs7_wr)) <= data7_wr;
cuando los demás => raccum_reg <= raccum_reg;
caso extremo;

END IF;
proc_wraccum proceso final;
-------------------------------------------------- --------

-------------------------------------------------- --------
- Leer Proceso
-------------------------------------------------- --------
data0_rd <= raccum_reg (to_integer (addrs0_rd));
data1_rd <= raccum_reg (to_integer (addrs1_rd));
data2_rd <= raccum_reg (to_integer (addrs2_rd));
data3_rd <= raccum_reg (to_integer (addrs3_rd));
data4_rd <= raccum_reg (to_integer (addrs4_rd));
data5_rd <= raccum_reg (to_integer (addrs5_rd));
data6_rd <= raccum_reg (to_integer (addrs6_rd));
data7_rd <= raccum_reg (to_integer (addrs7_rd));
-------------------------------------------------- --------

RTL arquitectura de vanguardia;
- Fin de la Arquitectura Declaración -------------------------------------------

 
palai_santosh escribió:-------------------------------------------------- --------

- Proceso de escritura

-------------------------------------------------- --------proc_wraccum: process (clk, rst_n) es

Wen_sel variable: std_logic_vector (7 downto 0);

empezar - proceso proc_wraccum

Wen_sel: = wr_en0 & wr_en1 & wr_en2 & wr_en3 & wr_en4 & wr_en5 & wr_en6 & wr_en7;

si rst_n = '0 'then - reset asíncrono (bajo activa)

raccum_reg <= (others => (others => '0 '));

clk'event elsif y = '1 'y luego - flanco de reloj aumento de

caso (Wen_sel) es

cuando "10000000" => raccum_reg (to_integer (addrs0_wr)) <= data0_wr;

cuando "01000000" => raccum_reg (to_integer (addrs1_wr)) <= data1_wr;

cuando "00100000" => raccum_reg (to_integer (addrs2_wr)) <= data2_wr;

cuando "00010000" => raccum_reg (to_integer (addrs3_wr)) <= data3_wr;

cuando "00001000" => raccum_reg (to_integer (addrs4_wr)) <= data4_wr;

cuando "00000100" => raccum_reg (to_integer (addrs5_wr)) <= data5_wr;

cuando "00000010" => raccum_reg (to_integer (addrs6_wr)) <= data6_wr;

cuando "00000001" => raccum_reg (to_integer (addrs7_wr)) <= data7_wr;

cuando los demás => raccum_reg <= raccum_reg;

caso extremo;END IF;

proc_wraccum proceso final;

-------------------------------------------------- --------

 

Welcome to EDABoard.com

Sponsor

Back
Top