99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何為FPGA編寫可綜合的代碼?

FPGA之家 ? 來源:AriesOpenFPGA ? 作者:0Aries0 ? 2021-05-23 14:51 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、Verilog 編碼風(fēng)格

(本文的語法高亮因?yàn)闉g覽器的緣故,所以不準(zhǔn)確)

1.1 使用“`include編譯器指令”

文件包含“`include編譯器指令”用于在合成過程中將源文件的全部內(nèi)容插入到另一個(gè)文件中。它通常用于包括全局項(xiàng)目定義,而無需在多個(gè)文件中重復(fù)相同的代碼。另一個(gè)用例是將代碼的一部分插入模塊,如以下示例所示:

// file test_bench_top.v // top-level simulation testbench module test_bench_top; `include “test_case.v” endmodule // file test_case.v initialbegin //… end task my_task; //… endtask

> include編譯器指令的語法定義為:`include

可以是文件名,還可以包含絕對或相對路徑名:

`include“test_case.v” `include“../../includes/test_case.v” `include“/home/myprojects/test/includes/test_case.v”

建議僅在include中使用文件名,而不要使用絕對或相對路徑名。這將使代碼位置獨(dú)立,因此更加可移植。另一個(gè)建議是保持包含文件簡單而不使用嵌套的include指令。

1.2使用`define編譯器指令,parameter和localparam

`define是文本宏替換編譯器指令。它定義為:`define

可以包含帶有可選參數(shù)列表的單行或多行文本。

`define具有全局范圍。一旦定義了文本宏名稱,就可以在項(xiàng)目中的任何地方使用它。文本宏通常是用于定義狀態(tài)名稱,常量或字符串的簡單標(biāo)識符。

parameter關(guān)鍵字定義模塊特定的參數(shù),該參數(shù)在特定模塊實(shí)例的范圍生效。參數(shù)用于為模塊實(shí)例提供不同的自定義,例如,輸入或輸出端口的寬度。以下是使用parameter關(guān)鍵字的示例:

module adder #(parameter WIDTH = 8) ( input[WIDTH-1:0] a,b, output [WIDTH-1:0] sum ); assign sum = a+ b; endmodule // adder // aninstance of adder module adder # (16) adder1 (.a(a[15:0]),.b(b[15:0]),.sum(sum[15:0]));

localparam關(guān)鍵字與parameter相似。它被分配了一個(gè)常量表達(dá)式,并在特定模塊內(nèi)具有作用域。它定義為:

1.3 使用函數(shù)

以下是執(zhí)行XOR操作的Verilog函數(shù)的簡單示例:

module function_example( inputa,b, output func_out); functionfunc_xor; inputa, b; begin func_xor = a^ b; end endfunction assign func_out = func_xor(a,b); endmodule // function_example

建議使用Verilog函數(shù)來實(shí)現(xiàn)組合邏輯和其他不需要非阻塞分配的操作,例如同步邏輯。使用函數(shù)可以編寫更緊湊和模塊化的代碼。所有綜合工具均支持Verilog函數(shù)。

1.4使用 generate塊

在Verilog-2001中引入了generate塊,以使對同一模塊,函數(shù),變量,網(wǎng)絡(luò)和連續(xù)分配的多個(gè)實(shí)例的實(shí)例化變得容易。以下是使用generate的兩個(gè)示例:

// aconditional instantiation of modules parameter COND1 = 1; generate if(COND1) begin : my_module1_inst my_module1 inst (.clk(clk), .di(di), .do(do)); end elsebegin : my_module2_inst my_module2 inst (.clk(clk), .di(di), .do(do)); end endgenerate // using forloop in generate block genvar ii; generate for(ii = 0; ii < 32; ii = ii+1) begin: for_loop ????my_module1 inst (.clk(clk), .di(di[ii]), .do(do[ii])); ????end end endgenerate

1.5 開發(fā)簡單的代碼

始終努力開發(fā)簡單的代碼。與每種編程語言一樣,Verilog允許編寫詳細(xì)的語句,從功能的角度來看,這些語句很優(yōu)美,但可讀性不高。下面的簡單示例說明了這一點(diǎn):

reg [5:0] sel; reg [3:0] result1,result2,a,b; always @(*) begin result1 = sel[0] ? a + b : sel[1] ? a - b : sel[2] ? a & b : sel[3] ? a ^ b : sel[4] ? ~a : ~ b; if(~|sel) result1 = 4'b0; end// always

reg [5:0] sel; reg [3:0] result1,result2,a,b; always @(*) begin casex(sel) 6'bxxxxx1: result2 = a + b; 6'bxxxx10: result2 = a - b; 6'bxxx100: result2 = a & b; 6'bxx1000: result2 = a ^+ b; 6'bx10000: result2 = ~a; 6'b100000: result2 = ~b; default: result2 = 4'b0; endcase end // always

