Problemas de simulación y diseño de compuertas de tres estados de FPGA verilog en compilación quartus y Modelsim

Introducción a la puerta de tres estados:

La puerta de tres estados incluye: estado de entrada, estado de salida y estado de alta impedancia. Definición de señal de tres estados: inout

En el diseño de FPGA, la entrada y salida de datos se usan a menudo. Cuando se transmiten datos con chips externos, a menudo se usan puertas de tres estados. Por ejemplo, la SDRAM que estoy aprendiendo ahora. Para ahorrar recursos de puerto, generalmente se usan algunos puertos de datos. Como entrada y salida, dicho puerto se denomina puerta de tres estados.

El puerto de datos dq del chip SDRAM es una puerta típica de tres estados. Cuando se realiza una operación de escritura, dq se usa como puerto de entrada; cuando se realiza una operación de lectura, dq se usa como puerto de salida; otras veces, está en un estado de alta impedancia. Al escribir la interfaz FPGA y SDRAM, se debe utilizar una señal dq de tres estados como señal conectada a la SDRAM.

Utilice un ejemplo para ilustrar de forma intuitiva: El
siguiente es un programa Verilog:

module tri_state(
		input				clk     ,
		input				rst_n   ,
		input				data	,
		input 				dout_en	,
		output reg			odata	,
		inout     			dout
		);
				
	assign dout = (dout_en==1)? data : 1'bz;
		
	always@(posedge clk or negedge rst_n)begin
		if(rst_n == 0)
			odata <= 0;
		else if(dout_en!=1)
			odata <= dout;
	end	
		
endmodule

La señal de tres estados es dout, su vista RTL:

Se puede ver que cuando dout_en es 1, dout emite datos de datos, cuando dout_en es 0, dout es de alta impedancia. En este momento, dout se puede usar como puerto de entrada. Cuando se usa como puerto de entrada, se genera automáticamente un búfer dentro de la FPGA como búfer de datos de entrada. .

Compilación de cuartos de puerta de tres estados y problemas de simulación de Modelim:

1. quartus compila la puerta de tres estados

Tome la interfaz SDRAM que se está escribiendo como ejemplo: el segmento de código relacionado con la señal de tres estados dq en el código Verilog es el siguiente (error):

     inout  reg [ 15: 0]   dq        ; //数据线
     output reg [ 15: 0]   rdate     ;

//dq信号输出,数据线
	 always@(posedge clk or negedge rst_n)begin
		  if(rst_n == 0)begin
				dq <= 16'hzzzz;
		  end
		  else if(wr_write_start || state_c==wr_write)
				dq <= wdata;
		  else 
				dq <= 16'hzzzz;
	 end  

     always@(posedge clk or negedge rst_n)begin
		  if(rst_n == 0)
				rdate <= 0;
			else if(state_c==rd_read || state_c==rd_pre)
				rdate <= dq;
	 end

En este momento, no se reportará ningún error al compilar en quartus, pero se reportará al compilar en Modelsim. La razón es que la señal de tres estados debe definirse como una señal de tipo cable, por lo que no se reportará ningún error al compilar en Modelsim. Según tengo entendido: de hecho, la señal de tres estados dq se puede definir como tipo cable o reg. Aunque el tipo reg no se compila en Modelsim, los resultados son los mismos cuando se descargan en la placa. Si está interesado, puede probarlo usted mismo. Pero, por defecto, configuramos la señal de tres estados en tipo de cable. El código modificado es el siguiente:


     inout         [  15: 0]    dq       ;
     reg           [  15: 0]	dq_t     ;

//dq信号输出,数据线
	 assign dq = dq_t;
	 always@(posedge clk or negedge rst_n)begin
		  if(rst_n == 0)begin
				dq_t <= 16'hzzzz;
		  end
		  else if(wr_write_start || state_c==wr_write)
				dq_t <= wdata;
		  else 
				dq_t <= 16'hzzzz;
	 end  

     always@(posedge clk or negedge rst_n)begin
		  if(rst_n == 0)
				rdate <= 0;
			else if(state_c==rd_read || state_c==rd_pre)
				rdate <= dq;
	 end

Lo principal es definir dq como tipo de cable, y luego definir una señal intermedia de tipo reg dq_t, que se asigna a dq.
2. Modelsim compila la puerta de tres estados

Al escribir un archivo de prueba, para señales de tipo inout, si escribe:

wire [15:0]  dq;
initial begin
	for(i=1 ;i<260;i=i+1)begin
			dq = (i==1)? 1:(dq+1'b1);
			#(clk_period);
	end	
end

Modelsim informará un error: Referencia ilegal a net "dq".
Dq es una puerta de tres estados y define el tipo de cable, pero cuando se le da el tipo de registro a los datos, definitivamente informará un error. Si se define como tipo de registro, como sigue:

reg [15:0]  dq;
initial begin
	for(i=1 ;i<260;i=i+1)begin
			dq = (i==1)? 1:(dq+1'b1);
			#(clk_period);
	end	
end

La compilación no reportará un error, pero habrá un error de inicio: # Error al cargar el diseño.

La señal de tres estados se procesa de esta manera (se usan otros códigos, se ve muy desordenado y usted comprende el significado): (agregue una señal intermedia de tipo reg, asigne a dq con asignar y use esta señal para la siguiente asignación)

parameter	WIDTH = 16;

wire	[WIDTH-1 : 0]	dq;

reg		            	tri_en;
reg		[WIDTH-1 : 0]	data_w;

assign  dq = (tri_en) ? data_w : 16'hzzzz;

module_1 u_module_1(
		
		);		
initial begin
	tri_en = 0;
	#(clk_period);
	tri_en = 1;
	data_w = 16'h1111;
	#(clk_period);
	tri_en = 0;
	
	data_w = ......
end

 

Por lo tanto, al escribir archivos de prueba para puertas de tres estados, debe cumplir con:

  1. La señal de tres estados es de tipo cable;
  2. Defina la señal intermedia de tipo reg asignada a la señal de tres estados;
  3. Cuando se requiere una señal de tres estados como terminal de entrada, use una señal intermedia para asignarla.

Finalmente, para resumir:

  • Escriba el código Verilog de la señal de tres estados en el proyecto para definir la señal de tres estados como tipo de cable;
  • La señal de tres estados en el archivo de prueba también se define como un tipo de cable, y la señal intermedia se usa para reemplazar la señal de tres estados para la entrada de asignación.

Por último, quisiera decir que la redacción de este artículo es muy desordenada, me siento muy incómodo, pero es bueno entender el significado, principalmente mira el resumen. El proceso de escritura de la interfaz SDRAM se compartirá más adelante.

Supongo que te gusta

Origin blog.csdn.net/qq_33231534/article/details/105129252
Recomendado
Clasificación