Example Image´ó·¢28

ÔÚÕâÀï¸æËßÎÒÃÇÄúµÄÐèÇó°É

ÎÒÃÇ¿ÉÒÔ¸ü¿ìµÄÏàʶÄúµÄÐèÇó
ÆóÒµÈ˲ÅÕÐÆ¸ÐèÇó·´Ïì

È˲ÅÐèÇó


ÁªÏµÈË&ÁªÏµ·½·¨


ÔÚÕâÀï¸æËßÎÒÃÇÄúµÄÐèÇó°É

ÎÒÃÇ¿ÉÒÔ¸ü¿ìµÄÏàʶÄúµÄÐèÇó
ÆóÒµÍÅÅà±íµ¥
´ó·¢28¡¤(ÖйúÓÎ)¹Ù·½ÍøÕ¾

FPGA¹¤³Ìʦ±Ø¶®µÄ10¸öVerilog±àÂë¼¼ÇÉ£º´ó³§´úÂë¹æ·¶+µ÷ÊԺڿƼ¼

FPGA¹¤³Ìʦ±Ø¶®µÄ10¸öVerilog±àÂë¼¼ÇÉ£º´ó³§´úÂë¹æ·¶+µ÷ÊԺڿƼ¼

FPGAÈý¶Îʽ״̬»ú´úÂëʾÀý

ÔÚFPGA¿ª·¢ÖУ¬£¬£¬£¬ £¬µÍЧµÄ´úÂëºÍµ÷ÊÔÒªÁì¿ÉÄܵ¼ÖÂʱÐòÎ¥Àý¡¢×ÊÔ´ÆÌÕÅ¡¢ÏîÄ¿ÑÓÆÚµÈÎÊÌâ¡£¡£ ¡£¡£¡£¾Ýͳ¼Æ£¬£¬£¬£¬ £¬80%µÄFPGAÏîÄ¿ÑÓÆÚÔ´ÓÚ´úÂë¹æ·¶È±Ê§ºÍµ÷ÊÔЧÂʵÍÏ¡£¡£ ¡£¡£¡£±¾ÎÄÁ¬Ïµ»ªÎª¡¢ÖÐÐ˵ȴó³§ÊµÕ½ÂÄÀú£¬£¬£¬£¬ £¬×ܽá10¸öÁ¢¸Í¼ûÓ°µÄ±àÂë¼¼ÇÉ£¬£¬£¬£¬ £¬²¢½ÒÃØVivadoµ÷ÊԺڿƼ¼£¬£¬£¬£¬ £¬ÖúÄã½ÚÔ¼50%¿ª·¢Ê±¼ä£¡


Ò»¡¢´úÂë¹æ·¶Æª£¨5´ó½¹µã¼¼ÇÉ£©

1. ״̬»úÉè¼Æ£ºÈý¶Îʽ»Æ½ð¹æÔò

ÎÊÌ⣺Á½¶Îʽ״̬»úÒ×±¬·¢Ã«´Ì£¬£¬£¬£¬ £¬µ¼ÖÂÂß¼­¹ýʧ¡£¡£ ¡£¡£¡£
¼Æ»®£ºÑÏ¿á½ÓÄÉʱÐòÂß¼­¡ú×éºÏÂß¼­¡úÊä³öÂß¼­Èý¶ÎʽÉè¼Æ¡£¡£ ¡£¡£¡£

// »ªÎª¹æ·¶Ê¾Àý£ºÈý¶Îʽ״̬»ú
always @(posedge clk or negedge rst_n) begin  // µÚÒ»¶Î£º×´Ì¬×ªÒÆ£¨Ê±ÐòÂß¼­£©
    if (!rst_n) current_state <= IDLE;
    else current_state <= next_state;
end

always @(*) begin  // µÚ¶þ¶Î£º´Î̬Âß¼­£¨×éºÏÂß¼­£©
    case (current_state)
        IDLE: next_state = (start) ? WORK : IDLE;
        WORK: next_state = (done) ? IDLE : WORK;
    endcase
end

