Problema Verilog en la placa Spartan 6

0

Estoy planeando hacer un generador de forma de onda usando una placa FPGA (spartan 6 de diychips), sin embargo, soy nuevo en verilog, así que estoy teniendo un pequeño problema. Creé una secuencia de onda sinusoidal usando MATLAB y la importé a mi código verilog. Aquí está el código que debería generar la secuencia de 7 bits:

module dac7bit(input M_CLOCK, output reg [6:0] DAC);
reg[8:0] counter;
reg clk = 0;
reg[4:0] i = 0;

always @(posedge M_CLOCK) begin
    counter <= counter+1;
    if(counter==320)begin
        clk <= ~clk;
        counter <= 0;
    end
end

always @(posedge clk) begin
    case(i)
        5'b00000 :DAC <= 7'b1000000;
        5'b00001 :DAC <= 7'b1001111 ;
        5'b00010 :DAC <= 7'b1011110 ;
        5'b00011 :DAC <= 7'b1101011 ;
        5'b00100 :DAC <= 7'b1110110 ;
        5'b00101 :DAC <= 7'b1111100 ;
        5'b00110 :DAC <= 7'b1111111 ;
        5'b00111 :DAC <= 7'b1111110 ;
        5'b01000 :DAC <= 7'b1111001 ;
        5'b01001 :DAC <= 7'b1110001 ;
        5'b01010 :DAC <= 7'b1100101 ;
        5'b01011 :DAC <= 7'b1010111 ;
        5'b01100 :DAC <= 7'b1001000 ;
        5'b01101 :DAC <= 7'b0110111 ;
        5'b01110 :DAC <= 7'b0101000 ;
        5'b01111 :DAC <= 7'b0011010 ;
        5'b10000 :DAC <= 7'b0001110 ;
        5'b10001 :DAC <= 7'b0000110 ;
        5'b10010 :DAC <= 7'b0000001 ;
        5'b10011 :DAC <= 7'b0000000 ;
        5'b10100 :DAC <= 7'b0000011 ;
        5'b10101 :DAC <= 7'b0001001 ;
        5'b10110 :DAC <= 7'b0010100 ;
        5'b10111 :DAC <= 7'b0100001 ;
        5'b11000 :DAC <= 7'b0110000;
        default: DAC <= 7'b0100000;
    endcase

i<=i+1;
    if(i==24) begin
        i<=0;
    end
end

endmodule

He creado un DAC de registro que he asignado en el archivo .ucf, utilizando esta hoja de datos. Luego, los pines se conectan al R2R DAC fuera de la placa mediante puentes. No estoy seguro de si esta es la forma de hacerlo (para asignar los pines), tuve esta idea de cómo se hizo esto para la placa de E / S enviada con la placa FPGA. Aquí está el archivo .ucf:

 # DAC
 NET    "DAC<6>" LOC = P104; 
 NET    "DAC<5>" LOC = P101; 
 NET    "DAC<4>" LOC = P99; 
 NET    "DAC<3>" LOC = P97; 
 NET    "DAC<2>" LOC = P94; 
 NET    "DAC<1>" LOC = P92; 
 NET    "DAC<0>" LOC = P87; 

 #====================================================
 # Clock signal 
 NET "M_CLOCK" LOC = P123;

Sin embargo, no pude probar nada, todos los pines estaban altos. Pensé que el problema podría estar en la generación de mi propia señal de reloj o en la sintaxis de case (), así que intenté asignar solo un valor de 7 bits al registro DAC en cada ciclo M_CLOCK. Aún así, nada ha cambiado. Por lo tanto, creo que el problema está en inicializar el registro DAC, asignarlo o asignarle valores; sin embargo, no puedo encontrar nada que pueda ayudar.

EDITAR:

El problema era mucho más trivial de lo que esperaba. Fue debido al software que estaba usando. Instalé Xilinx ISE en una máquina con Windows 8 y algunas de las características (como la producción de archivos .mcs de bits de trabajo que parecían) estaban dañadas. Una vez que llegué a la computadora de mi escuela que ejecuta una versión funcional de ISE, el código funcionó como se esperaba.

    

2 respuestas

3

Este es un código muy pobre. No tiene inicialización de reinicio. Su contador [...] no está definido y, por lo tanto, no aumenta. Entonces tu divisor por 320 no se ejecuta, y el clk no se genera.

Antes de comenzar a sondear cualquier cosa físicamente, realice un banco de pruebas simple y ejecute ISim (que es parte de Xilinx ISE) en su código. Verás todas las señales rojas. No se moleste en implementar el código hasta que vea todas las señales definidas y alternando sus ideas.

Algo como esto:

  

módulo test00;

     

// Entradas
  reg M_CLOCK;

     

// Salidas
  cable [6: 0] DAC;

     

// Crear una instancia de la unidad bajo prueba (UUT)
  dac7bit uut (         .M_CLOCK (M_CLOCK), .DAC (DAC));

     

inicio inicial // Inicializar entradas
  M_CLOCK = 0;

  // Wait 100 ns for global reset to finish       
     

# 100;                 // Añadir estímulo aquí

     

fin

     

siempre comienza

 #(100)   M_CLOCK = 1;
 #(100)  M_CLOCK = 0; 
     

fin

     

endmodule

    
respondido por el Ale..chenski
1

Estoy usando Altera, pero creo que se aplican pronunciples.

Al examinar su código, no creo que no funcione en hardware real porque está mal escrito o no tiene inicialización. Cuando se configura el FPGA, sus registros de todos modos se encenderán al menos en algún nivel lógico, y como no importa para su diseño, no debería haber ningún problema.

Parece que tienes un problema en otro lugar que no sea este código:

  1. comprobar la asignación de pines. ¿Lo hizo correctamente? ¿Las designaciones de los pines son aquellos dispositivos de entrada y salida a los que están conectados?
  2. verifique el reloj M_CLOCK - ¿está ahí en el pin P123?
  3. ¿Qué tipo de DAC está conectado? Su código funcionará correctamente con R2R DAC que no requiere reloj, pero no funcionará con ningún chip DAC en serie que requiera cambio de reloj y datos en él.
  

así que intenté simplemente asignar un valor de 7 bits al registro DAC en cada ciclo M_CLOCK. Aún así, nada ha cambiado.

Simplemente asigne un valor de 7 bits al DAC sin usar ningún reloj, redefiniendo el DAC como cable

module dac7bit(input M_CLOCK, output wire [6:0] DAC);
....
assign DAC[6:0] = 7'b1010101;

y vea si funcionará con DAC que tenga una salida de voltaje en su rango de salida que se vería como este valor asignado. Si no lo hace, entonces su código de contador no es un problema, su problema es la conducción de DAC.

Por cierto, sería bueno si se refiriera a la hoja de datos de la placa / dispositivo que está utilizando, como éste (por ejemplo) contiene una pantalla de 7 segmentos en la ubicación del pin en la que cree que se encuentra su DAC.

    
respondido por el Anonymous

Lea otras preguntas en las etiquetas