diferentes enfoques para implementar el contador del programa

0

Quiero implementar el siguiente circuito contador de programas de 32 bits:

yesteesmicódigoverilogactual:

moduleprogram_counter(d,inc,ld,clr,clk,Q);input[31:0]d;inputinc,ld,clr,clk;outputreg[31:0]Q;reg[31:0]q_inter;always@(posedgeclk)beginif(clr)q_inter=32'b0;elseif(ld)begincase(inc)1'b0:q_inter=d;1'b1:q_inter=q_inter+4;endcaseendQ=q_inter;endendmodule

Cambiélasasignacionesalasasignacionesdebloqueoporquequeríaesperaraqueelq_interrecibieralaseñalactualizadaantesdeasignarlaaQ,yaquemedicuentadequesinoestabanbloqueando,daríacomoresultadounarespuestaretardadaenlasimulación.

Inicialmenteestabaintentandohacerlomismocambiandoelpuertoqaunpuertodeentradayhaciendoalgocomoesto:

moduleprogram_counter(d,inc,ld,clr,clk,Q);input[31:0]d;inputinc,ld,clr,clk;inoutreg[31:0]Q;always@(posedgeclk)beginif(clr)Q=32'b0;elseif(ld)begincase(inc)1'b0:Q=d;1'b1:Q=Q+4;endcaseendendendmodule

peromedaelsiguienteerror:"El puerto Q no de red no puede estar en modo inout"

Mis preguntas:

1) ¿Alguien puede explicar por qué hacer una Q inout me da este error?

2) ¿Cambiar las asignaciones de bloqueo a no bloqueo resultará en menores restricciones de tiempo? en otras palabras, ¿se traducirá en un circuito menos demorado?

    
pregunta user43825

1 respuesta

1

Su código actual no coincide con su esquema. Con dos reg s separados para q_inter y Q , lo que has creado es el siguiente circuito (omitiendo las señales clr y ld para mayor claridad):

simular este circuito : esquema creado usando CircuitLab

Pero tampoco necesitas un inout para esto. ( inout reg es una contradicción: reg genera un valor, lo que lo convierte en output casi por definición). Todo lo que necesita hacer es eliminar q_internal , reemplazarlo con Q o crear q_internal a wire y asígnele un valor en un bloque de combinación separado.

    
respondido por el duskwuff

Lea otras preguntas en las etiquetas