always @(posedge clk) begin  // µÚÈý¶Î£ºÊä³öÂß¼­£¨Ê±ÐòÂß¼­£©
    case (current_state)
        IDLE: out <= 0;
        WORK: out <= in_data * 2;
    endcase
end

Ч¹û£ºÄ³5G»ùÕ¾ÏîÄ¿½ÓÄɺ󣬣¬£¬£¬ £¬·ÂÕæÁýÕÖÂÊ´Ó70%ÌáÉýÖÁ98%£¬£¬£¬£¬ £¬ÑÇÎÈ̬¹ýʧïÔÌ­90%¡£¡£ ¡£¡£¡£


2. ¿çʱÖÓÓò£¨CDC£©Í¬²½£ºÈý¼¶·À»¤

ÎÊÌ⣺¿çʱÖÓÓòÐźŵ¼ÖÂÑÇÎÈ̬£¬£¬£¬£¬ £¬Êý¾ÝɥʧÂʸߴï1e-4¡£¡£ ¡£¡£¡£
¼Æ»®£º

  • Ë«´¥·¢Æ÷ͬ²½£º»ù´¡·À»¤
  • ÎÕÊÖЭÒ飺Ҫº¦Êý¾Ý·À»¤
  • Òì²½FIFO£º´óÊý¾ÝÁ÷·À»¤
// Ë«´¥·¢Æ÷ͬ²½£¨·ÀÑÇÎÈ̬£©
reg [1:0] sync_reg;
always @(posedge clk_dst) begin
    sync_reg <= {sync_reg[0], async_signal};
end
assign sync_signal = sync_reg[1];

°¸Àý£ºÄ³½ðÈÚÉúÒâϵͳ½ÓÄɺ󣬣¬£¬£¬ £¬Êý¾Ý¹ýʧÂʽµÖÁ1e-9¡£¡£ ¡£¡£¡£


3. ×éºÏÂß¼­¹æ·¶£ºìî³ýËø´æÆ÷£¨Latch£©

ÎÊÌ⣺²»ÍêÕûµÄÌõ¼þÓï¾äÌìÉúËø´æÆ÷£¬£¬£¬£¬ £¬µ¼ÖÂʱÐòÎ¥Àý¡£¡£ ¡£¡£¡£
¼Æ»®£º

  • always_combÌæ»»always @*£º×Ô¶¯¼ì²â×éºÏÂß¼­ÍêÕûÐÔ£¨SystemVerilog£©
  • defaultÈ«ÁýÕÖ£ºcaseÓï¾ä±ØÐè°üÀ¨default·ÖÖ§
// ¹ýʧʾÀý£ºÈ±ÉÙelse·ÖÖ§ÌìÉúËø´æÆ÷
always @(*) begin
    if (sel) out = a;
end

// ׼ȷʾÀý£º×éºÏÂß¼­ÍêÕû¸³Öµ
always @(*) begin
    out = (sel) ? a : b;  // Ã÷È·ËùÓÐÌõ¼þ
end

4. ²ÎÊý»¯Éè¼Æ£ººê½ç˵+Ä£¿£¿£¿ £¿£¿é¸´ÓÃ

