Leer en verilog de un bus spi en modo estatico

Diseño HDL con este lenguaje. Módulos y testbenchs. Estilos y trucos de codificación, etc. NOTA: dado que hay entornos como ISE que soportan Verilog pero no SystemVerilog, señalad dentro de un post que de lo que se va a tratar es SystemVerilog si es el caso.
Responder
ukamak
Veroboard
Mensajes: 2
Registrado: 12 Feb 2019, 20:54

Leer en verilog de un bus spi en modo estatico

Mensaje por ukamak » 12 Feb 2019, 21:08

Buenas, soy muy novato en verilog.

Estoy intentando leer de un bus SPI en modo estatico , es decir solo usando su CLK , CS ,MISO , MOSI.
Si uso "always @(posedge sclk) " puedo leer los bytes que se reciben.
El problema lo tengo cuando CS==1 , ahi deberia resetear los contadores y no recibir nada pero si uso "always @(posedge sclk , posedge cs)" se vuelve todo loco , sera porque los flipflops solo tienen una entrada de clk o no se.

Es con vivado para una placa cora Z7 que usa un Zynq-7000

Código: Seleccionar todo

//always @(posedge sclk , posedge cs)   //
  always @(posedge sclk)                       //
  begin
         if(cs == 1'd0) begin                                  // CS ==0 leemos del bus usando su clk
           si_reg <= {si_reg[6:0],sio[0]};
           so_reg <= {so_reg[6:0],sio[1]};
           if (spi_count == 3'd7) begin
                spi_count <=  3'd0;
 		reg_spi_rec_flg1 <= 1'd1;
           end else begin 
                spi_count <= spi_count + 3'd1;
                reg_spi_rec_flg1 <= 1'd0;
           end
         end else begin                                    // CS !=0  reset contadores y no leeemos
               spi_count <=  3'd0;
               si_reg <=  8'd0;
               so_reg <=  8'd0;
               reg_spi_rec_flg1 <= 1'd0;
         end      
  end // always @(posedge sclk) 

jotego
Veroboard
Mensajes: 4
Registrado: 18 Oct 2018, 13:21

Re: Leer en verilog de un bus spi en modo estatico

Mensaje por jotego » 03 Mar 2019, 19:42

Perdona que no viera este mensaje antes.

En general usar dos flancos en el always no es buena idea. Aunque todo depende de la tecnología de FPGA que se use. De todas formas, a lo mejor tu problema es otro y se manifiesta así por casualidad. Quizá tu problema sea que estás registrando las señales con SCLK pero luego las lees en otro sitio con otro reloj y hay un fallo de sincronización.

Si no estás simulando el código, hazlo y mira las formas de onda. Puedes usar el simulador del fabricante FPGA o alguno de código abierto como iVerilog.

Por cierto, es buena praxis poner el reset como el primer if dentro del always.

ukamak
Veroboard
Mensajes: 2
Registrado: 12 Feb 2019, 20:54

Re: Leer en verilog de un bus spi en modo estatico

Mensaje por ukamak » 11 Mar 2019, 13:45

Gracias por tu respuesta.

Lo primero que debe saber un novato como yo es que verilog se parece al C pero no tiene nada que ver :)
Aunque desde lel puunto de vista de un programa en C parezcan validas no todas las combinaciones lo son:

Por ejemplo como bien dices en un
always @(posedge sclk)
if
-- aqui tiene que ir la parte asincrona
else
-- aqui tiene que ir la parte sincrona
Aunque seguramente depende de la herramienta usada.

Estoy usando una placa cora Z7 en vivado.
Aun ando con el tema, aprendiendo poco a poco.

Responder

Volver a “Verilog / SystemVerilog”