實(shí)現(xiàn)result1和result2的邏輯在功能上是等效的。但是,在result1中使用嵌套三元運(yùn)算符和兩個(gè)賦值語句不太透明,并且與result2邏輯的更清晰的case語句相比,需要花更多的精力來理解。

通常,代碼清晰度高容易實(shí)現(xiàn)高效率。同一段代碼能在其生命周期內(nèi)被多個(gè)開發(fā)人員讀取。編寫更清晰的代碼更容易調(diào)試,并且一般不容易包含錯(cuò)誤。

二、為FPGA編寫可綜合的代碼

2.1考慮資源

Verilog語言參考手冊(LRM)提供了豐富的功能來描述硬件。但是,只有一部分語言可以為FPGA綜和。即使有些特定的語言結(jié)構(gòu)是可綜合的,也不能保證該代碼能在特定FPGA上實(shí)現(xiàn)物理電路??紤]以下示例:

reg [7:0] memory[1:2**22]; initial begin memory[1] = 8’h1; memory[2] = 8’h2; end

該示例能正確模擬出來,但會(huì)導(dǎo)致FPGA物理實(shí)現(xiàn)失敗。該代碼需要4 MB的內(nèi)存,這是一些FPGA所沒有的。此外,綜合工具將忽略初始塊,該塊將初始化內(nèi)存的最低兩個(gè)字節(jié)。

該技巧提供了一些指導(dǎo)方針和建議,以幫助編寫用于FPGA的可綜合代碼。

2.2 遵循同步設(shè)計(jì)原則

建議開發(fā)人員遵守FPGA同步設(shè)計(jì)的原則,其中包括以下內(nèi)容:

1、使用同步復(fù)位。后續(xù)會(huì)詳細(xì)討論,同步,異步復(fù)位的問題

2、避免使用鎖存

3、避免使用門控,派生或分頻時(shí)鐘

4、使用時(shí)鐘使能而不是多個(gè)時(shí)鐘

5、對所有異步信號實(shí)行正確同步

原文標(biāo)題:學(xué)習(xí)FPGA的小Tips(一)

文章出處:【微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1645

    文章

    22046

    瀏覽量

    618264
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4900

    瀏覽量

    70705