ÎÊÌ⣺Ӳ±àÂëµ¼Ö´úÂëÄÑÒÔά»¤ºÍÒÆÖ²¡£¡£ ¡£¡£¡£
¼Æ»®£º

  • ʹÓàdefine»òparameter`½ç˵ȫ¾Ö²ÎÊý
  • Ä£¿£¿£¿ £¿£¿é½Ó¿Ú±ê×¼»¯£¨AXI-Stream/APB×ÜÏߣ©
// ²ÎÊý»¯FIFOÉè¼Æ
module fifo #(
    parameter DEPTH = 1024,
    parameter WIDTH = 32
)(
    input  wire clk,
    input  wire [WIDTH-1:0] din,
    ...
);
endmodule

Ч¹û£ºÄ³Í¨Ñ¶ÏîÄ¿¸´ÓòÎÊý»¯FIFOÄ£¿£¿£¿ £¿£¿é£¬£¬£¬£¬ £¬¿ª·¢Ð§ÂÊÌáÉý60%¡£¡£ ¡£¡£¡£


5. ×ÊÔ´ÓÅ»¯£ºÔËËã·ûÖØ¶¨ÏòÓë×ÊÔ´¹²Ïí

ÎÊÌ⣺ֱ½ÓʹÓÔ*”ÔËËã·û×ۺϳÉDSPµ¥Î»£¬£¬£¬£¬ £¬µ¼ÖÂ×ÊÔ´ÆÌÕÅ¡£¡£ ¡£¡£¡£
¼Æ»®£º

  • ÔËËã·ûÖØ¶¨Ïò£ºÇ¿ÖÆÊ¹ÓÃLUTʵÏÖСλ¿í³Ë·¨
  • ×ÊÔ´¹²Ïí£ººÏ²¢Öظ´Âß¼­
// ÓÅ»¯Ç°£ºÕ¼ÓÃ1¸öDSP48µ¥Î»
assign result = a * b;  // 16λ³Ë·¨

// ÓÅ»¯ºó£ºÊ¹ÓÃLUTʵÏÖ£¨Î»¿í<12ʱ£©
(* use_dsp = "no" *)  // ½ûÓÃDSPÖ¸Áî
assign result = a * b;

Êý¾Ý±ÈÕÕ£º

¼Æ»®LUTsDSPs×î´óƵÂÊ
ÓÅ»¯Ç°501200 MHz
ÓÅ»¯ºó1200250 MHz

¶þ¡¢µ÷ÊԺڿƼ¼Æª£¨5´ó¸ßЧ¹¤¾ß£©

6. ILAʵʱץÈ¡£¡£ ¡£¡£¡£º¶¨Î»Ê±ÐòÎ¥ÀýȪԴ

³¡¾°£ºÊ±ÐòÎ¥Àý£¨Setup/Hold Time Violation£©ÄÑÒÔ¸´ÏÖ¡£¡£ ¡£¡£¡£
²Ù×÷°ì·¨£º

  1. ÔÚVivadoÖвåÈëILAºË£¬£¬£¬£¬ £¬×¥È¡Òªº¦Â·¾¶ÐźÅ
  2. ÉèÖô¥·¢Ìõ¼þ£¨Èçdata_valid && !data_ready£©
  3. ÏÂÔØ±ÈÌØÁ÷£¬£¬£¬£¬ £¬´¥·¢²¨Ðβ¶»ñ
# ²åÈëILAºË¾ç±¾
create_debug_core u_ila ila
set_property port_width 32 [get_debug_ports u_ila/clk]
...

Ч¹û£ºÄ³ÏîĿͨ¹ýILA·¢Ã÷ʱÖÓÓò½»Ö¯¹ýʧ£¬£¬£¬£¬ £¬µ÷ÊÔʱ¼ä´Ó3ÌìËõ¶ÌÖÁ2Сʱ¡£¡£ ¡£¡£¡£


7. TCL¾ç±¾×Ô¶¯»¯£ºÒ»¼üÌìÉúʱÐò±¨¸æ

³¡¾°£ºÊÖ¶¯ÆÊÎöʱÐò±¨¸æºÄʱ¼èÐÁ¡£¡£ ¡£¡£¡£
¾ç±¾Ê¾Àý£º

# ÌìÉúʱÐò±¨¸æ²¢ÆÊÎöÒªº¦Â·¾¶
report_timing -sort_by group -max_paths 100 -file timing.rpt
set fp [open "timing.rpt" r]
while {[gets $fp line] >= 0} {
    if {[regexp {Slack (VIOLATED)} $line]} {
        puts "·¢Ã÷ʱÐòÎ¥Àý·¾¶£º$line"
    }
}
close $fp

Êä³öЧ¹û£º×Ô¶¯±ê¼ÇÎ¥Àý·¾¶£¬£¬£¬£¬ £¬¶¨Î»ÆµÂÊÆ¿¾±¡£¡£ ¡£¡£¡£


8. ÔöÁ¿±àÒ룺¿ìËÙµü´úÑéÖ¤

³¡¾°£ºÐ޸ľֲ¿´úÂëºóÖØÐ±àÒëºÄʱÊýСʱ¡£¡£ ¡£¡£¡£
²Ù×÷Á÷³Ì£º

  1. Ê״αàÒëÌìÉúcheckpoint.dcp
  2. Ð޸ĴúÂëºóÔËÐÐÔöÁ¿±àÒ룺
vivado -mode batch -source incremental_compile.tcl

Ч¹û£ºÄ³Í¼Ïñ´¦Öóͷ£ÏîÄ¿±àÒëʱ¼ä´Ó4Сʱ½µÖÁ20·ÖÖÓ¡£¡£ ¡£¡£¡£


9. ¹¦ºÄÆÊÎö£º¾«×¼ÓÅ»¯ÄÜЧ±È

³¡¾°£ºFPGA¹¦ºÄ³¬±êµ¼ÖÂÉ¢ÈÈÎÊÌâ¡£¡£ ¡£¡£¡£
¹¤¾ßÁ´£º

  • Vivado Power Analyzer
  • ¶¯Ì¬¹¦ºÄ¹ÀË㹫ʽ£º
¿çʱÖÓÓòͬ²½µç·ʾÒâͼ

ÓÅ»¯²ßÂÔ£º

  • ½ûÓÃδʹÓÃÄ£¿£¿£¿ £¿£¿éµÄʱÖÓ£¨Clock Gating£©
  • ½µµÍ¿ÕÏÐÂß¼­µÄµçѹ£¨Voltage Scaling£©

10. °æ±¾¿ØÖÆ£ºGit+RTL´úÂë¹ÜÀí

³¡¾°£º¶àÈËЭ×÷µ¼Ö´úÂë³åÍ»ºÍ°æ±¾ÔÓÂÒ¡£¡£ ¡£¡£¡£
¹æ·¶£º

  • ʹÓÃGit¹ÜÀíRTL´úÂë¡¢Ô¼ÊøÎļþºÍ¾ç±¾
  • Ŀ¼½á¹¹Ê¾Àý£º
/src        - RTL´úÂë  
/tb         - ²âÊÔÆ½Ì¨  
/constraint - XDCÔ¼Êø  
/script     - TCL/Python¾ç±¾

°¸Àý£ºÄ³ÍŶÓÒýÈëGitºó£¬£¬£¬£¬ £¬°æ±¾»Ø¹öЧÂÊÌáÉý80%¡£¡£ ¡£¡£¡£

Á¢¼´É¨ÂëÁìÈ¡£º

  1. ¡¶»ªÎªFPGA´úÂë¹æ·¶°×ƤÊé¡·£¨50Ò³PDF£©
  2. Vivadoµ÷ÊԾ籾¹¤¾ß°ü£¨º¬ILA×Ô¶¯²åÈ롢ʱÐòÆÊÎö¾ç±¾£©
  3. Verilog³£¼û¹ýʧ°¸Àý¼¯£¨20¸öÕæÊµÏîÄ¿ÎÊÌâÆÊÎö£©
Vivado ILAµ÷ÊÔ½çÃæ½ØÍ¼

ɨÂëºóÊäÈë¡°FPGA¼¼ÇÉ¡±Ãâ·Ñ»ñÈ¡


½áÓï

ÕÆÎÕÕâ10¸ö¼¼ÇÉ£¬£¬£¬£¬ £¬Ä㽫£º
? ´úÂëͨ¹ýÂÊÌáÉýÖÁ90%
? µ÷ÊÔʱ¼äËõ¶Ì50%
? ×ÊԴʹÓÃÂÊÓÅ»¯40%
Á¢¼´Êµ¼ù£¬£¬£¬£¬ £¬³ÉΪÍŶÓÖеÄFPGA½¹µã¿ª·¢Õߣ¡

´ó·¢28¡¤(ÖйúÓÎ)¹Ù·½ÍøÕ¾
¡¾ÍøÕ¾µØÍ¼¡¿¡¾sitemap¡¿