FPGAs desde cero

Cualquier cosa relacionada con estos dispositivos

FPGAs desde cero

Notapor biblioman » Jue Oct 12, 2017 9:38 pm

Hola amigos, llevaba tiempo queriendo dejar de ser un espectador de las FPGAs y pasar a la "acción" y aprender más sobre este apasionante mundo. Se puede decir que yo empiezo ahora con este tema por lo tanto más que un curso estructurado y organizado lo que voy a compartir con vosotros es el camino que voy a seguir en mi aprendizaje. Espero que os sea de utilidad, comenteis y hagáis críticas constructivas. Quiero agradecer a los usuarios que con sus aportaciones han contribuido a crear este tema. Un saludo y sin más os dejo el 1º vídeo.

Avatar de Usuario
biblioman
Usuario Nivel 10
 
Mensajes: 2027
Registrado: Vie Mar 20, 2009 5:58 pm

Re: FPGAs desde cero

Notapor biblioman » Dom Nov 12, 2017 1:21 pm

Hola tod@s, aquí tenéis una breve descripción personalizada de lo que es una FPGA y cual fue su origen.
Espero que os guste.
Un saludo
Avatar de Usuario
biblioman
Usuario Nivel 10
 
Mensajes: 2027
Registrado: Vie Mar 20, 2009 5:58 pm

Re: FPGAs desde cero

Notapor biblioman » Dom Nov 12, 2017 1:23 pm

Hola tod@s, aquí teneis el "Hola mundo" con mi kit de FPGAs espero que os guste.
Un saludo
Avatar de Usuario
biblioman
Usuario Nivel 10
 
Mensajes: 2027
Registrado: Vie Mar 20, 2009 5:58 pm

Re: FPGAs desde cero

Notapor biblioman » Dom Nov 12, 2017 1:32 pm

Hola tod@s, aquí tenéis un nuevo video de la serie FPGAs desde cero. En este video se muestran varias cosas:
- VHDL Vs Verilog
- Empezando a programar las FPGAs con Verilog.
- Creación de un ejemplo (Multiplexor 2x1) en Verilog paso a paso implementado en los tres tipos de descripción hardware posibles (Estructural, Funcional y Procedimental).
- Como programar la FPGA a través de la memoria flash para evitar tener que programarla de nuevo si hay un corte en la alimentación.



Código fuente del ejemplo:
Código: Seleccionar todo

//DESCRIPCIÓN ESTRUCTURAL
module multiplexor2x1(a,b,s,y);
   
    input wire a,b,s;
   output wire y;
   wire  not1o, and1o, and2o;
     
     not not1(not1o, s);
     and and1 (and1o, a, not1o);
     and  and2 (and2o, b,s);
     or or1 (y,and1o,and2o);

endmodule

//DESCRIPCIÓN FUNCIONAL

module multiplexor2x1(a,b,s,y);
   
    input wire a,b,s;
    output wire y;
   
    assign y = ~s & a | s & b;

endmodule

//DESCRIPCIÓN PROCEDIMENTAL

module multiplexor2x1(a,b,s,y);
   
    input a, b;
    input wire s;
    output reg y;
   
    always @(*)
    if(s == 0)
       y=a;
     else
       y = b;

endmodule




Espero que el video a pesar de su duración os sea de utilidad y os guste.
Un saludo
Avatar de Usuario
biblioman
Usuario Nivel 10
 
Mensajes: 2027
Registrado: Vie Mar 20, 2009 5:58 pm

Re: FPGAs desde cero

Notapor biblioman » Dom Dic 10, 2017 1:18 pm

Hola a tod@s. Aquí tenéis otra forma de crear circuitos digitales sin necesidad de utilizar ni una sola línea de código, utilizando la herramienta de creación de esquemáticos que incorpora el IDE ISE de Xilinx.



Un saludo
Avatar de Usuario
biblioman
Usuario Nivel 10
 
Mensajes: 2027
Registrado: Vie Mar 20, 2009 5:58 pm