原文標(biāo)題:學(xué)習(xí)FPGA的小Tips(一)

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    【經(jīng)驗(yàn)分享】玩轉(zhuǎn)FPGA串口通信:從“幻覺調(diào)試”到代碼解析

    FPGA開發(fā),思路先行!玩FPGA板子,讀代碼是基本功!尤其對從C語言轉(zhuǎn)戰(zhàn)FPGA的“寶貝們”來說,適應(yīng)流水線(pipeline)編程可能需要點(diǎn)時(shí)間。上篇點(diǎn)燈
    的頭像 發(fā)表于 06-05 08:05 ?292次閱讀
    【經(jīng)驗(yàn)分享】玩轉(zhuǎn)<b class='flag-5'>FPGA</b>串口通信:從“幻覺調(diào)試”到<b class='flag-5'>代碼</b>解析

    RAKsmart企業(yè)服務(wù)器上部署DeepSeek編寫運(yùn)行代碼

    在RAKsmart企業(yè)服務(wù)器上部署并運(yùn)行DeepSeek模型的代碼示例和詳細(xì)步驟。假設(shè)使用 Python + Transformers庫 + FastAPI實(shí)現(xiàn)一個(gè)基礎(chǔ)的AI服務(wù)。主機(jī)推薦小編為您整理發(fā)布RAKsmart企業(yè)服務(wù)器上部署DeepSeek編寫運(yùn)行
    的頭像 發(fā)表于 03-25 10:39 ?303次閱讀

    27個(gè)FPGA實(shí)例源代碼

    本資料收集匯總了27個(gè)FPGA實(shí)例源代碼,有需要的可以下載學(xué)習(xí)! 獲取完整文檔資料可下載附件哦!?。?!如果內(nèi)容有幫助可以關(guān)注、點(diǎn)贊、評論支持一下哦~
    發(fā)表于 03-14 17:31

    何為micropython添加自己的C代碼庫?

    部分代碼需要更高效的效率 如何為micropython添加自己的C代碼庫? 是否有教程? 如果可以的話是否可以提供一個(gè)實(shí)現(xiàn)實(shí)例?
    發(fā)表于 03-11 07:03

    EE-134:為SHARC系列編寫C兼容匯編代碼中斷處理程序

    電子發(fā)燒友網(wǎng)站提供《EE-134:為SHARC系列編寫C兼容匯編代碼中斷處理程序.pdf》資料免費(fèi)下載
    發(fā)表于 01-07 13:58 ?0次下載
    EE-134:為SHARC系列<b class='flag-5'>編寫</b>C兼容匯編<b class='flag-5'>代碼</b>中斷處理程序

    Verilog vhdl fpga

    崗位職責(zé) 1.負(fù)責(zé)FPGA的架構(gòu)設(shè)計(jì)、代碼編寫、仿真等; 2.協(xié)同軟、硬件工程師完成系統(tǒng)聯(lián)調(diào)和測試; 3.負(fù)責(zé)項(xiàng)目中FPGA設(shè)計(jì)的相關(guān)文檔編寫
    發(fā)表于 11-12 16:40

    AIC3254的miniDSP編寫代碼編寫C5502代碼有什么區(qū)別?

    問題:AIC3254的miniDSP編寫代碼編寫C5502代碼有什么區(qū)別,執(zhí)行速度和代碼量來進(jìn)行分析吧,謝謝回復(fù)
    發(fā)表于 11-06 07:22

    基于FPGA實(shí)現(xiàn)數(shù)碼管顯示

    本文介紹數(shù)碼管顯示譯碼基本工作原理及Verilog HDL驅(qū)動(dòng)代碼編寫,進(jìn)一步熟練掌握FPGA入門基礎(chǔ)知識。
    的頭像 發(fā)表于 10-24 14:44 ?1823次閱讀
    基于<b class='flag-5'>FPGA</b>實(shí)現(xiàn)數(shù)碼管顯示

    怎么樣提高verilog代碼編寫水平?

    ,共同進(jìn)步。 歡迎加入FPGA技術(shù)微信交流群14群! 交流問題(一) Q:怎么樣提高verilog代碼編寫水平?Cpu 從事DFT工作。目前僅限于寫一些簡單模塊。自學(xué)的話如何提高verilog
    發(fā)表于 09-25 20:05

    FPGA Verilog HDL代碼如何debug?

    ,共同進(jìn)步。 歡迎加入FPGA技術(shù)微信交流群14群! 交流問題(一) Q:Verilog代碼如何debug?最近學(xué)習(xí)fpga,寫了不少verilog,開始思考如何debug的問題!c語言是順序執(zhí)行,而
    發(fā)表于 09-24 19:16

    FPGA算法工程師、邏輯工程師、原型驗(yàn)證工程師有什么區(qū)別?

    的設(shè)計(jì)和實(shí)現(xiàn)。他們使用硬件描述語言(如 Verilog 或 VHDL)來編寫代碼,構(gòu)建復(fù)雜的數(shù)字邏輯系統(tǒng)。工作包括模塊的設(shè)計(jì)、功能的實(shí)現(xiàn)、時(shí)序的優(yōu)化以及與其他硬件組件的接口設(shè)計(jì)等。 FPGA 原型驗(yàn)證工程師
    發(fā)表于 09-23 18:26

    FPGA芯片架構(gòu)和資源有深入的理解,精通Verilog HDL、VHDL

    崗位職責(zé) 1.負(fù)責(zé)FPGA的架構(gòu)設(shè)計(jì)、代碼編寫、仿真等; 2.協(xié)同軟、硬件工程師完成系統(tǒng)聯(lián)調(diào)和測試; 3.負(fù)責(zé)項(xiàng)目中FPGA設(shè)計(jì)的相關(guān)文檔編寫
    發(fā)表于 09-15 15:23

    FPGA Verilog HDL有什么奇技巧?

    變量賦初值,例如: 這些方式都是綜合的,并且能夠確保 reg 變量在硬件中具有明確的初始狀態(tài)。 至于是否需要為所有的 reg 編寫復(fù)位邏輯(即全部賦初值),可以根據(jù)具體的應(yīng)用場景需求和可用資源來決定
    發(fā)表于 09-12 19:10

    優(yōu)化 FPGA HLS 設(shè)計(jì)

    優(yōu)化 FPGA HLS 設(shè)計(jì) 用工具用 C 生成 RTL 的代碼基本不可讀。以下是如何在不更改任何 RTL 的情況下提高設(shè)計(jì)性能。 介紹 高級設(shè)計(jì)能夠以簡潔的方式捕獲設(shè)計(jì),從而
    發(fā)表于 08-16 19:56

    基于FPGA的CCD工業(yè)相機(jī)系統(tǒng)設(shè)計(jì)

    基于FPGA的CCD工業(yè)相機(jī)系統(tǒng)設(shè)計(jì)是一個(gè)綜合性的項(xiàng)目,它結(jié)合了硬件電路設(shè)計(jì)、FPGA編程以及圖像處理技術(shù)。以下是一個(gè)詳細(xì)的系統(tǒng)設(shè)計(jì)方案,包括設(shè)計(jì)概述、硬件架構(gòu)、FPGA編程要點(diǎn)以及部
    的頭像 發(fā)表于 07-17 11:24 ?2136次閱讀