$ iverilog -o design bcd2segments.v bcd2segments_tb.v
bcd2segments_tb.v:5: syntax error
bcd2segments_tb.v:5: error: syntax error in reg variable list.
`timescale 1ns / 1ps
module bcd2segments_tb ( );
reg [6:0] expected[0:15] = { 7'h3F, 7'h06, 7'h5B, 7'h4F,
7'h66, 7'h6D, 7'h7D, 7'h07,
7'h7F, 7'h67, 7'h7A, 7'h7C,
7'h39, 7'h5E, 7'h79, 7'h71 };
reg [3:0] bcd;
wire [6:0] segment;
bcd2segments uut( .bcd(bcd) , .segments(segment) );
initial begin
bcd = 0;
forever begin
bcd = #1 bcd + 1;
end
end
always @(expected) begin
if ( segment != expected[bcd] ) begin
$display("Expected %x, Found %x for BCD %x\n", expected[bcd], segment, bcd);
$finish;
end else if ( bcd == 15 ) begin
$finish;
end
end
endmodule
`timescale 1ns / 1ps
module bcd2segments_tb ( );
reg [6:0] expected[0:15];
/*reg [6:0] expected[0:15] = { 7'h3F, 7'h06, 7'h5B, 7'h4F,
7'h66, 7'h6D, 7'h7D, 7'h07,
7'h7F, 7'h67, 7'h7A, 7'h7C,
7'h39, 7'h5E, 7'h79, 7'h71 };*/
reg [3:0] bcd;
wire [6:0] segment;
bcd2segments uut( .bcd(bcd) , .segments(segment) );
initial begin
// Verilog system tasks
$dumpfile("bcd2segments_tb.vcd");
$dumpvars(0, bcd2segments_tb);
bcd = 0;
expected[0] = 7'h3F;
expected[1] = 7'h06;
expected[2] = 7'h5B;
expected[3] = 7'h4F;
expected[4] = 7'h66;
expected[5] = 7'h6D;
expected[6] = 7'h7D;
expected[7] = 7'h07;
expected[8] = 7'h7F;
expected[9] = 7'h67;
expected[10] = 7'h7A;
expected[11] = 7'h7C;
expected[12] = 7'h39;
expected[13] = 7'h5E;
expected[14] = 7'h79;
expected[15] = 7'h71;
forever begin
bcd = #1 bcd + 1;
end
end
always @(bcd) begin
if ( segment != expected[bcd] ) begin
$display("Expected %X, Found %X for BCD %X\n", expected[bcd], segment, bcd);
$finish;
end else if ( bcd == 16 ) begin
$finish;
end
end
endmodule$ iverilog -o design bcd2segments.v bcd2segments_tb.v$ vvp designVCD info: dumpfile bcd2segments_tb.vcd opened for output.
Expected 5b, Found 06 for BCD 2$ gtkwave bcd2segments_tb.vcd &
--
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-lado-libre+unsubscribe@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a fpga-wars-explorando-el-lado-li...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/fpga-wars-explorando-el-lado-libre.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/fpga-wars-explorando-el-lado-libre/1b41e863-ddbb-4639-8a94-7e9e4a210c5b%40googlegroups.com.
`timescale 1ns / 1ps
module bcd2segments_tb ( );
reg [6:0] expected[0:15];
reg [3:0] bcd;
wire [6:0] segment;
bcd2segments uut( .bcd(bcd) , .segments(segment) );
initial begin
$dumpfile("bcd2segments_tb.vcd");
$dumpvars(0, bcd2segments_tb);
expected[0] = 7'h3F;
expected[1] = 7'h06;
expected[2] = 7'h5B;
expected[3] = 7'h4F;
expected[4] = 7'h66;
expected[5] = 7'h6D;
expected[6] = 7'h7D;
expected[7] = 7'h07;
expected[8] = 7'h7F;
expected[9] = 7'h67;
expected[10] = 7'h7A;
expected[11] = 7'h7C;
expected[12] = 7'h39;
expected[13] = 7'h5E;
expected[14] = 7'h79;
expected[15] = 7'h71;
bcd = 0;
forever begin
bcd = bcd + 1;
#10;
end
end
always @(bcd) begin
if ( segment != expected[bcd] ) begin
$display("Expected %X, Found %X for BCD %X\n", expected[bcd], segment, bcd);
end
if ( bcd == 'hf ) begin $finish; end
end
endmoduleiverilog -o design bcd2segments.v bcd2segments_tb.v
[user@localhost test]$ ./design
VCD info: dumpfile bcd2segments_tb.vcd opened for output.
Expected 5b, Found 06 for BCD 2
Expected 4f, Found 5b for BCD 3
Expected 66, Found 4f for BCD 4
Expected 6d, Found 66 for BCD 5
Expected 7d, Found 6d for BCD 6
Expected 07, Found 7d for BCD 7
Expected 7f, Found 07 for BCD 8
Expected 67, Found 7f for BCD 9
Expected 7a, Found 67 for BCD a
Expected 7c, Found 7a for BCD b
Expected 39, Found 7c for BCD c
Expected 5e, Found 39 for BCD d
Expected 79, Found 5e for BCD e
Expected 71, Found 79 for BCD f
`timescale 1ns / 1ps
`default_nettype none
module bcd2segments_tb ( );
reg [6:0] expected[0:15];
reg [3:0] bcd;
wire [6:0] segment;
bcd2segments uut( .bcd(bcd) , .segments(segment) );
initial begin
// Verilog system tasks
// $dumpfile genera un archivo
// donde se almacenan todas las
// variables del diseño
$dumpfile("bcd2segments.vcd");
$dumpvars(0, bcd2segments_tb);
// ("file", array, start_addr, end_addr);
$readmemh("mem.data", expected, 0, 15);
// expected[4'd0] = 7'h3F;
// expected[4'd1] = 7'h06;
// expected[4'd2] = 7'h5B;
// expected[4'd3] = 7'h4F;
// expected[4'd4] = 7'h66;
// expected[4'd5] = 7'h6D;
// expected[4'd6] = 7'h7D;
// expected[4'd7] = 7'h07;
// expected[4'd8] = 7'h7F;
// expected[4'd9] = 7'h67;
// expected[4'd10] = 7'h7A;
// expected[4'd11] = 7'h7C;
// expected[4'd12] = 7'h39;
// expected[4'd13] = 7'h5E;
// expected[4'd14] = 7'h79;
// expected[4'd15] = 7'h71;
bcd = 0;
forever begin
bcd = bcd + 1;
#10;
end
end
always @(bcd) begin
if ( segment != expected[bcd] ) begin
$display("Error: Expected %x, Found %x for BCD %x", expected[bcd], segment, bcd);
end
if ( bcd == 4'hF ) begin
$finish;
end
end
endmodule
3F
06
5B
4F
66
6D
7D
07
7F
67
7A
7C
39
5E
79
71`timescale 1ns / 1ps
`default_nettype none
module bcd2segments
(
input [3:0] bcd,
output [6:0] segments
);
assign segments = (bcd == 4'h0) ? 7'h3F :
(bcd == 4'h1) ? 7'h06 :
(bcd == 4'h2) ? 7'h5B :
(bcd == 4'h3) ? 7'h4F :
(bcd == 4'h4) ? 7'h66 :
(bcd == 4'h5) ? 7'h6D :
(bcd == 4'h6) ? 7'h7D :
(bcd == 4'h7) ? 7'h07 :
(bcd == 4'h8) ? 7'h7F :
(bcd == 4'h9) ? 7'h67 :
(bcd == 4'hA) ? 7'h7A :
(bcd == 4'hB) ? 7'h7C :
(bcd == 4'hC) ? 7'h39 :
(bcd == 4'hD) ? 7'h5E :
(bcd == 4'hE) ? 7'h79 : 7'h71;
endmodule
read_verilog bcd2segments.v
show -pause
proc
show -pause
opt
show -pauseGracias por revisar el proyecto :D, en efecto la asignación del array funciona con SV, termine usando $readmemh para llenar el array, me pareció mas rápido aunque más confuso :/ ¿que opinas?
vvp aparece en el man de iverilog, pero tienes razón, se puede ejecutar el archivo que se obtiene de usar iverilog directamente :D. Y ya incluí el ultimo punto que me dices, acabar la simulación solo hasta que bcd llega a 15.
No se si sea correcto pero ¿ se puede utilizar los gráficos que genera yosys para descubrir ese registro?
utilice el siguiente script:
assign thissegment = expected[bcd]
always @(bcd) begin
#1;
if ( segment != thissegment ) begin
$display("Expected %X, Found %X for BCD %X\n", thissegment, segment, bcd);
end
if ( bcd == 'hf ) begin $finish; end
endalways @(bcd) begin
#1;
if ( segment != expected[bcd] ) begin
$display("Expected %X, Found %X for BCD %X\n", expected[bcd], segment, bcd);
end
if ( bcd == 'hf ) begin $finish; end
endHola,
Ahora entiendo un poco mejor las simulaciones xD.
Con
respecto a otra implementación me di cuenta que es una look-up-table,
donde se tiene un array auxiliar, a la salida segments se le asigna una
posición de ese array, la posición se controla con la entrada bcd. Así
quedo mi implementación (por ahora xD):
bcd2segments.v
`timescale 1ns / 1ps
`default_nettype none
module bcd2segments
(
input [3:0] bcd,
output [6:0] segments
);
reg [6:0] LUT[0:15];
initial begin
LUT[4'h0] = 7'h3F;
LUT[4'h1] = 7'h06;
LUT[4'h2] = 7'h5B;
LUT[4'h3] = 7'h4F;
LUT[4'h4] = 7'h66;
LUT[4'h5] = 7'h6D;
LUT[4'h6] = 7'h7D;
LUT[4'h7] = 7'h07;
LUT[4'h8] = 7'h7F;
LUT[4'h9] = 7'h67;
LUT[4'hA] = 7'h7A;
LUT[4'hB] = 7'h7C;
LUT[4'hC] = 7'h39;
LUT[4'hD] = 7'h5E;
LUT[4'hE] = 7'h79;
LUT[4'hF] = 7'h71;
end
assign segments = LUT[bcd];
endmodule
`timescale 1ns / 1ps
`default_nettype none
module bcd2segments_tb ( );
reg [6:0] expected[0:15];
reg [3:0] bcd;
wire [6:0] segment;
bcd2segments uut( .bcd(bcd) , .segments(segment) );
initial begin
// Verilog system tasks
// $dumpfile genera un archivo
// donde se almacenan todas las
// variables del diseño
$dumpfile("bcd2segments.vcd");
$dumpvars(0, bcd2segments_tb);
expected[4'd0] = 7'h3F;
expected[4'd1] = 7'h06;
expected[4'd2] = 7'h5B;
expected[4'd3] = 7'h4F;
expected[4'd4] = 7'h66;
expected[4'd5] = 7'h6D;
expected[4'd6] = 7'h7D;
expected[4'd7] = 7'h07;
expected[4'd8] = 7'h7F;
expected[4'd9] = 7'h67;
expected[4'd10] = 7'h7A;
expected[4'd11] = 7'h7C;
expected[4'd12] = 7'h39;
expected[4'd13] = 7'h5E;
expected[4'd14] = 7'h79;
expected[4'd15] = 7'h71;
bcd = 0;
forever begin
#1;
bcd = bcd + 1;
#1;
end
end
always @(bcd) begin
#1
$display("Expected %x, Found %x for BCD %x", expected[bcd], segment, bcd);
if ( segment != expected[bcd] ) begin
$display("Error: Expected %x, Found %x for BCD %x", expected[bcd], segment, bcd);
end
if ( bcd == 4'hF ) begin
$finish;
end
end
endmodule
Y el resultado en gtkwave:
No se me ha ocurrido otra forma de hacer el diseño xD
Saludos
Con respecto a otra implementación me di cuenta que es una look-up-table, donde se tiene un array auxiliar, a la salida segments se le asigna una posición de ese array, la posición se controla con la entrada bcd. Así quedo mi implementación (por ahora xD):
El test bench tuve que añadir algunos ciclos para poder ver cuando bcd vale 0 y F:
No se me ha ocurrido otra forma de hacer el diseño xD
Cuando te lo comenté lo que yo tenía en la cabeza era convertir la escalera de multiplexores en un árbol. Pseudocódigo, no Verilog:
etapa1a = entrada1? constante1 ; constante2;
etapa1b = entrada3? constante3 ; constante4;
etapa1c = entrada5? constante5 ; constante6;
etapa1d = entrada7? constante7 ; constante8;
etapa2a = entrada12? etapa1a ; etapa1b;
etapa2b = entrada56? etapa1c ; etapa1d;
etapa3 = entrada1234? etapa2a ; etapa2b;Este es un ejemplo de 8 constantes. En la primera etapa se comparan las ocho entradas de dos en dos, y se multiplexan, de forma que en la segunda etapa hay 4 entradas. En la segunda etapa, se hace lo mismo para obtener dos salidas de las cuatro entradas, En la última, sólo quedan dos opciones que multiplexar.
Son 7 multiplexores en lugar de quince, y cada señal sólo tiene que atravesar tres etapas de izquierda a derecha. Por contra, requiere alguna puerta adicional. En general creo que es más eficiente que la primera solución. No sabría decir en comparación con esta última. Sería interesante que probaras el resultado de síntesis de las diferentes soluciones para ver hasta qué punto el sintetizador es capaz de darse cuenta de que están haciendo lo mismo de diferentes formas.
Por ejemplo, un ejercicio que hice ayer, como si fuera un sudoku, fue coger tu tabla e implementarla sólo con puertas lógicas. Sin ninguna constante ni multplexor. Aquí el desarrollo completo:
#Tabla de la verdad
3210 gfedcba
------------
0000 0111111
0001 0000110
0010 1011011
0011 1001111
0100 1100110
0101 1101101
0110 1111101
0111 0000111
1000 1111111
1001 1100111
1010 1111010
1011 1111100
1100 0111001
1101 1011110
1110 1111001
1111 1110001
#Cuándo es 1
a = 0 2 3 5 6 7 8 9 12 14 15
b = 0 1 2 3 4 7 8 9 10 13
c = 0 1 3 4 5 6 7 8 9 11 13
d = 0 2 3 5 6 8 10 11 12 13 14
e = 0 2 6 8 10 11 12 13 14 15
f = 0 4 5 6 8 9 10 11 12 14 15
g = 2 3 4 5 6 7 8 9 10 11 13 14 15
# Cuándo es cero
a = 1 4 10 11 13
b = 5 6 11 12 14 15
c = 2 10 12 14 15
d = 1 4 7 9 15
e = 1 3 4 5 7 9
f = 1 2 3 7 13
g = 0 1 7 12
# Parece más compacto identificar cuándo es cero y negarlo
a = not ( 0001 or 0100 or 1010 or 1011 or 1101 )
b = not ( 0101 or 0110 or 1011 or 1100 or 1110 or 1111 )
c = not ( 0010 or 1010 or 1100 or 1110 or 1111 )
d = not ( 0001 or 0100 or 0111 or 1001 or 1111 )
e = not ( 0001 or 0011 or 0100 or 0101 or 0111 or 1001 )
f = not ( 0001 or 0010 or 0011 or 0111 or 1101 )
g = not ( 0000 or 0001 or 0111 or 1100 )module bcd2segments_gates (
input [3:0] i,
output [6:0] o
);
wire yn0n1, y01, y012, y0n1n2, yn23, y23, y0n1, y0n1n2n3, yn2n3, yn1n2n3, yn0n123, y012n3, yn01, y2n3;
assign o[0] = ~( ((~i[3]) & (~i[1]) & (i[0] ^ i[2])) | (yn23 & i[1]) | (y23 & y0n1) );
assign o[1] = ~( (y2n3 & (i[1] ^ i[0])) | (yn23 & y01) | (y23 & ~(i[0] & (~i[1]))) );
assign o[2] = ~( (yn01 & (~i[2])) | (y23 & (~y0n1)) );
assign o[3] = ~( (y2n3 & yn0n1) | y0n1n2 | y012 );
assign o[4] = ~( (yn2n3 & i[0]) | (y2n3 & (~yn01)) | (yn23 & y0n1) );
assign o[5] = ~( y0n1n2n3 | (yn2n3 & i[1]) | y012n3 | (y23 & y0n1) );
assign o[6] = ~( yn1n2n3 | y012n3 | yn0n123 );
assign y01 = i[0] & i[1];
assign y012 = y01 & i[2];
assign yn23 = (~i[2]) & i[3];
assign y23 = i[2] & i[3];
assign y0n1 = (~i[1]) & i[0];
assign y0n1n2 = y0n1 & (~i[2]);
assign y0n1n2n3 = yn2n3 & y0n1;
assign yn2n3 = (~i[2]) & (~i[3]);
assign yn1n2n3 = (~i[1]) & yn2n3;
assign yn0n123 = (~i[0]) & (~i[1]) & i[2] & i[3];
assign y012n3 = y012 & (~i[3]);
assign yn01 = (~i[0]) & i[1];
assign y2n3 = i[2] & (~i[3]);
assign yn0n1 = (~i[0]) & (~i[1]);
endmodule
`timescale 1ns / 1ps
module bcd2segments_tb ( );
reg [6:0] expected[0:15];
wire [6:0] segment, segment_gates;
reg [3:0] bcd;
wire [6:0] thisegment;
bcd2segments uut( .bcd(bcd) , .segments(segment) );
bcd2segments_gates uut_gates( .i(bcd) , .o(segment_gates) );
initial begin
$dumpfile("bcd2segments_tb.vcd");
$dumpvars(0, bcd2segments_tb);
expected[0] = 7'h3F;
expected[1] = 7'h06;
expected[2] = 7'h5B;
expected[3] = 7'h4F;
expected[4] = 7'h66;
expected[5] = 7'h6D;
expected[6] = 7'h7D;
expected[7] = 7'h07;
expected[8] = 7'h7F;
expected[9] = 7'h67;
expected[10] = 7'h7A;
expected[11] = 7'h7C;
expected[12] = 7'h39;
expected[13] = 7'h5E;
expected[14] = 7'h79;
expected[15] = 7'h71;
bcd = 15;
forever begin
bcd = bcd + 1;
#200;
end
end
always @(bcd) begin
#1;
$display("Expected %X, Found %X and %X for BCD %X\n", expected[bcd], segment, segment_gates, bcd);
if ( bcd == 'hf ) begin $finish; end
end
endmodule
Como ves, se aprecia la activación de cada señal auxiliar. Aunque pueda parecer aleatorio, la salida es correcta (idéntica a la tuya). ¿Qué diferencia habrá en el consumo de recursos?
Saludos
--
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-lado-libre+unsubscribe@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a fpga-wars-explorando-el-lado-li...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/fpga-wars-explorando-el-lado-libre.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/fpga-wars-explorando-el-lado-libre/c5ab3d27-4c76-4535-ab9a-5a1f9c4ac759%40googlegroups.com.
Tendre que hacer un dibujo para poder entender el circuito xD, me intriga como pudiste implementarlo solo utilizando compuertas :D.
Más tarde (son 2am aca en México) sintetizo tu diseño y vemos los resultados que arroja yosys, estuve leyendo el manual y las celdas $memrd y $memwr que obtengo en el diseño de la LUT se mapean a la arquitectura "objetivo", en este caso la ICE40, en los mensajes que arroja yosys durante las optimizaciones me aparecieron celdas de la memoria RAM pero al final no reporta que usó celdas de RAM :/.
`timescale 1ns / 1ps
`default_nettype none
module bcd2segments
(
input [3:0] bcd,
output reg [6:0] segments
);
always @(*) begin
case(bcd)
4'h0: segments <= 7'h3F;
4'h1: segments <= 7'h06;
4'h2: segments <= 7'h5B;
4'h3: segments <= 7'h4F;
4'h4: segments <= 7'h66;
4'h5: segments <= 7'h6D;
4'h6: segments <= 7'h7D;
4'h7: segments <= 7'h07;
4'h8: segments <= 7'h7F;
4'h9: segments <= 7'h67;
4'hA: segments <= 7'h7A;
4'hB: segments <= 7'h7C;
4'hC: segments <= 7'h39;
4'hD: segments <= 7'h5E;
4'hE: segments <= 7'h79;
4'hF: segments <= 7'h71;
default: segments <= 0;
endcase
end
endmodule
$ yosys -p "synth_ice40 -blif componete.blif" componente.v
Number of wires: 2
Number of wire bits: 11
Number of public wires: 2
Number of public wire bits: 11
Number of memories: 0
Number of memory bits: 0
Number of processes: 0
Number of cells: 7
SB_LUT4 7
$ yosys -p "synth_ice40 -blif lut.blif" lut.v
Number of wires: 2
Number of wire bits: 11
Number of public wires: 2
Number of public wire bits: 11
Number of memories: 0
Number of memory bits: 0
Number of processes: 0
Number of cells: 7
SB_LUT4 7
`timescale 1ns / 1ps
`default_nettype none
$ yosys -p "synth_ice40 -blif gates.blif" gates.v
Number of wires: 2
Number of wire bits: 11
Number of public wires: 2
Number of public wire bits: 11
Number of memories: 0
Number of memory bits: 0
Number of processes: 0
Number of cells: 7
SB_LUT4 7
read_verilog <archivo_fuente>.v
show -pause
proc
show -pause
opt
show -pause
After packing:
IOs 11 / 96
GBs 0 / 8
GB_IOs 0 / 8
LCs 7 / 1280
DFF 0
CARRY 0
CARRY, DFF 0
DFF PASS 0
CARRY PASS 0
BRAMs 0 / 16
WARMBOOTs 0 / 1
PLLs 0 / 1
After placement:
PIOs 7 / 96
PLBs 2 / 160
BRAMs 0 / 16
`timescale 1ns / 1ps
`default_nettype none
module bcd2segments
(
input [3:0] bcd,
output [6:0] segments
);
reg [6:0] LUT[0:15];
initial begin
LUT[4'h0] <= 7'h3F;
LUT[4'h1] <= 7'h06;
LUT[4'h2] <= 7'h5B;
LUT[4'h3] <= 7'h4F;
LUT[4'h4] <= 7'h66;
LUT[4'h5] <= 7'h6D;
LUT[4'h6] <= 7'h7D;
LUT[4'h7] <= 7'h07;
LUT[4'h8] <= 7'h7F;
LUT[4'h9] <= 7'h67;
LUT[4'hA] <= 7'h77;
LUT[4'hB] <= 7'h7C;
LUT[4'hC] <= 7'h39;
LUT[4'hD] <= 7'h5E;
LUT[4'hE] <= 7'h79;
LUT[4'hF] <= 7'h71;
end
assign segments = LUT[bcd];
endmodule
`timescale 1ns / 1ps
`default_nettype none
module bcd2segments_gates (
input [3:0] bcd,
output [6:0] segments
);
`define A bcd[3]
`define B bcd[2]
`define C bcd[1]
`define D bcd[0]
// Kmap
assign segments[0] = (~`B & ~`D) | (~`A & `C) | (`B & `C) | (`A & ~`D) | (~`A & `B & `D) | (`A & ~`B & ~`C);
assign segments[1] = (~`A & ~`B) | (~`B & ~`D) | (~`A & ~`C & ~`D) | (~`A & `C & `D) | (`A & ~`C & `D);
assign segments[2] = (~`A & ~`C) | (~`A & `D) | (~`C & `D) | (~`A & `B) | (`A & ~`B);
assign segments[3] = (~`A & ~`B & ~`D) | (~`B & `C & `D) | (`B & ~`C & `D) | (`B & `C & ~`D) | (`A & ~`C & ~`D);
assign segments[4] = (~`B & ~`D) | (`C & ~ `D) | (`A & `C) | (`A & `B);
assign segments[5] = (~`C & ~`D) | (`B & ~`D) | (`A & ~`B) | (`A & `C) | (~`A & `B & ~`C);
assign segments[6] = (~`A & `B & ~`C) | (`A & ~`B) | (`C & ~`D) | (`A & `D) | (~`B & `C);
endmodule
Creo que había alguna herramienta online que visualizaba el circuito sobre un dibujo de la FPGA. Seguramente se verá lo mismo. Pero por probar...
Hola,
A mi también me llamo la atención que con 3
implementaciones tan diferentes se llegara aparentemente al mismo
resultado, este experimento lo inicie para tratar de mejorar el decoder
que hice para icestudio unos meses atras, pensando que lo había
implementado muy mal. En lo personal se me hizo mas fácil la
implementación de la LUT, pero con el diseño con compuertas lógicas tuve
que volver a leer temas que vi hace unos semestres en la u.
Al
parecer yosys tiene varias opciones para optimizar los diseños, al
llamar synth_ice40 se llaman otros comandos, entre ellos se llaman
algunos para realizar las optimizaciones por default.
Genere el asc del diseño con LUTs (adjunto) y lo cargue en la página que mandaste, la imagen de abajo es la parte "interesante" del resultado, los bloques rosas son bloque lógicos, lo demás no lo se interpretar aun xD