FPGA/IC筆試——商湯科技


1、如果線網類型變量說明后未賦值,起缺省值是(z)?

2、電子系統設計優化,主要考慮提高資源利用率減少功耗(即面積優化)以及提高運行速度(即速度優化) ,下列方法 ( A)不屬於面積優化。

A、流水線設計

B、資源共享

C、邏輯優化

D、串行化

3、reg[7:0] mema[255:0]正確的賦值是(A)

A、mema[ 5]=3'd0

B、mema[ 5][3:0]=4'd1

C、mema [8][8]=8'd0

D、都正確

4、某設計中使用了DDR3-1066,數據位寬32bit,FPGA工程中實現的DDR3 controller時鍾為800MHz, 應用端時鍾為200MHz, 數據位寬為128bit,請問,應用端DDR3可用的理論帶寬為(B)

A、4264MB/ s
B、3200MB/ s
C、6400MB/ s
D、2132MB/ s

【解析】三種頻率:內核頻率(內存的真實運行頻率);時鍾頻率(即I/O Buffer輸入輸出緩沖的傳輸頻率);等效頻率(數據傳輸頻率)。

DDR3-1066數據位寬為32bit,則等效頻率為1066Mbps,內核頻率為1066/8 = 133Mbps

DDR3-1066 理論帶寬 = 1066 * 32 / 8 = 4264;FPGA內存帶寬 = 800 * 32 / 8 = 3200;應用端帶寬 = 200 * 128 / 8 = 3200取瓶頸3200

5、解釋名詞:建立時間,保持時間和亞穩態。

建立時間:時鍾脈沖沿到來之前,數據保持穩定不變的時間。
保持時間:時鍾脈沖沿到來之后,數據保持穩定不變的時間。
亞穩態:亞穩態是指觸發器無法在某個規定的時間段內到達一個可以確認的狀態。

6、異步FIFO設計注意事項有哪些?

(1)在地址信號跨時鍾域時需要對其進行二進制碼轉格雷碼的轉換並進行目標時鍾域的時鍾打兩拍同步,以防止亞穩態的產生。
(2)寫滿信號由讀地址同步到寫時鍾域並與寫地址進行比較產生,讀空信號由寫地址同步到讀時鍾域並與讀地址進行比較產生。這樣可以在第一時間得到讀空與寫滿的信息,並對異步fifo進行操作。
(3)異步fifo的深度需要考慮到寫狀態的背靠背寫入狀態以得到最適合的深度。
(4)讀寫地址需要擴展一位來判斷是讀空還是寫滿,當擴展后的讀寫地址的格雷碼相等時為讀空,若其前兩位不同,后面相等時為寫滿。

設計難點:讀寫指針和空滿信號的處理

FIFO的讀寫指針是指讀寫地址,但是讀寫指針一般比真正用來讀寫的Memory地址要多一位,用來判斷空滿信號。多一位的讀寫指針周期性如下圖所示,verilog代碼為 assign gray = (bin>>1) ^ bin;

img

寫指針總是指向下一個要寫入的地址。寫操作到來時,數據寫入寫指針指向的地址,然后指針指向下一個要寫入的地址。

讀指針總是指向下一個要讀取的地址。要讀的數據會提前准備在輸出數據端口的緩存中,讀操作到來時,數據發送至端口,讀指針指向下一個要讀取的地址。

產生空滿信號:

空信號用來防止FIFO的underflow(下溢),當讀指針追上寫指針的時候表示空信號,寫指針需要同步到讀指針時鍾域之后的寫指針。

滿信號用來防止FIFO的overflow(上溢),當寫指針追上讀指針的時候表示滿信號,讀指針需要同步到寫指針時鍾域之后的讀指針。

由於是異步FIFO的設計,讀寫時鍾不一樣,在產生讀空信號和寫滿信號時,會涉及到跨時鍾域的問題,在讀寫指針上可能會產生亞穩態。需要通過兩級寄存器同步和格雷碼進行跨時鍾域處理。

分別將寫時鍾域的寫指針同步到讀時鍾域,將同步后的寫指針與讀時鍾域的讀指針進行比較產生讀空信號;將讀時鍾域的讀指針同步到寫時鍾域,將同步后的讀指針與寫時鍾域的寫指針進行比較產生寫滿信號。

同步會消耗至少一個時鍾周期的延遲,可能會引起保守的判斷,比如寫指針同步到讀時鍾域,同步后的寫指針小於等於當前實際的寫指針,此時判斷的FIFO為空不一定是真空;同理讀指針同步到寫時鍾域,同步后的讀指針小於等於當前實際的讀指針,此時判斷的FIFO為滿不一定是真滿。於是同步的延遲雖然比較保守,但是可以保證FIFO的特性,不會出錯。

舉個例子:大多數情形下,異步FIFO兩端的時鍾不是同頻的,或者讀快寫慢,或者讀慢寫快,慢的時鍾域同步到快的時鍾域不會出現漏掉指針的情況,但是將指針從快的時鍾域同步到慢的時鍾域時可能會有指針遺漏,舉個例子以讀慢寫快為例,進行滿標志判斷的時候需要將讀指針同步到寫時鍾域,因為讀慢寫快,所以不會有讀指針遺漏,同步消耗時鍾周期,所以同步后的讀指針滯后(小於等於)當前讀地址,所以可能滿標志會提前產生,滿並非真滿。進行空標志判斷的時候需要將寫指針同步到讀指針 ,因為讀慢寫快,所以當讀時鍾同步寫指針 的時候,必然會漏掉一部分寫指針,我們不用關心那到底會漏掉哪些寫指針,我們在乎的是漏掉的指針會對FIFO的空標志產生影響嗎?比如寫指針從0寫到10,期間讀時鍾域只同步捕捉到了3、5、8這三個寫指針而漏掉了其他指針。當同步到8這個寫指針時,真實的寫指針可能已經寫到10 ,相當於在讀時鍾域還沒來得及覺察的情況下,寫時鍾域可能偷偷寫了數據到FIFO去,這樣在判斷它是不是空的時候會出現不是真正空的情況,漏掉的指針也沒有對FIFO的邏輯操作產生影響。

通過格雷碼也可以降低亞穩態的發生,將添加一位后的二進制地址嗎轉換成格雷碼,格雷碼是帶有鏡像對稱的編碼,低三維管委中心對稱,分成兩部分的低二位關於各部分的中心對稱,如下圖所示:

img

如圖可觀察出,寫滿和讀空兩種狀態可以根據最高位來判斷:

Ⅰ、當兩個最高位相反,后三位相同時為寫滿;

Ⅱ、當兩個完全相等時為讀空。

原文鏈接:https://blog.csdn.net/persistlzy/article/details/107692874

7、在一個FPGA項目中,既有建立時間異常(setup violation),也有保持時間異常(hold violation),應該如何修改設計以使其正常工作?

​ 對於建立時間異常的路徑,可以適當降低時鍾頻率,修改組合邏輯電路以減少組合邏輯的延時,選擇傳輸延時更少的寄存器,並可以適當增大時鍾延時;
​ 對於保持時間異常的路徑,修改組合邏輯電路以增加組合邏輯的延時,選擇傳輸延時更長的寄存器,並可以適當增大時鍾延時,數據有效狀態各增加一個或幾個(根據建立和保持時間而定)時鍾周期。

8、一個32bit浮點的累加器,A = A + data, A初始化為0, data為串行輸入數據流,包含數據使能信號,加法器延遲5個時鍾周期。請問如何用verilog語言實現一個累加器。

module MULTY_ADD(
input clk,
input rst_n,
input [8:0]data,
output [31:0]A
);
parameter IDLE = 3'b000;
parameter T1 = 3'b001;
parameter T2 = 3'b010;
parameter T3 = 3'b011;
parameter T4 = 3'b100;
reg [31:0]mid;
reg cur_state,nxt_state;
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        cur_state <=IDLE;
        nxt_state <=IDLE;
    end
    else begin
        cur_state <= nxt_State;
    end
end

always@(*) begin
    if(data[0] == 1) begin
        case(cur_state)
            IDLE: begin
                    nxt_state <= T1;
            end
            
            T1: begin
                    nxt_state <= T2;
            end
            T2: begin
                    nxt_state <= T3;
            end
            T3: begin
                    nxt_state <= T4;
            end
            
            T4: begin
                    nxt_state <= IDLE;
            end
            default :begin
                 nxt_state <= IDLE;
            end
            
        endcase
    end
end
always@(posedge clk or negedge rst_n) begin
    if(!rst_n ) begin
             mid <= 32'b0;
    end
    if(data[0] == 1) begin
        case(cur_state)
            IDLE: begin
                   mid <= mid + {24'b0,data[8:1]};
            end
            T1: begin
                    mid <= mid + {16'b0,data[8:1],8'b0};
            end
            T2: begin
                    mid <= mid + {8'b0,data[8:1],16'b0};
            end
            T3: begin
                    mid <= mid + {data[8:1],24'b0};
            end
            default:begin
                    mid <= mid;
            end
        endcase
    end
end
assign A = mid;
endmodule

9、用D觸發器實現2倍分頻的Verilog描述?

module Div(
    input 	clk,
	input 	rst_n,
	output 	Q
);
reg 	Q;
 
always @(posedge clk or negedge rst) begin
	if (!rst_n) begin
		Q <= 0;
	end
	else begin
		Q <= ~Q;
	end
end
endmodule

10、某FIR濾波器的頻率響應為H(z)= a + bz-1+bz-2+cz-3。現需要對某采樣輸入信號x(n)濾波,濾波器和輸入信號同屬於一個時鍾域,頻率300MHz。

a) 請畫出濾波器的實現框圖;

b) 假如乘法器輸出延遲5個時鍾周期,加法器延遲7個時鍾周期,輸入到輸出的最小延遲是多少?

c) 若輸入都是定點數據,如何做量化處理?

img

如上圖所示,輸入數據x先延時3個周期,再並行乘以各自的系數,再前兩個和后兩個並行相加,最后再加一次:

總公式為:y(n) = ax(n) + bx(n-1) + bx(n-2) + c*x(n-3);

第一步:延時三個周期分別得到x(n-1)、x(n-2)、x(n-3)和當前數據x(n);

第二步分別乘以各自系數:ax(n)、bx(n-1)、bx(n-2)、cx(n-3);

第三步第一次加法:ax(n) + bx(n-1)和bx(n-2) + cx(n-3);

第四步第二次加法:ax(n) + bx(n-1) + bx(n-2) + cx(n-3)

所以總周期數為3+5+7+7 = 22clk


免責聲明!

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



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