Problema crítico
Ao executar várias reinicializações dos dispositivos JESD204B IP RTL implementados em Intel® Arria® 10, Stratix® V, Arria® V ou Cyclone® V, você poderá observar pinos de interrupção (jesd204_tx_int e/ou jesd204_rx_int) sendo afirmados devido a erros(s), que podem ser lidos a partir do tx_err (0x60)), rx_err0 (0x60), e rx_err1 (0x64) registros.
Para Intel Arria 10 dispositivos, use o exemplo Nios® II de design do processador.
Para Stratix V, Arria V ou Cyclone V, execute as seguintes modificações no RTL:
- Modifique o módulo de jesd204b_ed no arquivo jesd204b_ed.sv.
Defina fios de reinicialização alta ativos:
fio tx_link_rst_sync;
fio tx_frame_rst_sync;
fio rx_link_rst_sync;
fio rx_frame_rst_sync;
fio global_rst_sync;
Modifique a polaridade de reinicialização nas seguintes atribuições de fio:
Mantenha o núcleo no modo de reinicialização até que o transceptor esteja pronto
atribuir global_rst_n_sync = ~global_rst_sync; Adicionar global_rst_n_sync atribuição
atribuir tx_avs_rst_n = avs_rst_n;
atribuir rx_avs_rst_n = avs_rst_n;
atribuir tx_frame_rst_n = ~tx_frame_rst_sync;
atribuir rx_frame_rst_n = ~rx_frame_rst_sync;
atribuir tx_link_rst_n = ~tx_link_rst_sync;
atribuir rx_link_rst_n = ~rx_link_rst_sync;
altera_reset_controller é um sincronizador ativo de alta reinicialização. Modifique a entrada e a saída das instações do sincronizador de reset de acordo para refletir a polaridade correta:
//
Redefinir os sincronizadores para reinicialização global (domínio do clock mgmt)
//
altera_reset_controller #(
. NUM_RESET_INPUTS (1),
. OUTPUT_RESET_SYNC_EDGES ("desaassert"),
. SYNC_DEPTH (2)
) u_avs_rst_sync (
.reset_in0 (~global_rst_n),
.clk (mgmt_clk),
.reset_out (global_rst_sync)
);
Execute bitwise AND on wire_tx_ready & wire_rx_ready, que são sinais de barramento.
//
Redefinir os sincronizadores para redefinição de camada de transporte (domínio do clock de quadros)
//
altera_reset_controller #(
. NUM_RESET_INPUTS (1),
. OUTPUT_RESET_SYNC_EDGES ("desaassert"),
. SYNC_DEPTH (2)
) u_tx_frame_rst_sync (
.reset_in0 (~(wire_frame_rst_n & wire_tx_ready)),
.clk (frame_clk),
.reset_out (tx_frame_rst_n_sync)
);
altera_reset_controller #(
. NUM_RESET_INPUTS (1),
. OUTPUT_RESET_SYNC_EDGES ("desaassert"),
. SYNC_DEPTH (2)
) u_rx_frame_rst_sync (
.reset_in0 (~(wire_frame_rst_n & wire_rx_ready)),
.clk (frame_clk),
.reset_out (rx_frame_rst_n_sync)
);
//
Redefinir os sincronizadores para reinicialização básica do núcleo (domínio do clock do link)
//
altera_reset_controller #(
. NUM_RESET_INPUTS (1),
. OUTPUT_RESET_SYNC_EDGES ("desaassert"),
. SYNC_DEPTH (2)
) u_tx_link_rst_sync (
.reset_in0 (~(wire_link_rst_n & wire_tx_ready)),
.clk (link_clk),
.reset_out (tx_link_rst_n_sync)
);
altera_reset_controller #(
. NUM_RESET_INPUTS (1),
. OUTPUT_RESET_SYNC_EDGES ("desaassert"),
. SYNC_DEPTH (2)
) u_rx_link_rst_sync (
.reset_in0 (~(wire_link_rst_n & wire_rx_ready)),
.clk (link_clk),
.reset_out (rx_link_rst_n_sync)
);
----------------------------------------
2. No módulo control_unit (control_unit.sv ), altere o valor de redefinição para frame_rst, link_rst, avs_rst e xcvr_rst.
//
Registro de saída para reinicializações do transceptor de núcleo base
//
sempre @ (posedge clk ou negedge rst_n)
Começar
se (~rst_n) começar
frame_rst
link_rst
avs_rst
xcvr_rst
fim de outra começa
Não há nenhuma correção planejada para este problema.