[Xilinx Vivado Timing Analysis/Constraints Series 11] Desenvolvimento FPGA Análise de Timing/Restrições-FPGA DDR-PLL Interface Método de Otimização de Restrições de Atraso de Entrada

contente

DDR-PLL em resumo

Operação real

engenharia prática

código de nível superior

Configuração de PLL

Adicionar restrições de relógio

Adicionar restrição de atraso de entrada

Adicionar caminho falso

Tempo de preparação

Tempo de espera

Restrição multiciclo

Solução

Configuração de PLL

problema encontrado

em tempo de construção

tempo de espera

Adicionar caminho falso

 Resumir

Séries anteriores de blogs


DDR-PLL em resumo

O modelo de temporização do DDR-Direct foi introduzido anteriormente, ou seja, o modelo de temporização comum sem PLL. Esta seção se concentra no modelo com PLL. Esses dois modelos de temporização também são introduzidos no modelo de amostragem SDR, portanto, haverá um modelo de temporização do PLL, e a função do PLL é a mesma.O clock pode ser deslocado, positivo ou negativo, correspondendo ao aumento e diminuição do atraso do clock.

Durante a análise, o atraso do caminho de dados do PCB padrão Td_bd e o atraso do caminho do relógio do PCB Tc_bd são consistentes, portanto, ao analisar os estados do relógio e dos dados que chegam aos pinos do FPGA, você só precisa conhecer os estados do relógio e dos dados dos pinos no dispositivo upstream , o relógio e os dados do FPGA podem ser restringidos e a relação de fase entre o relógio e os dados pode ser analisada.

A seguir está o diagrama de tempo, que é analisado em detalhes no DDR-Direct, então não vou apresentá-lo aqui.

Este modelo de temporização pode ser utilizado no caso de entrada com PLL e sem PLL.Com PLL, quando o deslocamento de fase do relógio de amostragem é positivo, é necessário caminho falso + restrição multiciclo, caso contrário o relatório de análise será incorreto.

Operação real

Desta vez, ainda tomamos como exemplo um manual de um dispositivo CMOS da Sony.

A frequência do clock é de 54Mhz, ou seja, o período é de 18,519ns e o meio período é de 9,259ns. Pode-se ver na tabela de parâmetros que o Max skew é de 2ns. Portanto, pode-se ver na figura que os dados quando a primeira borda descendente é usada como borda de amostragem é emitida pela borda ascendente anterior. a seta 1 na figura aponta para O momento é o valor mínimo do atraso de entrada e o momento da seta 2 é o valor máximo do atraso de entrada; da mesma forma, quando a primeira borda descendente é usada como borda de transmissão para transmitir dados , a próxima borda de subida é usada como borda de amostragem, e o atraso de entrada neste momento é Os valores máximo e mínimo são os tempos indicados pelas setas 3 e 4, respectivamente.

Deve-se notar aqui que, como o PLL é usado para mudar a fase do relógio, um novo relógio será gerado, portanto, mais operações devem ser realizadas na ferramenta de restrição de tempo para que a ferramenta de tempo possa identificá-lo corretamente, de modo que para não dar relatório de tempo incorreto.

engenharia prática

Ainda é um projeto experimental do DDR-Direct, e só precisa fazer uma pequena alteração no arquivo de nível superior.

código de nível superior

Comente ou exclua a primitiva IDELAY2 adicionada na seção anterior e instancie o PLL com rx_clk como entrada e rx_clk_90 como saída.

module top_ioddr(
    input wire        rx_clk,
    input wire        rx_ctrl,
    input wire    [3:0] rx_dat,
  //tx
    output  wire    tx_clk,
    output  wire [3:0]  tx_d,
    output  wire    tx_dv,
    input	wire 	sdrclk,
    input	wire 	[3:0]	sdrdata,
    input	wire 	sdrden,
    input	wire 	sysclk,
    output	reg 	tout 	
	);
wire RDY;
wire rst;
wire rx_clk_90;
wire rx_en;
wire [7:0] rx_data;

