
Ò»¡¢FPGA ¿É±à³ÌʵÖʵÄÈÏÖªÎóÇø
1. Ó²¼þ¿É±à³ÌµÄµ×²ãÂß¼
FPGA µÄ¿É±à³ÌÐÔÔ´ÓÚÆäÆæÒìµÄÎïÀí½á¹¹£¬£¬£¬£¬£¬£¬ÊµÖÊÉÏÊÇʹÓô洢Æ÷µÄ״̬¿ØÖƵç·ÅþÁ¬·½·¨£¬£¬£¬£¬£¬£¬¶ø·ÇÈí¼þÒâÒåÉϵÄÖ¸ÁîÖ´ÐС£¡£¡£¡£¡£¡£Òªº¦ÒªÃ÷È·Èý¸ö½¹µã×é¼þ£º
¿É±à³ÌÂß¼µ¥Î» (CLB)£ºÓɲéÕÒ±í (LUT) + ¼Ä´æÆ÷×é³É
- 4ÊäÈëLUTʵÖÊÉÏÊÇÒ»¸ö16×1λµÄSRAM£¬£¬£¬£¬£¬£¬´æ´¢ËùÓÐÊäÈë×éºÏ¶ÔÓ¦µÄÊä³ö
- Àý£ºÊµÏÖÂß¼º¯Êý F = A&B|C^D£¬£¬£¬£¬£¬£¬LUT½«´æ´¢ËùÓÐ16ÖÖÊäÈë×éºÏµÄЧ¹û
¿É±à³Ì»¥Á¬×ÊÔ´£ºÓÉ¿ÉÉèÖÿª¹Ø¾ØÕó×é³ÉµÄ²¼ÏßͨµÀ
¿É±à³ÌIOB£ºÖ§³Ö¶àÖÖµçÆ½±ê×¼ºÍÊäÈëÊä³öģʽ
- °üÀ¨ÊäÈ뻺³å¡¢Êä³öÇý¶¯¡¢DDR¼Ä´æÆ÷µÈÄ£¿£¿£¿£¿£¿é
2. ÓëÈí¼þ±à³ÌµÄʵÖÊÇø±ð
| ά¶È | Èí¼þ±à³Ì | FPGA±à³Ì |
|---|---|---|
| Ö´Ðлù´¡ | Ö¸ÁîÐòÁÐÇý¶¯CPUÖ´ÐÐ | Ó²¼þµçÂ·ÖØ¹¹ |
| ²¢ÐÐÐÔ | ˳ÐòÖ´ÐУ¨¶àÏß³ÌΪα²¢ÐУ© | ÕæÕýµÄÎïÀí²¢ÐÐ |
| ʱ¼äÈ·¶¨ÐÔ | ÊܲÙ×÷ϵͳµ÷ÀíÓ°Ïì | ÑÏ¿áʱÐòÔ¼Êø |
| ¿ª·¢ÊÓ½Ç | Ëã·¨Á÷³ÌÉè¼Æ | Ó²¼þµç·Éè¼Æ |
3. ³£¼ûÈÏÖªÎó²î°¸Àý
- ¹ýʧÈÏÖª£ºÒÔΪ always @(posedge clk) ÀàËÆÈí¼þº¯ÊýŲÓÃ
- ׼ȷÃ÷È·£ºÏÖʵÌìÉúµÄÊÇÎïÀí±£´æµÄ´¥·¢Æ÷ÕóÁУ¬£¬£¬£¬£¬£¬Ã¿¸öʱÖÓÑØËùÓмĴæÆ÷ͬʱÐж¯
¶þ¡¢HDL ÓïÑÔµÄÃ÷È·ÏÝÚå
1. Ó²¼þÐÎò vs Èí¼þÉè¼Æ
Verilog/VHDL ʵÖÊÊÇÓ²¼þ½á¹¹µÄÎı¾»¯±í´ï£¬£¬£¬£¬£¬£¬ÐèÒª½¨ÉèÒÔ϶ÔÓ¦¹ØÏµ£º
// ¿´ËƼòÆÓµÄ¸³ÖµÓï¾ä
assign out = a & b;
// ÏÖʵÌìÉúµÄÓ²¼þ½á¹¹
a
©¦
©À©¤©´
©¦&©À©¤©¤ out
©¸©¤©È
b
2. ¿É×ÛºÏÓë²»¿É×ۺϵĽçÏß
| ´úÂëÀàÐÍ | Ó²¼þ¶ÔÓ¦ | °¸Àý |
|---|---|---|
| ¿É×ۺϴúÂë | Ö±½ÓÓ³ÉäΪÎïÀíµç· | assign¡¢always @(posedge clk) |
| ²»¿É×ۺϴúÂë | ½öÓÃÓÚ·ÂÕæÑéÖ¤ | #ÑÓ³ÙÓï¾ä¡¢initial¿é |
3. µä·¶Ã÷È·ÎóÇø
- ÛÕ±Õ/·ÇÛÕ±Õ¸³Öµ»ìÏý£º
// ¹ýʧÓ÷¨£¨±¬·¢Ëø´æÆ÷£©
always @(*) begin
if(sel) q = a;
// ȱÉÙelse·ÖÖ§
end
// ׼ȷÓ÷¨£¨×éºÏÂß¼ÍêÕû¸³Öµ£©
always @(*) begin
q = sel ? a : b;
end
Èý¡¢FPGA Ó¦ÓÃÆ«ÏòÓë¼¼ÄܾØÕó
1. Èý´óÓ¦ÓÃÁìÓò±ÈÕÕ
| Æ«Ïò | ½¹µãÐèÇó | µä·¶Ó¦Óó¡¾° |
|---|---|---|
| ¸ßËÙ½Ó¿Ú | ÐÒéÃ÷È·¡¢ÐźÅÍêÕûÐÔ | 100GÒÔÌ«Íø¡¢PCIe Gen4 |
| Êý×ÖÐźŴ¦Öóͷ£ | Ë㷨ת»¯¡¢×ÊÔ´ÓÅ»¯ | 5G²¨Êø³ÉÐΡ¢Ò½Ñ§Ó°ÏñÖØÐÞ |
| SOPCϵͳ | ÈíÓ²¼þÐͬÉè¼Æ | ¹¤ÒµÊÓ¾õ¿ØÖÆÆ÷¡¢ÖÇÄÜÍø¹Ø |
2. ¼¼ÄÜÉú³¤õ辶ͼ
graph LR
A[Êý×ֵ緻ù´¡] --> B[HDLÓ²¼þÐÎò]
B --> C[FPGA¼Ü¹¹Ã÷È·]
C --> D[ʱÐòÆÊÎöÓëÔ¼Êø]
D --> E[ϵͳ¼¶Éè¼Æ]
E --> F[ÁìÓòר¼Ò]
ËÄ¡¢Êý×ÖÂß¼µÄ½¹µãְλ
1. »ù´¡ÀíÂÛµÄÒªº¦×÷ÓÃ
- ¿¨ÅµÍ¼¼ò»¯£ºÓÅ»¯×éºÏÂß¼×ÊÔ´
- ״̬»úÉè¼Æ£ºFSMµÄ½áʵÐÔʵÏÖ
- ʱÐòÆÊÎö£º½¨Éè/¼á³Öʱ¼äÅÌËã
2. µä·¶Éè¼ÆÈ±Ïݰ¸Àý
// Òì²½¸´Î»µ¼ÖÂʱÐòÎÊÌâ
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
cnt <= 0; // ¸´Î»ÐźÅÓëʱÖÓÓò²î±ð²½
end else begin
cnt <= cnt + 1;
end
end
// ׼ȷ×ö·¨£ºÍ¬²½¸´Î»»òÌí¼Ó¸´Î»Í¬²½Æ÷
Îå¡¢Í»ÆÆÑ§Ï°Æ¿¾±µÄʵ¼ù¼Æ»®
1. ½¥½øÊ½ÊµÑéϵͳ
| ½×¶Î | ʵÑéÏîÄ¿ | ѵÁ·Öصã |
|---|---|---|
| ÈëÃÅ | LEDÁ÷Ë®µÆ | »ù´¡¹¤³Ì½¨Éè¡¢¹Ü½ÅÔ¼Êø |
| ½ø½× | UARTͨѶÐÒéʵÏÖ | ״̬»úÉè¼Æ¡¢Ê±ÐòÆÊÎö |
| Ìá¸ß | HDMIÊÓÆµ½Ó¿ÚÇý¶¯ | IPºËʹÓᢸßËÙÐźŴ¦Öóͷ£ |
| ÐÑÄ¿ | ǧÕ×ÒÔÌ«ÍøÊý¾Ýת·¢ | ϵͳ¼¯³É¡¢×ÊÔ´ÓÅ»¯ |
2. ÍÆ¼ö¿ª·¢ÇéÐÎÉèÖÃ
- Ó²¼þƽ̨£ºXilinx Zynq-7000ϵÁпª·¢°å£¨PS+PLÐͬ£©
- ¹¤¾ßÁ´£º
graph LR
Vivado --> HLS(¸ßÌõÀí×ÛºÏ)
Vivado --> SDSoC(Òì¹¹±à³Ì)
Vivado --> Vitis(AI¼ÓËÙ¿ª·¢)
3. Òªº¦µ÷ÊÔ¼¼ÇÉ
- ILAÔÚÏßÂß¼ÆÊÎöÒÇ£ºÊµÊ±²¶»ñÄÚ²¿ÐźÅ
- Tcl¾ç±¾×Ô¶¯»¯£º
# ×Ô¶¯½á¹¹²¼Ï߾籾ʾÀý
synth_design -top top_module
opt_design
place_design
route_design
- ʱÐòÔ¼Êø¹æ·¶£º
create_clock -period 10 [get_ports clk]
set_input_delay -max 2 [get_ports data_in] -clock clk
Áù¡¢Ñ§Ï°×ÊÔ´ÍÆ¼ö
1. ¾µä¿Î±¾±ÈÕÕ
| ÊéÃû | ÌØÉ« | ÊÊÓý׶Π|
|---|---|---|
| ¡¶FPGAÔÀíÓë½á¹¹¡· | ÉîÈëÆÊÎöоƬ¼Ü¹¹ | Öм¶½ø½× |
| ¡¶VerilogÊý×ÖϵͳÉè¼Æ½Ì³Ì¡· | ´úÂëÓëÓ²¼þÓ³ÉäÇåÎú | ÈëÃÅʵ¼ù |
| ¡¶¸ßËÙÊý×ÖÉè¼Æ¡· | ÐźÅÍêÕûÐÔרÌâ | ¸ßËÙ½Ó¿Ú¿ª·¢ |
2. ¿ªÔ´ÏîÄ¿²Î¿¼
OpenCores ÉçÇøµÄ£º
- Wishbone×ÜÏß¿ØÖÆÆ÷
- AES¼ÓÃܼÓËÙºË
- Éñ¾ÍøÂçÍÆÀíÒýÇæ
3. ÔÚÏßѧϰƽ̨
- Xilinx Academy£ºÌṩ´ÓÈëÃŵ½×¨¼ÒµÄϵͳ»¯¿Î³Ì
- Hackaday FPGA רÌâ£ºÇ°ÑØÏîĿʵ¼ù·ÖÏí
Æß¡¢Ö°ÒµÉú³¤½¨Òé
1. ¸ÚλÄÜÁ¦ÐèÇó¾ØÕó
| ¸ÚλÀàÐÍ | ½¹µãÄÜÁ¦ÒªÇó |
|---|---|
| FPGAÔÐÍÑéÖ¤ | ÐèÇóÆÊÎöÄÜÁ¦¡¢IPÕûºÏÄÜÁ¦ |
| ͨѶϵͳ¿ª·¢ | ÐÒéÕ»Ã÷È·¡¢¸ßËÙ½Ó¿Úµ÷ÊÔ |
| Ëã·¨¼ÓËÙʵÏÖ | MATLAB/CÄ£×Óת»¯¡¢HLSÓÅ»¯¼¼ÇÉ |
2. ¼¼ÊõÑݽøÇ÷ÊÆ
- Òì¹¹ÅÌË㣺FPGA+CPU+GPUÐͬ¼Ü¹¹
- AI±ßÑØÅÌË㣺ÇáÁ¿»¯Éñ¾ÍøÂç°²ÅÅ
- Á¿×ÓÅÌËã½Ó¿Ú£ºµÍοØÖƵç·ʵÏÖ
ͨ¹ýϵͳÐԵع¥¿ËÉÏÊöѧϰÄѵ㣬£¬£¬£¬£¬£¬½¨Éè׼ȷµÄÓ²¼þÍ·ÄÔ£¬£¬£¬£¬£¬£¬Á¬ÏµÒ»Á¬µÄ¹¤³Ìʵ¼ù£¬£¬£¬£¬£¬£¬ÈκÎѧϰÕß¶¼¿ÉÒÔÍ»ÆÆFPGAµÄÈëÃűÚÀÝ£¬£¬£¬£¬£¬£¬×îÖÕÔÚ¼¯´ó·¢28·Éè¼Æ¡¢Í¨Ñ¶ÏµÍ³¿ª·¢¡¢ÖÇÄÜÓ²¼þµÈÁìÓò»ñµÃ³¤×ãÉú³¤¡£¡£¡£¡£¡£¡£½¨ÒéÌìÌì°ü¹Ü2СʱÒÔÉϵÄʵ¼ùʱ¼ä£¬£¬£¬£¬£¬£¬Íê³ÉÖÁÉÙ5¸öÍêÕûÏîÄ¿ÖÜÆÚ£¨Éè¼Æ¡úʵÏÖ¡úµ÷ÊÔ¡úÓÅ»¯£©µÄѵÁ·Ñ»·£¬£¬£¬£¬£¬£¬Öð²½×÷Óý³öÕæÕýµÄÓ²¼þ¹¤³ÌÄÜÁ¦¡£¡£¡£¡£¡£¡£

´ó·¢28