Re: FPGAs desde cero

Notapor biblioman » Dom Dic 10, 2017 1:45 pm

Hola a tod@s aquí tenéis otra entrega de como programar las FPGAs desde cero, en esta ocasión el video trata de como implemetar un diseño jerárquico en la creación de nuestros circuitos y también como utilizar la herramienta PlanAhead para conectar de forma visual los pines físicos de la FPGA con las entradas y salidas de nuestro circuito. Espero que os guste..


Un saludo
Avatar de Usuario
biblioman
Usuario Nivel 10
 
Mensajes: 2027
Registrado: Vie Mar 20, 2009 5:58 pm

Re: FPGAs desde cero

Notapor biblioman » Dom Dic 10, 2017 1:51 pm

Hola a tod@s. Aquí tenéis un video más de la programación de las FPGAs con verilog y el IDE ISE de Xilinx. En está ocasión un ejemplo de como implementar un sencillo decodificador binario a decimal y su posterior visualización en un display de 7 segmentos. En el vídeo también se muestra vomo añadir parametros de simulación con ISin Simulator.
Espero que os guste.



Código fuente:

Código: Seleccionar todo
module Decodificador_7_segmentos(
input wire [2:0] bin,
output reg [6:0] sseg // salida activa a nivel alto
);
always @*
 case (bin)
 
  3'b000: sseg[6:0]=7'b1111110; //0
  3'b001: sseg[6:0]=7'b0110000; //1
  3'b010: sseg[6:0]=7'b1101101; //2
  3'b011: sseg[6:0]=7'b1111001; //3
  3'b100: sseg[6:0]=7'b0110011; //4
  3'b101: sseg[6:0]=7'b1011011; //5
  3'b110: sseg[6:0]=7'b1011111; //6
  3'b111: sseg[6:0]=7'b1110000; //7
 
  default: sseg[6:0] = 7'b0000000; //4 'hf
  endcase

endmodule



Un saludo
Avatar de Usuario
biblioman
Usuario Nivel 10
 
Mensajes: 2027
Registrado: Vie Mar 20, 2009 5:58 pm

Re: FPGAs desde cero

Notapor biblioman » Dom Dic 10, 2017 1:53 pm

FPGAs desde cero (8).: Contador BCD HEX 7 segmentos



Código fuente:

Código: Seleccionar todo
//FPGA XC3S500 -->Frecuencia 50 MHz -->T=20ns

module contador_BCD_HEX(clk,clr,sseg);

  input clk, clr;
  output reg [6:0] sseg;

 //Variables internas
  reg [3:0] aux;
  reg [31:0] counter;
  reg clk2;
 
 //Contador para generar la segunda señal de reloj con un periodo mayor 
 always@(posedge clk, negedge clr)
   begin
      if(clr==0)
      begin
         counter <= 0;
         clk2 <= 0;
   end
     else if (counter == 12500000)
    
    begin
         counter <= 0;
         clk2 <= ~clk2;
      end
      else
         counter <= counter + 32'd1;
   end
 
  //2º Contador para incrementar el valor del display 7S
  always @(posedge clk2,  negedge clr)
  begin
    if(clr == 0)
       aux <= 0;
    else
       aux <= aux+1;
   end
 
  //Representación del valor del contador en el display 7S
  always @(posedge clk)

  case (aux)
                         //abcdefg
    4'b0000:  sseg[6:0]<=7'b1111110; //0
    4'b0001:  sseg[6:0]<=7'b0110000; //1
    4'b0010:  sseg[6:0]<=7'b1101101; //2
    4'b0011:  sseg[6:0]<=7'b1111001; //3
    4'b0100:  sseg[6:0]<=7'b0110011; //4
    4'b0101:  sseg[6:0]<=7'b1011011; //5
    4'b0110:  sseg[6:0]<=7'b1011111; //6
    4'b0111:  sseg[6:0]<=7'b1110000; //7
    4'b1000:  sseg[6:0]<=7'b1111111; //8
    4'b1001:  sseg[6:0]<=7'b1111011; //9
    4'b1010:  sseg[6:0]<=7'b1110111; //A
    4'b1011:  sseg[6:0]<=7'b0011111; //B
    4'b1100:  sseg[6:0]<=7'b1001110; //C
    4'b1101:  sseg[6:0]<=7'b0111101; //D
    4'b1110:  sseg[6:0]<=7'b1001111; //E
    4'b1111:  sseg[6:0]<=7'b1000111; //F

    default:  sseg[6:0]<=7'b0000000;
   
  endcase

