--
Has recibido este mensaje porque estás suscrito al grupo "FPGAwars: explorando el lado libre" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a fpga-wars-explorando-el...@googlegroups.com.
Para ver este debate, visita https://groups.google.com/d/msgid/fpga-wars-explorando-el-lado-libre/006b3617-c029-4f84-957f-e3b51e28b66bn%40googlegroups.com.
Tengo una FPGA Artix-7 XC7A100T (Wukong Board) y tengo previsto tener una Artix-7 XC7A200T. ¿Estas FPGAs estarán accesibles en los programas que nombras? ¿Tienes alguna lista de las FPGAs que se admitirán?
--
Has recibido este mensaje porque estás suscrito al grupo "FPGAwars: explorando el lado libre" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a fpga-wars-explorando-el...@googlegroups.com.
Hay un punto importante que entender en el flujo de generar el bitstream yo cuando lo entendí mi cabeza hizo click y dio un salto cuántico.
Cuando sintentizamos con yosys hay 2 fases, en la primera yosys sintetiza el código a un sistema genérico suyo que es igual para cualquier fpga, es como si tuviera su propia FPGA digámoslo así un modelo mental con el que puede representar el circuito, así que en esta fase cualquier diseño orientado a cualquier fpga acaba en el mismo formato.
En la segunda fase ya hace la traducción de su representación común al netlist de la arquitectura concreta para cada fpga (dice si yo he indentificado esto como una memoria voy a ver si esta fpga que me dices que vas a usar tiene un bloque tipo "memoria" en la que pueda mapearlo....)
Y y sabiendo que esto ocurre, es ver como hacer que yosys entienda tu código y en esa primera fase lo etiquete como una memoria. Así que como básicamente la memoria la representarás como un array, lo importante es :
1. El array como tal
Declara un array 2D de reg (Verilog) o un signal de tipo array (VHDL):
reg [WIDTH-1:0] mem [0:DEPTH-1];
type ram_t is array (0 to DEPTH-1) of std_logic_vector(WIDTH-1 downto 0);
signal mem : ram_t;
Profundidad potencia de dos ayuda al empaquetado pero no es obligatoria.
2. Escritura siempre síncrona
El puerto de escritura tiene que estar dentro de un proceso de reloj. Una escritura asíncrona impide el mapeo a BRAM por completo (los EBR de iCE40, por ejemplo, solo tienen escritura registrada):
always @(posedge clk)
if (we) mem[waddr] <= wdata;
memory_dff es la pasada que absorbe ese flip-flop de escritura dentro de la celda de memoria.
3. La lectura decide a qué recurso vas
Este es el punto más importante para "no acabar en lógica":
always @(posedge clk) rdata <= mem[raddr];
Lectura asíncrona (combinacional) a LUTRAM/distributed RAM donde exista, o lógica de registros si no. En iCE40 esto no cabe en EBR y aquí es donde todo es una locura porque te implementa la memoria como registros encadenados y ya no es solo área sino que piensa que todo eso es retardo de la señal al pasar por toda la cadena (esto es lo típico de decir, pero si mi diseño no tiene nada y no llego casi ni a 12Mhz!).
assign rdata = mem[raddr]; // evita esto
4. Comportamiento read-during-write
Si lees y escribes la misma dirección en el mismo proceso, el orden de las asignaciones no bloqueantes define la semántica (read-first / write-first), y Yosys la propaga a la celda. Si mezclas estilos de forma ambigua puede acabar duplicando lógica de bypass o, peor, no infiriendo nada.
always @(posedge clk) begin
if (we) mem[addr] <= din;
dout <= mem[addr]; // read-first (dato viejo) por la semántica NBA
end
5. Inicialización portable
Para ROM o contenido inicial usa initial + $readmemh/$readmemb, no primitivas:
initial $readmemh("init.hex", mem);
(EBR de iCE40 admite init; SPRAM no.)
Qué rompe la inferencia o fuerza lógica. Escritura asíncrona; reset síncrono/asíncrono de todo el array (suele degradarlo a registros); acceso bit a bit que mezcla el direccionamiento de palabra; puertos de ancho mixto no soportados por el destino; más puertos de los que tiene el BRAM físico; y combinar la memoria con lógica que exige acceso por bit individual.
Para VHDL todo esto pasa por el plugin ghdl-yosys-plugin, con los mismos patrones (proceso rising_edge(clk), array de signal). ¿Apuntas en concreto a los EBR del iCE40 o quieres algo genuinamente neutro entre familias? La respuesta cambia un poco según si puedes asumir lectura síncrona.
--
Has recibido este mensaje porque estás suscrito al grupo "FPGAwars: explorando el lado libre" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a fpga-wars-explorando-el...@googlegroups.com.