reg tx_en1,tx_en2;
reg [7:0] tx_data1,tx_data2;
wire	sdrclk1;
assign rst =0;
//assign rx_clk_90 = rx_clk;

 IDELAYCTRL IDELAYCTRL_inst (
.RDY(RDY),       // 1-bit output: Ready output
.REFCLK(sysclk), // 1-bit input: Reference clock input
.RST(1'b0)        // 1-bit input: Active high reset input
);


clk_wiz_0 clk_gen0
   (
    // Clock out ports
    .clk_out1(rx_clk_90),     // output clk_out1
   // Clock in ports
    .clk_in1(rx_clk));      // input clk_in1

assign sdrclk1 = sdrclk;

always @(posedge rx_clk_90 or posedge rst) begin
	if (rst == 1'b1) begin
		tx_data1 <= 'd0;
	end
	else if (rx_en == 1'b1) begin
		tx_data1 <= rx_data+ rx_data -1;
	end
end

always @(posedge rx_clk_90 or posedge rst) begin
	if (rst == 1'b1) begin
		tx_data2 <= 'd0;
	end
	else if (tx_en1 == 1'b1) begin
		tx_data2 <= tx_data1+ tx_data1 -5;
	end
end

always @(posedge rx_clk_90 ) begin
	tx_en1 <= rx_en;
end

always @(posedge rx_clk_90 ) begin
	tx_en2 <= tx_en1;
end

	iddr_ctrl inst_iddr_ctrl
		(
			.rx_clk_90 (rx_clk_90),
			.rst       (rst),
			.rx_dat    (rx_dat),
			.rx_ctrl   (rx_ctrl),
			.rx_en     (rx_en),
			.rx_data   (rx_data)
		);

	oddr_ctrl inst_oddr_ctrl
		(
			.sclk    (rx_clk_90),
			.tx_dat  (tx_data2),
			.tx_en   (tx_en2),
			.tx_c    (rx_clk_90),
			.tx_data (tx_d),
			.tx_dv   (tx_dv),
			.tx_clk  (tx_clk)
		);

//sdr clock domain

reg [3:0] sdrdata_r1,sdrdata_r2;
reg 	sdrden_r1,sdrden_r2;

always @(posedge sdrclk1 ) begin
	{sdrdata_r2,sdrdata_r1} <= {sdrdata_r1,sdrdata};
end
always @(posedge sdrclk1 ) begin
	{sdrden_r2,sdrden_r1} <= {sdrden_r1,sdrden};
end

always @(posedge sdrclk1) begin
	if(sdrden_r2 == 1'b1) begin
		tout <= (&sdrdata_r1)|(&sdrdata_r2);
	end
	else begin
		tout <= (^sdrdata_r2);
	end
end

endmodule

Configuração de PLL

Definir uma mudança de fase de 30° para a direita, que é 1/12 de um período, é cerca de 1,543ns.

Depois de posicionar e rotear o projeto, você pode abrir o projeto de roteamento e editar as restrições de tempo.

Adicionar restrições de relógio

Restringir rx_clk com um período de 18,518ns

Adicionar restrição de atraso de entrada

Quatro atrasos de entrada precisam ser restringidos, ou seja, Max e Min na borda ascendente e Max e Min na borda descendente.

Tome o Max da borda ascendente como exemplo, o máximo é 2ns

O Max da borda descendente é definido como 2ns e nenhuma substituição é verificada

Perceber! Ao restringir a borda descendente, deve-se verificar o parâmetro indicado pela seta na figura, indicando se esta restrição cobrirá a restrição anterior na borda ascendente, pois este experimento é amostragem de borda dupla DDR, as bordas ascendente e descendente são A borda de transmissão também é usada como borda de amostragem, portanto, ao definir a restrição de borda descendente, é necessário fazer a operação que não cobre a restrição anterior, mas o SDR anterior não precisa dela.

Um resumo das restrições de atraso de entrada é mostrado na figura

CTRL+S Salve o ponto e abra o arquivo de restrição XDC para ver as informações de restrição recém-adicionadas

create_clock -period 18.518 -name sdrclk -waveform {0.000 9.259} [get_ports sdrclk]
set_input_delay -clock [get_clocks rx_clk] -rise -max 2.000 [get_ports {rx_ctrl {rx_dat[0]} {rx_dat[1]} {rx_dat[2]} {rx_dat[3]}}]
set_input_delay -clock [get_clocks rx_clk] -rise -min -2.000 [get_ports {rx_ctrl {rx_dat[0]} {rx_dat[1]} {rx_dat[2]} {rx_dat[3]}}]
set_input_delay -clock [get_clocks rx_clk] -clock_fall -fall -max -add_delay 2.000 [get_ports {rx_ctrl {rx_dat[0]} {rx_dat[1]} {rx_dat[2]} {rx_dat[3]}}]
set_input_delay -clock [get_clocks rx_clk] -clock_fall -fall -min -add_delay -2.000 [get_ports {rx_ctrl {rx_dat[0]} {rx_dat[1]} {rx_dat[2]} {rx_dat[3]}}]

Como pode ser visto na figura abaixo, quando o caminho falso não está restrito ao tempo, a ferramenta de restrição colocará alguns caminhos desnecessários. Após restringir o conteúdo da tabela a seguir, não há necessidade de analisar o tempo de setup entre o borda ascendente e a borda ascendente Sim, não é necessário tempo de espera entre a borda ascendente e a borda descendente.

Adicionar caminho falso

Adicionar caminho falso definido em exceções em restrições de tempo

Tempo de preparação

Primeiro, faça um caminho falso para o tempo de configuração entre as duas bordas de subida. From é a borda de subida de rx_clk, e To é a borda de subida da saída do relógio pelo PLL.

A borda de queda é a mesma

E defina-o como a marca da borda ascendente nas opções

Tempo de espera

Em seguida, faça um caminho falso para o tempo de espera, From é a borda ascendente de rx_clk e To é a borda descendente da saída do relógio pelo PLL.

Outro From é a borda descendente de rx_clk e To é a borda ascendente da saída do relógio pelo PLL.

A marca definida para manter o tempo nas opções

Restrição multiciclo

Neste momento, alguns relatórios de temporização errôneos serão evitados, mas ainda existem alguns relatórios errôneos, como a análise do tempo de espera entre a borda de subida de rx_clk e a borda de subida da saída do relógio pelo PLL (entre L1r e C2r) . Neste momento, você precisa fazer outra restrição Multicycle constraint.

Da mesma forma, para adicionar Multicycle a Exceptions, você precisa deslocar a borda de subida do PLL para a esquerda em um, ou seja, deixar C2r se tornar C0r e defini-lo como -1.

A configuração para a borda descendente é a mesma. Não há muito a dizer.

As opções são definidas para manter o tempo.

Depois de salvar, você pode ver que existem arquivos de caminho falso e restrição de multiciclo no arquivo XDC

set_false_path -setup -rise_from [get_clocks rx_clk] -rise_to [get_clocks [get_clocks -of_objects [get_pins clk_gen0/inst/mmcm_adv_inst/CLKOUT0]]]
set_false_path -setup -fall_from [get_clocks rx_clk] -fall_to [get_clocks [get_clocks -of_objects [get_pins clk_gen0/inst/mmcm_adv_inst/CLKOUT0]]]
set_false_path -hold -rise_from [get_clocks rx_clk] -fall_to [get_clocks [get_clocks -of_objects [get_pins clk_gen0/inst/mmcm_adv_inst/CLKOUT0]]]
set_false_path -hold -fall_from [get_clocks rx_clk] -rise_to [get_clocks [get_clocks -of_objects [get_pins clk_gen0/inst/mmcm_adv_inst/CLKOUT0]]]
set_multicycle_path -hold -rise_from [get_clocks rx_clk] -rise_to [get_clocks [get_clocks -of_objects [get_pins clk_gen0/inst/mmcm_adv_inst/CLKOUT0]]] -1
set_multicycle_path -hold -fall_from [get_clocks rx_clk] -fall_to [get_clocks [get_clocks -of_objects [get_pins clk_gen0/inst/mmcm_adv_inst/CLKOUT0]]] -

Recarregue o relatório de tempo e você verá que o tempo foi violado. Observando o relatório de tempo, pode-se concluir que o relatório de tempo está correto. Somente quando o relatório de tempo está correto, faz sentido fazer restrições de tempo.Se o relatório de tempo estiver errado, então as restrições de tempo são inúteis. O relatório de tempo está correto, mesmo que seja uma violação, não é problemático para nós ajustá-lo. Portanto, aprender a obter ferramentas de tempo para relatar o tempo correto é mais importante do que saber como restringir!

tempo do relatório pode ver que há uma violação do tempo de espera

Solução

Agora que o relatório de tempo correto foi obtido, como corrigir o tempo pode ser obtido usando a função de deslocamento de fase do PLL. Como há uma violação do tempo de espera, isso significa que o atraso do relógio é muito grande. só precisa de fasear o PLL para a esquerda. Desloque 60° para restaurar o tempo ao normal.

Configuração de PLL

Clique duas vezes para abrir a interface de configuração PLL e altere a mudança de fase para -60

Re-layout, já que desta vez o PLL é deslocado de fase para a esquerda, o Flash Path e o Multiciclo definidos pelo PLL que acabou de ser deslocado para a direita são excluídos e, em seguida, recarregue e relate o tempo para visualizar o relatório de tempo.

problema encontrado

Neste momento, você pode ver que o tempo voltou ao normal. Mas algumas margens não são normais

em tempo de construção

A ascensão de Rx_clk à ascensão de PLL está errada

Queda de rx_clk para queda de PLL está errado

tempo de espera

Queda de rx_clk para ascensão de PLL está errado

A ascensão de Rx_clk à queda de PLL está errada

Adicionar caminho falso

O tempo de setup e hold time obtidos nestes quatro casos estão errados, então eles precisam ser eliminados por caminho falso.

Adicione quatro caminhos falsos

Além disso, não há necessidade de adicionar Multiciclo, pois ao usar PLL, Multiciclo precisa ser adicionado para deslocamento de fase à direita, mas não para deslocamento de fase à esquerda.

Reload pode ver que o tempo correto é dado e o tempo volta ao normal.

 Resumir

Como obter o relatório de tempo correto é mais importante do que como resolver a violação de tempo. Conhecer a raiz do problema pode resolver melhor o problema! Ao usar PLL para otimização de tempo, preste atenção se False Path e Multicycle precisam ser adicionados e como adicionar essas restrições.

Séries anteriores de blogs

 [Análise de temporização do Xilinx Vivado/série de restrições 1] Análise de temporização de desenvolvimento de FPGA/análise de temporização entre registros de restrições

 [Análise de Tempo/Restrições da Xilinx Vivado Série 2] Análise/Restrições de Tempo de Desenvolvimento de FPGA - Tempo de Configuração

 ​​​​​​[Análise de temporização do Xilinx Vivado/série de restrições 3] Análise de tempo de desenvolvimento de FPGA/tempo de retenção de restrições

 [Análise de Tempo/Restrições da Xilinx Vivado Série 4] FPGA Análise de Tempo de Desenvolvimento/Restrições-Operação Prática de Engenharia Experimental

 [Análise de temporização do Xilinx Vivado/série de restrições 5] Análise de temporização de desenvolvimento de FPGA/análise de temporização de restrição-IO

 [Análise de temporização do Xilinx Vivado/série de restrições 6] Análise de temporização de desenvolvimento de FPGA/atraso de entrada de temporização de restrição-IO

 [Xilinx Vivado Timing Analysis/Constraints Series 7] FPGA Development Timing Analysis/Restrições-FPGA Single-Edge Sampling Data Input Delay Timing Constraint Practice

 [Xilinx Vivado Timing Analysis/Constraints Series 8] FPGA Development Timing Analysis/Restrições-FPGA Data Intermediate Sampling, Edge Sampling PLL Timing Optimization Practice

 [Xilinx Vivado Análise de Tempo/Restrições Série 9] Desenvolvimento FPGA Análise de Tempo/Restrições-FPGA Atraso de Entrada de Dados de Borda Única Alinhamento de Bordas, Diferentes Modelos de Temporização Prática Prática

 [Xilinx Vivado Timing Analysis/Constraints Series 10] FPGA Development Timing Analysis/Restrições-FPGA DDR-Interface Direta Método de Otimização de Restrições de Atraso de Entrada

Acho que você gosta

Origin blog.csdn.net/m0_61298445/article/details/124086197
Recomendado
Clasificación