FPGA設計思想(持續更新)


一、 流水線設計

  將原本一個時鍾周期完成的較大的組合邏輯通過合理的切割后分由多個時鍾周期完成。該部分邏輯運行的時鍾頻率會有明顯對的提升,提高系統的性能用面積換速度

  一個流水線設計需要4個步驟完成一個數據的處理過程,那么從有數據輸入的第一個時鍾周期開始,直到第4個時鍾周期處理完第一個數據,但在以后的每一個時鍾周期都會有處理完成的數據輸出,流水線設計在開始處理時需要一定的處理時間,但以后就會不斷的輸出數據,從而大大提高處理速度。(面積換速度)如果不采用流水線設計,那么處理一個數據就需要4個時鍾周期,而采用流水線設計則能夠提高將近4倍的處理速度,用一個復雜的算術式子舉例,這是官方給的RGB888 to YCbCr的算法公式,我們可以直接把算法移植到FPGA上,但是我們都知道FPGA無法進行浮點運算,所以我們采取將整個式子右端先都擴大256倍,然后再右移8位,這樣就得到了FPGA擅長的乘法運算和加法運算了。

 

  這個計算式子看起來是十分簡單的,但是要是直接用Verilog直接寫出來,那么只能說,這個人的代碼寫的一塌糊塗,所以這里就引出FPGA中流水線的設計思想。在這里我們選擇加3級流水線,就第一個Y分量而言,先計算括號中得乘法運算,消耗一個時鍾,然后將括號中的數據求和,消耗一個時鍾,這里為了計算方便,將128也擴大256倍,放到括號中,最終結果除以256就行了也就是右移8位,在FPGA中我們只需要舍棄低8位取高8位就行。具體代碼如下

 1 //--------------------------------------------
 2 /*Refer to <OV7725 Camera Module Software Applicaton Note> page 5
 3     Y     =    (77 *R     +     150*G     +     29 *B)>>8
 4     Cb     =    (-43*R    -     85 *G    +     128*B)>>8 + 128
 5     Cr     =    (128*R     -    107*G      -    21 *B)>>8 + 128
 6 --->
 7     Y     =    (77 *R     +     150*G     +     29 *B)>>8
 8     Cb     =    (-43*R    -     85 *G    +     128*B + 32768)>>8
 9     Cr     =    (128*R     -    107*G      -    21 *B + 32768)>>8*/
10 //--------------------------------------------
11 //RGB888 to YCrCb
12 //step1 conmuse 1clk
13 reg     [15:0]    cmos_R1, cmos_R2, cmos_R3;
14 reg     [15:0]    cmos_G1, cmos_G2, cmos_G3;
15 reg     [15:0]    cmos_B1, cmos_B2, cmos_B3;
16 always @(posedge clk or negedge rst_n)
17 begin
18     if(!rst_n)begin
19             cmos_R1 <= 16'd0;
20             cmos_G1 <= 16'd0;
21             cmos_B1 <= 16'd0;
22             cmos_R2 <= 16'd0;
23             cmos_G2 <= 16'd0;
24             cmos_B2 <= 16'd0;
25             cmos_R3 <= 16'd0;
26             cmos_G3 <= 16'd0;
27             cmos_B3 <= 16'd0;
28     end
29     else begin
30         cmos_R1 <= cmos_R0 * 8'd77;
31         cmos_G1 <= cmos_G0 * 8'd150;
32         cmos_B1 <= cmos_B0 * 8'd29; 
33         cmos_R2 <= cmos_R0 * 8'd43; 
34         cmos_G2 <= cmos_G0 * 8'd85; 
35         cmos_B2 <= cmos_B0 * 8'd128; 
36       cmos_R3 <= cmos_R0 * 8'd128;
37       cmos_G3 <= cmos_G0 * 8'd107;
38       cmos_B3 <= cmos_B0 * 8'd21;
39     end
40 end
41 
42 //-----------------------------------------------
43 //step2 consume 1clk
44 reg    [15:0]    img_Y0;
45 reg     [15:0]    img_Cb0;
46 reg     [15:0]    img_Cr0;
47 
48 always @(posedge clk or negedge rst_n)
49 begin
50     if(!rst_n)begin
51         img_Y0 <= 16'd0;
52         img_Cb0 <= 16'd0;
53         img_Cr0 <= 16'd0;
54     end
55     else begin
56         img_Y0  <= cmos_R1 + cmos_G1 + cmos_B1;
57         img_Cb0 <= cmos_B2 - cmos_R2 - cmos_G2 + 16'd32768;
58         img_Cr0 <= cmos_R3 - cmos_G3 - cmos_B3 + 16'd32768;
59     end
60     
61 end
62 //-------------------------------------------
63 //step3 conmuse 1clk
64 reg    [7:0]    img_Y1;
65 reg     [7:0]    img_Cb1;
66 reg     [7:0]    img_Cr1;
67 
68 always @(posedge clk or negedge rst_n)
69 begin
70     if(!rst_n)begin
71         img_Y1  <= 8'd0;
72         img_Cb1 <= 8'd0;
73         img_Cr1 <= 8'd0;
74     end
75     else begin
76         img_Y1  <= img_Y0  [15:8];
77         img_Cb1 <= img_Cb0 [15:8];
78         img_Cr1 <= img_Cr0 [15:8];
79     end
80     
81 end            
流水線

  RGB轉YCbCr算法的仿真過程,從圖中可以看出,加了流水線后的運算過程,每一級運算相差一個時鍾,然而每一級都在進行新的運算,我們加了3級流水線,這樣運算速度可以提升3倍。

二、 一個讓我糾結了幾個月問題

一個讓我糾結了幾個月問題

 

Altera的板子按鍵按下去時0.不按下去是1,

Altera的板子按鍵按下去時0.不按下去是1,

Altera的板子按鍵按下去時0.不按下去是1,

重要的糾結說三遍

 

Xilinx的板子按下去時1,不按是0

 

轉載請注明出處:NingHeChuan(寧河川)

個人微信訂閱號:NingHeChuan

如果你想及時收到個人撰寫的博文推送,可以掃描左邊二維碼(或者長按識別二維碼)關注個人微信訂閱號

知乎ID:NingHeChuan

微博ID:NingHeChuan

原文地址:http://www.cnblogs.com/ninghechuan/p/6970750.html 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM