verlilog simular un pin de puerto con pull up conmutable

0

Quiero simular dos pines avr en verilog conectados a un cable. Todos los avr pueden entrar y salir y también tienen la capacidad de cambiar su propia recuperación.

Encontré la forma típica de conectar los pines a un cable por algo como:

assign io_port  = direction ? a : 1'bz;

donde el pin puede seleccionar el estado de conducción.

Pero no tengo idea de cómo configurar el cable en estado alto, si una de las patillas no activa el cable, pero una o más de las patillas tienen el pull up habilitado. Creo que debería haber más que alto / bajo / triste / indefinido para el cable. Pero como sé, no hay nada como 'pullup'.

Como consecuencia, tengo que codificar todos los pines conectados a un cable con código propio. ¿Entonces la lógica debe implementarse manualmente y no se puede usar el cable como está?

Tengo el siguiente código que NO funciona, porque llamar varias veces a mi módulo de conexión resultará en "sobrescribir". las asignaciones en lugar de agregar entradas múltiples.

Como puede ver, siento que tengo un malentendido básico sobre cómo se pueden agregar varios cables o registros a un cable.

P1: Cómo lidiar con los múltiples registros / cables a una asignación de cable. Lo que hice es simplemente incorrecto. Pero, ¿cómo puedo "conectar" varios puertos a Mi cable sin escribir la tarea completa manualmente. Simplemente necesito una sugerencia de inicio sobre cómo lidiar con la posterior adición de registros a los cables. Tal vez mi ¿La idea de un cable es incorrecta?

P2: ¿Cómo es la forma estándar de agregar un pull_up para un dispositivo IO-pin.

Mi fuente, que falla debido a los problemas mencionados anteriormente, ya los conozco, pero no puedo resolverlos por mí mismo.

module connection ( input out, input in, input output_enable, input pull_up_enable, inout net, inout pullnet );
    assign pullnet = pull_up_enable ? 1'b1 : 1'bz;
    assign net = output_enable ? out : pullnet;
endmodule

module test4;

wire testwire;

// prepare net checking
initial
    $monitor( "State change for wire %b and pull %b", testwire, pullnet );

wire pullnet;

reg port1_out=0;
reg port1_in=0;
reg port1_output_enable=0;
reg port1_pull_up_enable=0;

reg port2_out=0;
reg port2_in=0;
reg port2_output_enable=0;
reg port2_pull_up_enable=0;

connection conn1( port1_out, port1_in, port1_output_enable, port1_pull_up_enable, testwire, pullnet );
connection conn2( port2_out, port2_in, port2_output_enable, port2_pull_up_enable, testwire, pullnet );

// testing the net
initial begin
    #1 port1_out=1;
    #1 $display("Set enable, expect 1");
    #1 port1_output_enable=1;
    #1 $display("Remove out, expect z");
    #1 port1_output_enable=0;
    #1 $display("set pull up, expect 1");
    #1 port1_pull_up_enable=1;
    #1 $display("unset pull up, expect z");
    #1 port1_pull_up_enable=0;
    #1 $display("-------------");

    // ok, now going with pull up from port 2 and IO from port 1
    #1 $display("set pull up, expect 1");
    #1 port2_pull_up_enable=1;

    #1 $display("set out enable, expect 0");
    #1 port1_out=0;
    #1 port1_output_enable=1;

    #1 $display("################## END ##############");
    
pregunta Klaus

1 respuesta

1

Ciertamente hay un pullup en Verilog

pullup(signal);

Esto provocará una fuerza de "extracción" 1 en la señal cuando no haya otros controladores en la red.

Otra forma es declarar signal como tri1 en lugar de un wire básico. Esto pone un pullup implícito en la red, pero debe tener cuidado al realizar conexiones de puertos de tipos de red diferentes. Consulte la tabla 23-1 en el LRM 1800-2012.

    
respondido por el dave_59

Lea otras preguntas en las etiquetas