Entorno de programación VHDL
Lo siguiente es lo que recompilé con algunos cambios. Después de la simulación, el estado es correcto.
Debido a que la división de frecuencia ahora es diez elevado a la sexta potencia, las herramientas de simulación ordinarias tardarán mucho tiempo en realizar una simulación real. La imitación duró más de una hora. Posteriormente cambié el divisor de frecuencia a varias divisiones de frecuencia (solo modifiqué los siguientes parámetros) y obtuve que la función de estado era correcta, pero la salida no era 1S y 0.5S, pero este requisito debe escribirse según el programa, porque hay No hay problema. Será mejor que busques una placa de desarrollo.
Establezco varios modos de visualización en un estado y luego cambio el estado. Si hay un problema, debería ser el problema de la división de frecuencia frontal.
Por supuesto que no hay ningún requisito. Puede suponer que el reloj de entrada es 0,5 S y luego dividirlo por 2 para obtener 0,1 S, lo que se puede simplificar mucho. Envíame un mensaje si tienes alguna pregunta.
Agregué algunos comentarios al final del programa.
Biblioteca ieee
Usa IEEE.STD_logic_1164.all;
Usa IEEE. STD_LOGIC_ARITH. Todos;
Utiliza IEEE. STD_LOGIC_UNSIGNED todos;
La entidad Punggye es el puerto (
restablecer, ajustar, clk: en STD_logic;
y: fuera STD_logic_vector (de 9 a 0));
Fin;
El comportamiento del edificio de Maple Creek es
Recuento de señales: rango de números enteros de 0 a 6000 - contador en segundos Unidad
Señal; milisegundo 1, milisegundo 2: rango de enteros de 0 a 500; - división de frecuencia, segundos
Señal segundo1, segundo 2: STD_logic; -1,5 segundos
Recuento de señales clk: STD_logic - estado; reloj de activación de la máquina
Señal y_out: STD_logic_vector(9 hasta 0);
El estado del tipo es (s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11,
s12, s13, s14, s15, s16, s17, s18, s19, s20, s 21); - Generación de estados, generando los cambios requeridos en forma de máquina de estados. .
Estado de la señal: estado;
Iniciar
Proceso (CLK, reset)
Iniciar
Si RESET ='1 'luego cuenta lt=0; segundo 1 lt; ='0'; segundo2 lt='0';
Evento Elshef CLK y CLK='1 'luego
cuenta lt = cuenta 1; - milisegundos, ajustable al reloj deseado.
Si cuenta=6000, entonces
ms1lt;=ms1 1;
mslt=ms2 1;
Cuenta lt=0;
Finalizar si;
Si milisegundos 1 = 500 entonces-1 se puede ajustar al reloj que desee.
segundo 1 lt; = no segundo 1;
milisegundo 1 lt; = 0;
fin si
si milisegundo 2 = 250, entonces -0,5 s se pueden ajustar al reloj que desee.
segundo2 lt= no segundo2
Milisegundo lt=0
Finalizar si
Finalizar si
Finalizar el proceso;
Proceso (ajuste, reset) - ajuste de velocidad.
Iniciar
si (reset='1 ') luego countclk lt='0'; otro
Si ajustar='1 ', entonces countclk lt= segundo 1; finalizar si;
Si ajustar='0 ', entonces countclk lt= segundo2 finalizar si
Finalizar proceso; p>
Finalizar proceso;
Finalizar si p>
Proceso (reset) - transición de estado
Iniciar
if (reset='1) ') entonces
Estado lt= s0 otro
p>
si (flanco ascendente (reloj de conteo)) entonces
El estado del caso es p>
Cuando s0 = >; estado lt= s 1;
Cuando s 1 = gt; estado lt= s2
Cuando s2= >; /p>
Cuando s3 = >; estado lt= s4
Cuando s4= >; estado lt= s5
Cuando s5 = gt estado lt= s6
Cuando s6= >; estado lt= s7
Cuando s7 = >estado lt= s8
Cuando s8= >; Cuando s9 = gt estado lt= s 10;
Cuando s10 = >; estado lt = s 11
Cuando s 11 = gt; >
Cuando s12 = >estado lt = s 13;
p>
Cuando s13=>Estado lt= s 14;
Cuando s14=>Estado lt= s 15;
Cuando s15=>Estado lt= s 16;
Cuando s16= >estado lt= s 17;
Cuando s17 = >estado lt = s 18;
Cuando s18= >estado lt= s 19
Cuando s19= >estado lt= s20
Cuando s20 = gt estado lt= s 21;
Cuando S21= >; estado lt= S0
Fin de caso;
Fin si
Fin; /p>
Finalizar proceso;
Proceso (restablecer) -Salida de asignación de estado.
Iniciar
Si reset='1', entonces
y _ out lt="1111111111";
Otros
El estado del caso es
Cuando s0 = >;y_out lt="1111111111";
Cuando s 1 = gt;y_out lt="0111111111" ;
Cuando s2= >; y_out lt="0101111111";
Cuando s3= >; y_out lt="0101011111";
Cuando s4=>; "0101010111";
Cuando s5 = gty_out lt="0101010101";
Cuando s6=>; cuando _ out lt="1111111111"; s7= >y_out lt="1011111111";
Cuando s8= >; y_out lt="1010111111";
Cuando s9 = gty_out lt="1010101111 ";
Cuando s10 = >; y_out lt="1010101011";
Cuando s 11 = gt;y_out lt="1010101010";
Cuando s12= >y_out lt="1111111111";
Cuando s13= >y_out lt=" 0111111111";
Cuando s14= >y_out lt="0011111111";
Cuando s15= >y_out lt="0001111111";
Cuando s16= >y_out lt="0000111111";
Cuando s17= >y_out lt="0000011111" ;
Cuando s18= >y_out lt=" 0000001111";
Cuando s19 = >y_out lt="0000000111";
Cuando s20 = gty_out lt= "0000000011";
Cuando s21 => cuando;y_out lt="0000000001";
cuando otros = gty_out lt="ZZZZZZZZZZ
fin de caso;
finalizar si ;
y lt= y _ out
Finalizar el proceso;
Fin;