endmodule
Avatar de Usuario
biblioman
Usuario Nivel 10
 
Mensajes: 2027
Registrado: Vie Mar 20, 2009 5:58 pm

Re: FPGAs desde cero

Notapor biblioman » Sab Dic 16, 2017 9:29 am

FPGAs desde cero (9).: Driver para LCD 16x2



Código fuente:

LCD_Controller
Código: Seleccionar todo
module LCD_Controller (//Host Side
                        iDATA,iRS,
                        iStart,oDone,
                        iCLK,iRST_N,
                        //LCD Interface
                        LCD_DATA,
                        LCD_RW,
                        LCD_EN,
                        LCD_RS,
                        LCD_N,
                        LCD_P);
//CLK
parameter CLK_Divide = 16;

//Host Side
input [7:0] iDATA;
input       iRS,iStart;
input       iCLK,iRST_N;
output reg  oDone;
//LCD Interface
output [7:0] LCD_DATA;
output reg   LCD_EN;
output       LCD_RW;
output       LCD_RS;
output       LCD_N;
output       LCD_P;
//Internal Register
reg [4:0]    Cont;
reg [1:0]    ST;
reg preStart,mStart;

/////////////////////////////////////////////
// Only write to LCD, bypass iRS to LCD_RS
assign LCD_DATA= iDATA;
assign LCD_RW= 1'b0;
assign LCD_RS= iRS;
assign LCD_N= 1'b0;
assign LCD_P= 1'b1;

/////////////////////////////////////////////

