第一章 FPGA改善時(shí)序方法

在FPGA設(shè)計(jì)中膝昆,可以從以下五個(gè)方面來改善設(shè)計(jì)的時(shí)序表現(xiàn)

  1. 增加寄存器層級(jí)

    增加寄存器層級(jí)娃弓,即在關(guān)鍵路徑上,通過插入中間寄存器的方法來對(duì)關(guān)鍵路徑進(jìn)行切割廓潜。該方法適用于對(duì)延時(shí)不敏感的設(shè)計(jì)中。

    module fir(
        output   [7:0]   Y,
        input    [7:0]   A, B, C, X,
        input            clk,
        input validsample);
        
        reg [7:0] X1, X2, Y;
        
        always @(posedge clk)
            if(validsample) begin
                X1 <= X;
                X2 <= X1;
                Y <= A* X+B* X1+C* X2;
             end
        
    endmodule
    

    優(yōu)化后:

    module fir(
        output [7:0] Y,
        input [7:0] A, B, C, X,
        input clk,
        input validsample);
        
        reg [7:0] X1, X2, Y;
        reg [7:0] prod1, prod2, prod3;
        
        always @ (posedge clk) begin
            if(validsample) begin
                X1 <= X;
                X2 <= X1;
                prod1 <= A * X;
                prod2 <= B * X1;
                prod3 <= C * X2;
            end
                Y <= prod1 + prod2 + prod3;
        end
        
    endmodule
    

    對(duì)應(yīng)RTL為:


    image.png


    image.png
  1. 結(jié)構(gòu)并行化

    結(jié)構(gòu)并行化策略指的是,通過將關(guān)鍵路徑上的較大的邏輯結(jié)構(gòu)進(jìn)行重組辩蛋,使用較小的并行結(jié)構(gòu)進(jìn)行實(shí)現(xiàn)呻畸。這種方法適用于一些滿足條件(可并行實(shí)現(xiàn))的串行結(jié)構(gòu)。

    X = {A, B}
    X * X = {A, B} * {A, B} = {(A * A), (2 * A * B), (B * B)};
    

    可優(yōu)化為:

    module power3(
        output [7:0] XPower,
        input [7:0] X,
        input clk);
        
        reg [7:0] XPower1;
        // partial product registers
        reg [3:0] XPower2_ppAA, XPower2_ppAB, XPower2_ppBB;
        reg [3:0] XPower3_ppAA, XPower3_ppAB, XPower3_ppBB;
        reg [7:0] X1, X2;
        wire [7:0] XPower2;
        
        // nibbles for partial products (A is MS nibble, B is LS
        nibble)
        wire [3:0] XPower1_A = XPower1[7:4];
        wire [3:0] XPower1_B = XPower1[3:0];
        wire [3:0] X1_A = X1[7:4];
        wire [3:0] X1_B = X1[3:0];
        wire [3:0] XPower2_A = XPower2[7:4];
        wire [3:0] XPower2_B = XPower2[3:0];
        wire [3:0] X2_A = X2[7:4];
        wire [3:0] X2_B = X2[3:0];
        
        // assemble partial products
        assign XPower2 = (XPower2_ppAA << 8)+(2*XPower2_ppAB << 4)+XPower2_ppBB;
        assign XPower = (XPower3_ppAA << 8)+(2*XPower3_ppAB << 4)+XPower3_ppBB;
        
        always @(posedge clk) begin
            // Pipeline stage 1
            X1 <= X;
            XPower1 <= X;
            // Pipeline stage 2
            X2 <= X1;
            // create partial products
            XPower2_ppAA <= XPower1_A * X1_A;
            XPower2_ppAB <= XPower1_A * X1_B;
            XPower2_ppBB <= XPower1_B * X1_B;
            // Pipeline stage 3
            // create partial products
            XPower3_ppAA <= XPower2_A * X2_A;
            XPower3_ppAB <= XPower2_A * X2_B;
            XPower3_ppBB <= XPower2_B * X2_B;
        end
        
    endmodule
    
    

    對(duì)應(yīng)RLT圖為


    image.png
  1. 邏輯結(jié)構(gòu)平行化

    所謂了邏輯結(jié)構(gòu)平行化悼院,即取消一下不必要的優(yōu)先級(jí)鏈級(jí)結(jié)構(gòu)擂错,這跟第2點(diǎn)有點(diǎn)類似。通俗的講樱蛤,多用case钮呀,少用if else。

    module regwrite(
        output reg [3:0] rout,
        input clk, in,
        input [3:0] ctrl);
        
        always @(posedge clk)
            if(ctrl[0]) 
                rout[0] <= in;
            else if(ctrl[1]) 
                rout[1] <= in;
            else if(ctrl[2]) 
                rout[2] <= in;
            else if(ctrl[3]) 
                rout[3] <= in;
    endmodule
    

    可優(yōu)化為:

    module regwrite(
        output reg [3:0] rout,
        input clk, in,
        input [3:0] ctrl);
        
        always @(posedge clk) begin
            if(ctrl[0]) 
             rout[0] <= in;
            if(ctrl[1]) 
             rout[1] <= in;
            if(ctrl[2]) 
             rout[2] <= in;
            if(ctrl[3]) 
             rout[3] <= in;
        end
        
    endmodule
    

    對(duì)應(yīng)RTL為:


    image.png


    image.png
  1. 寄存器平衡

    寄存器平衡昨凡,就是將關(guān)鍵路徑上各個(gè)寄存器之間的邏輯重新進(jìn)行劃分爽醋,從而使得每級(jí)寄存器之間的邏輯延時(shí)達(dá)到均衡。

    module adder(
        output reg [7:0] Sum,
        input [7:0] A, B, C,
        input clk);
        
        reg [7:0] rA, rB, rC;
        
        always @(posedge clk) begin
            rA <= A;
            rB <= B;
            rC <= C;
            Sum <= rA + rB + rC;
        end
    endmodule
    

    優(yōu)化后

    module adder(
        output reg [7:0] Sum,
        input [7:0] A, B, C,
        input clk);
        
        reg [7:0] rABSum, rC;
        
        always @(posedge clk) begin
            rABSum <= A + B;
            rC <= C;
            Sum <= rABSum + rC;
        end
    endmodule
    

    對(duì)應(yīng)RLT圖為:


    image.png


    image.png
  1. 路徑重配置

    路徑重配置策略便脊,即將關(guān)鍵邏輯上的一些邏輯運(yùn)算轉(zhuǎn)移到相鄰的路徑上去蚂四。

    module randomlogic(
        output reg [7:0] Out,
        input [7:0] A, B, C,
        input clk,
        input Cond1, Cond2);
        
        always @(posedge clk)
            if(Cond1)
             Out <= A;
            else if(Cond2 && (C < 8))
             Out <= B;
            else
             Out <= C;
    endmodule
    

    可優(yōu)化為:

    module randomlogic(
        output reg [7:0] Out,
        input [7:0] A, B, C,
        input clk,
        input Cond1, Cond2);
        
        wire CondB = (Cond2 & !Cond1);
        
        always @(posedge clk)
            if(CondB && (C < 8))
             Out <= B;
            else if(Cond1)
             Out <= A;
            else
             Out <= C;
    endmodule
    

    對(duì)應(yīng)RTL圖為


    image.png


    image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市哪痰,隨后出現(xiàn)的幾起案子遂赠,更是在濱河造成了極大的恐慌,老刑警劉巖晌杰,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跷睦,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡肋演,警方通過查閱死者的電腦和手機(jī)抑诸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爹殊,“玉大人蜕乡,你說我怎么就攤上這事」?洌” “怎么了层玲?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)反症。 經(jīng)常有香客問我辛块,道長(zhǎng),這世上最難降的妖魔是什么惰帽? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任憨降,我火速辦了婚禮,結(jié)果婚禮上该酗,老公的妹妹穿的比我還像新娘授药。我一直安慰自己士嚎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布悔叽。 她就那樣靜靜地躺著莱衩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪娇澎。 梳的紋絲不亂的頭發(fā)上笨蚁,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音趟庄,去河邊找鬼括细。 笑死,一個(gè)胖子當(dāng)著我的面吹牛戚啥,可吹牛的內(nèi)容都是我干的奋单。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼猫十,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼览濒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拖云,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤贷笛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后宙项,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乏苦,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年杉允,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了邑贴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡叔磷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出奖磁,到底是詐尸還是另有隱情改基,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布咖为,位于F島的核電站秕狰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏躁染。R本人自食惡果不足惜鸣哀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吞彤。 院中可真熱鬧我衬,春花似錦叹放、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至破加,卻和暖如春俱恶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背范舀。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工合是, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锭环。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓端仰,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親田藐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子荔烧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345