¿por qué funciona esta lógica condicional?

-1

Estoy jugando con salidas para un LCD en mi FPGA. Cuando presiono el botón, quiero que muestre el número 6. En su lugar, muestra 6 constantemente, a menos que presione el botón de reinicio, momento en el que toda la pantalla se queda en blanco, lo que debería.

module LCD(CLOCK_50,LCD_DATA,LCD_RW,LCD_RS,LCD_EN,BUTTON);

input [2:0] BUTTON;

wire button;
wire button2;

assign button2 = ~BUTTON[2];

assign button = ~BUTTON[0];


input CLOCK_50;

output
LCD_RS,
LCD_RW,
LCD_EN;

output [7:0] LCD_DATA;
reg [7:0] D;
reg [1:0] Op, En;




////module clk_div_10(clk,reset,clk_out);

clk_div_10 clk(CLOCK_50,,clock);
wire clock;



 FPGA_2_LCD DUT1(clock,LCD_RS,LCD_RW,LCD_EN,LCD_DATA,
 ,D,Op,En,button2);

 always @(posedge clock or posedge button) 

 if (button == 1) begin

        D <= 8'b00110110;
        En <= 1'b1;
        Op <= 1'b1;
 end



endmodule
    
pregunta MathWannaBe456

3 respuestas

3
 always @(posedge clock or posedge button) 
 if (button == 1) begin

        D <= 8'b00110110;
        En <= 1'b1;
        Op <= 1'b1;
 end

Déjame ser tu FPGA. Permítame explicarle qué hardware me han dicho que tenga.

Ok, así que estamos encendidos, permite que el encendido reinicie todos nuestros registros.

Veamos ahora, está bien, tenemos un bloque sincronizado siempre aquí, eso significa que tengo algunos flip-flops. Ooo, también tengo un reinicio asíncrono llamado button que está activo alto, lo que el bloque siempre me dice que haga bajo esta condición de reinicio. Debido a que me han dicho qué hacer al reiniciar, también lo haré durante el reinicio de encendido - hmm, dice que para configurar D a 54, genial lo haré.

Ahora he terminado de encender y salí del reinicio, comencemos a ejecutar.

Ok, entonces viene el borde del reloj, ¿qué hago con el registro? Ok, el reinicio ( button ) no se afirma. Hmm, parece que la persona quiere que retenga mi valor. Gran ordenado.

Ahora button es alto. ¿Qué debo hacer? Ok, voy a restablecer mi registro a 54 de nuevo. Woop, hecho.

Ahora el usuario presionó mi reinicio global. Es hora de reconfigurar completamente. Todas las salidas a HIGH-Z! Arrrrrg. Me he quedado en blanco. ¿Qué hago?

Yay, han lanzado mi botón de reinicio global. Es hora de cargar mi memoria de nuevo.

...

Y de vuelta al principio.

TL;DR;

¿Puedes notar un patrón aquí? Nunca el valor de D se establece en otra cosa que no sea 54.

Una pista para la próxima vez, con toda seriedad. Las herramientas FPGA como Quartus que utilizará para su tablero DE0 tienen visores de lista de red RTL. Una vez que sintetice su diseño, puede cargar la lista de redes para ver una representación gráfica de lo que se ha deducido del hardware. Esto le dará rápidamente una idea de lo que está pasando.

    
respondido por el Tom Carpenter
0

Necesitas agregar una cosa más a tu sentencia if. Actualmente, cuando el botón se vuelve alto, se establece D. Pero D nunca se reinicia. Por lo tanto, siempre contendrá el valor establecido. Cuando el botón de inicio de FPGA es elevado por las resistencias de pull-up.

Además, cambiaría la instrucción siempre para que solo se dispare en el flanco ascendente del reloj. No hay necesidad de que el botón sea un reloj. El rebote del botón puede introducir meta estabilidad.

    
respondido por el user110971
0

Al analizar sus comentarios, menciona que está utilizando la placa DE0 de Altera.

A lo que se refiere este problema se debe a que esta placa tiene interruptores normalmente altos y usted la trata como si fuera baja.

Loqueelprogramadicees"configura la pantalla LCD para esto si el botón está alto". El botón siempre está alto a menos que se presione, por lo que aparece el número 6.
La manera segura de probar esto es mantener presionado el botón y luego reiniciar el dispositivo. Supongo que el número 6 no aparecerá hasta que sueltes el botón.

Cambiando su sentencia if desde:

if (button == 1) begin

a

if (button == 0) begin

resolverá su problema inmediato, sin embargo, lo que Tom y User110971 dicen que también es importante, su declaración necesita un "Else" allí.

    
respondido por el Doodle

Lea otras preguntas en las etiquetas