always@(posedge iCLK or negedge iRST_N)
begin
    if(!iRST_N)
    begin
        oDone   <= 1'b0;
        LCD_EN  <= 1'b0;
        preStart<= 1'b0;
        mStart  <= 1'b0;
        Cont    <= 0;
        ST      <= 0;
    end
    else
    begin
        ////// Input Start Detect ///////
        preStart <= iStart;
        if({preStart,iStart}==2'b01)  // latch ?
        begin
            mStart   <=    1'b1;
            oDone    <=    1'b0;
        end
        //////////////////////////////////
        if(mStart)  //generate LCD_EN
        begin
            case(ST)
            0:    ST <= 1; //Wait Setup, tAS >= 40ns
            1:    begin
                    LCD_EN <= 1'b1;
                    ST     <= 2;
                end
            2:    begin                   
                    if(Cont<CLK_Divide)
                    Cont  <= Cont+1;
                    else
                    ST    <= 3;
                end
            3:    begin
                    LCD_EN  <=    1'b0;
                    mStart  <=    1'b0;
                    oDone   <=    1'b1;
                    Cont    <=    0;
                    ST      <=    0;
                end
            endcase
        end
    end
end

endmodule


Reset_Delay
Código: Seleccionar todo
module    Reset_Delay(iCLK,oRESET);
input        iCLK;
output reg    oRESET;
reg    [19:0]    Cont;

always@(posedge iCLK)
begin
    if(Cont!=20'hFFFFF)   //21ms
    begin
        Cont    <=    Cont+1;
        oRESET    <=    1'b0;
    end
    else
    oRESET    <=    1'b1;
end

endmodule


LCD_TEST
Código: Seleccionar todo
module    LCD_TEST ( //Host Side
                    iCLK,iRST_N,
                    //LCD Side
                    LCD_DATA,LCD_RW,LCD_EN,LCD_RS,LCD_N,LCD_P);
//Host Side
input  iCLK,iRST_N;

//LCD Side
output [7:0] LCD_DATA;
output LCD_RW,LCD_EN,LCD_RS,LCD_N,LCD_P;

//Internal Wires/Registers
reg [5:0]  LUT_INDEX;
reg [8:0]  LUT_DATA;
reg [5:0]  mLCD_ST;
reg [17:0] mDLY;
reg        mLCD_Start;
reg [7:0]  mLCD_DATA;
reg        mLCD_RS;
wire       mLCD_Done;

parameter    LCD_INTIAL  = 0;
parameter    LCD_LINE1   = 5;
parameter    LCD_CH_LINE = LCD_LINE1+16;
parameter    LCD_LINE2   = LCD_LINE1+16+1;
parameter    LUT_SIZE    = LCD_LINE1+32+1;

always@(posedge iCLK or negedge iRST_N)
begin
    if(!iRST_N)
    begin
        LUT_INDEX  <= 0;
        mLCD_ST    <= 0;
        mDLY       <= 0;
        mLCD_Start <= 0;
        mLCD_DATA  <= 0;
        mLCD_RS    <= 0;
    end
    else
    begin
        if(LUT_INDEX<LUT_SIZE)
        begin
            case(mLCD_ST)
            0:    begin
                    mLCD_DATA  <= LUT_DATA[7:0];
                    mLCD_RS    <= LUT_DATA[8];
                    mLCD_Start <= 1;
                    mLCD_ST    <= 1;
                end
            1:    begin
                    if(mLCD_Done)
                    begin
                    mLCD_Start <= 0;
                    mLCD_ST    <= 2;                   
                    end
                end
            2:    begin
                    if(mDLY<18'h3FFFE) // 5.2ms
                    mDLY <= mDLY+1;
                    else
                    begin
                       mDLY    <= 0;
                       mLCD_ST <= 3;
                    end
                end
            3:    begin
                    LUT_INDEX  <= LUT_INDEX+1;
                    mLCD_ST    <= 0;
                end
            endcase
        end
    end
end

always
begin
    case(LUT_INDEX)
    //Initial
    LCD_INTIAL+0:    LUT_DATA    <=    9'h038; //Fun set
    LCD_INTIAL+1:    LUT_DATA    <=    9'h00C; //dis on
    LCD_INTIAL+2:    LUT_DATA    <=    9'h001; //clr dis
    LCD_INTIAL+3:    LUT_DATA    <=    9'h006; //Ent mode
    LCD_INTIAL+4:    LUT_DATA    <=    9'h080; //set ddram address
    //Line 1
    LCD_LINE1+0:     LUT_DATA    <=    9'h166; // f
    LCD_LINE1+1:     LUT_DATA    <=    9'h170; // p
    LCD_LINE1+2:     LUT_DATA    <=    9'h167; // g
    LCD_LINE1+3:     LUT_DATA    <=    9'h161; // a
    LCD_LINE1+4:     LUT_DATA    <=    9'h173; // s
    LCD_LINE1+5:     LUT_DATA    <=    9'h120; //
    LCD_LINE1+6:     LUT_DATA    <=    9'h164; // d
    LCD_LINE1+7:     LUT_DATA    <=    9'h165; // e
    LCD_LINE1+8:     LUT_DATA    <=    9'h173; // s
    LCD_LINE1+9:     LUT_DATA    <=    9'h164; // d
    LCD_LINE1+10:    LUT_DATA    <=    9'h165; // e
    LCD_LINE1+11:    LUT_DATA    <=    9'h120; //
    LCD_LINE1+12:    LUT_DATA    <=    9'h163; // c
    LCD_LINE1+13:    LUT_DATA    <=    9'h165; // e
    LCD_LINE1+14:    LUT_DATA    <=    9'h172; // r
    LCD_LINE1+15:    LUT_DATA    <=    9'h16F; // o
    //Change Line
    LCD_CH_LINE:     LUT_DATA    <=    9'h0C0;
    //Line 2
    LCD_LINE2+0:     LUT_DATA    <=    9'h161; // a
    LCD_LINE2+1:     LUT_DATA    <=    9'h171; // q
    LCD_LINE2+2:     LUT_DATA    <=    9'h175; // u
    LCD_LINE2+3:     LUT_DATA    <=    9'h169; // i
    LCD_LINE2+4:     LUT_DATA    <=    9'h168; // h
    LCD_LINE2+5:     LUT_DATA    <=    9'h161; // a
    LCD_LINE2+6:     LUT_DATA    <=    9'h179; // y
    LCD_LINE2+7:     LUT_DATA    <=    9'h161; // a
    LCD_LINE2+8:     LUT_DATA    <=    9'h170; // p
    LCD_LINE2+9:     LUT_DATA    <=    9'h175; // u
    LCD_LINE2+10:    LUT_DATA    <=    9'h16E; // n
    LCD_LINE2+11:    LUT_DATA    <=    9'h174; // t
    LCD_LINE2+12:    LUT_DATA    <=    9'h165; // e
    LCD_LINE2+13:    LUT_DATA    <=    9'h173; // s
    LCD_LINE2+14:    LUT_DATA    <=    9'h120;
    LCD_LINE2+15:    LUT_DATA    <=    9'h120;
    default:         LUT_DATA    <=    9'h000;
    endcase
end

LCD_Controller u0 ( //Host Side
                   .iDATA(mLCD_DATA),
                   .iRS(mLCD_RS),
                   .iStart(mLCD_Start),
                   .oDone(mLCD_Done),
                   .iCLK(iCLK),
                   .iRST_N(iRST_N),
                   //LCD Interface
                   .LCD_DATA(LCD_DATA),
                   .LCD_RW(LCD_RW),
                   .LCD_EN(LCD_EN),
                   .LCD_RS(LCD_RS),
                   .LCD_N(LCD_N),                            
        .LCD_P(LCD_P));

endmodule

LCD_top
Código: Seleccionar todo
module LCD_top(
                CLOCK_50,  //50 MZ
                 LCD_ON,   //LCD Power ON/OFF
                 LCD_BLON, //LCD Back Light ON/OFF
                 LCD_RW,   //LCD Read/Write Select, 0 = Write, 1 = Read
                 LCD_EN,   //LCD Enable
                 LCD_RS,   //LCD Command/Data Select, 0 = Command, 1 = Data
                 LCD_DATA, //LCD Data bus 8 bits
                 LCD_N,    //Negativo Diodo Back Light
                 LCD_P     //Positivo Diodo Back Light
               );
               
input CLOCK_50;       //50 MHz
inout [7:0] LCD_DATA; //LCD Data bus 8 bits
output LCD_ON;        //LCD Power ON/OFF
output LCD_BLON;      //LCD Back Light ON/OFF
output LCD_RW;        //LCD Read/Write Select, 0 = Write, 1 = Read
output LCD_EN;        //LCD Enable
output LCD_RS;        //LCD Command/Data Select, 0 = Command, 1 = Data
output LCD_N;         //Negativo Diodo Back Light
output LCD_P;         //Positivo Diodo Back Light

//LCD ON
assign LCD_ON =   1'b1;
assign LCD_BLON = 1'b1;
//Back Light ON

wire DLY_RST;

Reset_Delay r0 ( .iCLK(CLOCK_50),.oRESET(DLY_RST)    );

LCD_TEST u5 (//Host Side
             .iCLK(CLOCK_50),
             .iRST_N(DLY_RST),
             //    LCD Side
             .LCD_DATA(LCD_DATA),
             .LCD_RW(LCD_RW),
             .LCD_EN(LCD_EN),
             .LCD_RS(LCD_RS),   
        .LCD_N(LCD_N),                            
        .LCD_P(LCD_P)
             );

endmodule


conexiones.ucf

Código: Seleccionar todo
NET "CLOCK_50"      LOC = P184 ;
NET "LCD_RS"        LOC = "p36" ;
NET "LCD_RW"        LOC = "p40" ;
NET "LCD_EN"        LOC = "p39" ;
NET "LCD_DATA[0]"   LOC = "p42" ;
NET "LCD_DATA[1]"   LOC = "p41" ;
NET "LCD_DATA[2]"   LOC = "p47" ;
NET "LCD_DATA[3]"   LOC = "p45" ;
NET "LCD_DATA[4]"   LOC = "p49" ;
NET "LCD_DATA[5]"   LOC = "p48" ;
NET "LCD_DATA[6]"   LOC = "p55" ;
NET "LCD_DATA[7]"   LOC = "p50" ;
NET "LCD_N"         LOC = "p60" ;
NET "LCD_P"         LOC = "p61" ;
Avatar de Usuario
biblioman
Usuario Nivel 10
 
Mensajes: 2027
Registrado: Vie Mar 20, 2009 5:58 pm

Re: FPGAs desde cero

Notapor biblioman » Dom Ene 21, 2018 12:18 pm

INSTANCIAS y TIMERS


Código fuente:

Led1_module.v
Código: Seleccionar todo
/**
 * Archivo nombre: led1_module.v
 * T=500ms
 */
 
module led1_module
(
    clr, clk,clk2
);

    input clk;
    input clr;
    output reg clk2;
   
    parameter T500MS = 12500000; //250ms a ON
    reg [31:0] counter;
 
   
   always@(posedge clk or negedge clr)
   begin
      if(clr==0)
       begin
         counter <= 0;
         clk2 <= 0;
       end
     else if (counter == T500MS)
    
    begin
         counter <= 0;
         clk2 <= ~clk2;
      end
      else
         counter <= counter + 32'd1;
   end
endmodule


led2_module.v
Código: Seleccionar todo
/**
 * File name: led2_module.v
 * T=250ms
 */
 
module led2_module
(
    clr, clk,clk2
);

    input clk;
    input clr;
    output reg clk2;
   
    parameter T250MS = 6250000; //125ms a ON
    reg [31:0] counter;
 
   
   always@(posedge clk or negedge clr)
   begin
      if(clr==0)
       begin
         counter <= 0;
         clk2 <= 0;
       end
     else if (counter == T250MS)
    
    begin
         counter <= 0;
         clk2 <= ~clk2;
      end
      else
         counter <= counter + 32'd1;
   end
endmodule


led3_module.v
Código: Seleccionar todo
/**
 * File name: led3_mocule.v
 *
 */
 
module led3_module
(
    clk, led_out
);

    input clk;
    output led_out;
   
    parameter T10MS = 25'd20_000_000;
   
    reg [24:0] count;
   
    always @(posedge clk)
       
        if (count == T10MS)
            count <= 25'd0;
        else
            count <= count + 1'b1;
           
    reg rled_out;

    always @(posedge clk)
       
        if (count >= 25'd15_000_000 && count < 25'd20_000_000)
            rled_out <= 1'b1;
        else
            rled_out <= 1'b0;
           
    assign led_out = rled_out;

endmodule


top_module.v
Código: Seleccionar todo
/*
 * Archivo nombre: top_module.v
 * Función: leds parpadeando a diferentes intervalos: 1s, 0.5s y 250ms
 *       
 */
 
module top_module
(
    CLOCK_50, RST,LED
);

    input CLOCK_50;
    input RST;
    output wire[0:2]LED;
   
   
    led0_module U0
    (
        .clk (CLOCK_50),
        .clr (RST),
        .clk2 (LED[0])
    );
    led1_module U1
    (
        .clk (CLOCK_50),
        .clr (RST),
        .clk2 (LED[1])
    );
    led2_module U2
    (
        .clk (CLOCK_50),
        .clr (RST),
        .clk2 (LED[2])
    );
   
endmodule
Avatar de Usuario
biblioman
Usuario Nivel 10
 
Mensajes: 2027
Registrado: Vie Mar 20, 2009 5:58 pm


Volver a FPGAs & CPLDs

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron