讀書和實踐是學習Verilog的正確途徑。算法
本產品不能代替verilog的正規學習,同時可能有上網成癮、觀點誤導等反作用,請謹慎使用。微信
畫出CMOS反相器的電路原理圖。異步
反向器的速度與哪些因素有關?什麼是轉換時間(transition time)和傳播延遲(propagation delay)?函數
解釋一下Vih,Vil,Vol,Voh,Vt。工具
什麼是原碼,反碼,補碼,符號-數值碼。以4bit爲例,給出各自表示的數值範圍。學習
十進制轉換爲二進制編碼:
127
-127
127.375
-127.375測試
畫出CMOS三態緩衝器的電路原理圖,解釋一下高阻態。編碼
什麼是open-drain output?設計
只用2輸入mux,實現與,或,非,異或。2輸入mux定義爲code
o = s ? a : b;
相同面積的cmos與非門和或非門哪一個更快?
說明代碼中w1和 w2對應電路的具體區別:
wire [2:0] val; wire w1 = val > 0; wire w2 = val >= 0;
什麼是競爭和冒險?
設計1bit全加器,採用verilog描述並畫出門級電路圖。
設計2-4譯碼器。採用verilog描述並畫出門級電路圖。
設計BCD譯碼器,輸入0~9。採用verilog描述並畫出門級電路圖。
用verilog設計8bit奇偶校驗電路。
用verilog描述一個多路複用器,輸入的通道數目N,每一路的位寬爲M。
用verilog實現 z = abs(x - y)
1) x和y是8bit無符號數
2) x和y是8bit有符號數(2補碼)
用verilog實現取整函數(ceil、floor、round)。以5bit爲例,小數部分1位,取整後保留4bit。
wire [4:0] data; wire [3:0] data_ceil; wire [3:0] data_floor; wire [3:0] data_round;
用verilog實現乘法y = a * b
a和b都是8bit,考慮三種狀況:
1) 都是無符號數
2) 都是有符號數
3) a是有符號數,b是無符號數
輸入一個8bit數,統計其中1的個數。
求三個數的最大值:y = max(a,b,c)
wire [3:0] a,b,c;
畫一個D觸發器的電路圖。
說明D觸發器與Latch的區別。
解釋一下D觸發器的創建時間與保持時間。
解釋一下Latch的創建時間與保持時間。
用verilog實現1bit信號邊沿檢測功能,輸出一個週期寬度的脈衝信號。
1) 上升沿
2) 降低沿
3) 上升沿或者降低沿
input clk, rst_n, data; output data_edge;
用verilog實現一個4bit二進制計數器。
1) 異步復位
2) 同步復位
input clk, rst_n; output [3:0] o_cnt;
用verilog實現串並轉換。
1) lsb優先
2) msb優先
input clk, rst_n, data_i; output [7:0] data_o;
序列檢測器:有「101」序列輸入時輸出爲1,其餘輸入狀況下,輸出爲0。畫出狀態轉移圖,並用verilog描述。
input clk, rst_n, data; output flag_101;
用verilog實現兩路數據的乘法運算,要求只使用1個乘法器。
input clk, rst_n; input sel_x; input [7:0] da_x_y; input [7:0] db_x_y; output reg [15:0] dout_x_y;
名詞解釋:
ROM
RAM
SRAM
DRAM
SDRAM
EEPROM
DDR
FLASH
用verilog實現一個深度16,位寬8bit的ROM,初始值等於對應地址加上0xA0
。
moudule rom_16x8 ( ... ); ... endmodule
畫出SRAM bit cell結構圖。
用verilog實現一個單端口sram,深度16,位寬8bit。支持片選,讀寫請求,要求代碼可綜合。
module spram_16x8 ( input clk, input [3:0] addr, input [7:0] din, output [7:0] dout, ... ); ... endmodule
用verilog實現一個同步雙端口sram,深度16,位寬8bit。A口讀出,B口寫入。支持片選,讀寫請求,要求代碼可綜合。
module dpram_16x8 ( input clk, input [3:0] addr_a, output [7:0] dout_a, input [7:0] din_b, input [3:0] addr_b, ... ); ... endmodule
用verilog實現一個異步雙端口ram,深度16,位寬8bit。A口讀出,B口寫入。支持片選,讀寫請求,要求代碼可綜合。
module dpram_16x8 ( input clk_a, input [3:0] addr_a, output [7:0] dout_a, ... input clk_b, input [7:0] din_b, input [3:0] addr_b, ... ); ... endmodule
用verilog實現一個同步雙端口ram,深度16,位寬8bit。A口可讀可寫,B口可讀可寫。支持片選,讀寫請求,要求代碼可綜合。
module dpram_16x8 ( input clk, input [7:0] din_a, input [3:0] addr_a, output [7:0] dout_a, ... input [7:0] din_b, output [7:0] dout_b, input [3:0] addr_b, ... ); ... endmodule
用verilog實現一個3-tap低通FIR濾波器,輸入輸出爲8bit無符號數,濾波器係數[1/4 1/2 1/4]
module fir_lpf_3tap ( input clk, input rst_n, input [7:0] din, output [7:0] dout ); ... endmodule
用verilog實現一個3-tap低通FIR濾波器,輸入輸出爲8bit無符號數,濾波器係數[1/4 1/2 1/4]
,支持bypass功能:fir_bypass爲1時輸出原始數據。
module fir_lpf_3tap ( input clk, input rst_n, input fir_bypass, input [7:0] din, output [7:0] dout ); ... endmodule
用verilog實現一個低通FIR濾波器,輸入輸出爲8bit無符號數,濾波器係數根據mode選擇:
mode 0:bypass
mode 1:[1 2 1]/4
mode 2:[1 2 2 2 1]/8
mode 3:[1 2 3 4 3 2 1]/16
module fir_lpf ( input clk, input rst_n, input [1:0] mode, input [7:0] din, output [7:0] dout ); ... endmodule
用verilog實現一個參數化的FIR濾波器。可配置參數包括 1. 輸入輸出數據位寬N 2. 濾波器階數T 3. 濾波器係數位寬M (輸入數據與濾波器係數爲無符號數)
用verilog實現一個3-tap低通FIR濾波器,Y通路輸入輸出爲8bit無符號數,濾波器係數[1/4 1/2 1/4]。C通路bypass輸出。
module fir_lpf_3tap_YC ( input clk, input rst_n, input [7:0] yin, output [7:0] yout, input [7:0] cin, output [7:0] cout ); ... endmodule
用verilog實現 y(n) = x(n) + x(n-1) + x(n-2) + x(n-3) + x(n-4)+ x(n-5)+ x(n-6)+ x(n-7)
輸入x是8bit無符號數。
用verilog實現 y(n) = 0.75*x(n) + 0.25*y(n-1)
x, y是8bit無符號數。
用verilog實現二分頻。
用verilog實現三分頻電路,要求輸出50%佔空比。
畫出clock gating cell的原理圖。
用verilog實現靜態時鐘切換電路。外部管腳輸入sel,clk,testclk。sel爲1輸出clk,sel爲0輸出testclk。
module clkmux_DONTCH ( input sel, input clk, input testclk, output clko ); ... endmodule
用verilog實現glitch free時鐘切換電路。輸入sel,clka,clkb,sel爲1輸出clka,sel爲0輸出clkb。
解釋一下亞穩態。
用verilog實現異步復位同步釋放電路。
用verilog實現異步復位同步釋放電路,支持測試模式的復位信號切換。
用verilog實現4bit約翰遜(Johnson)計數器。
用verilog實現4bit環形計數器:復位有效時輸出0001,復位釋放後依次輸出0010,0100,1000,0001,0010…
用verilog實現按鍵抖動消除電路,抖動小於15ms,輸入時鐘12MHz。
用verilog實現PWM控制呼吸燈。呼吸週期2秒:1秒逐漸變亮,1秒逐漸變暗。系統時鐘24MHz,pwm週期1ms,精度1us。
在clk a時鐘域的一個單週期脈衝信號,如何正確的傳遞到clk b時鐘域? 要考慮clk a和b的各類不一樣頻率/相位的場景。
用verilog實現一個同步FIFO,深度16,數據位寬8bit。
用verilog實現一個異步FIFO,深度16,數據位寬8bit。
用verilog實現一個異步FIFO,深度17,數據位寬8bit。
FIFO深度計算: 寫入時鐘20MHz,讀出時鐘40MHz,每1000個時鐘週期寫入500個數據,每4個時鐘週期讀出1個數據,讀寫數據位寬一致。
用verilog實現valid-ready握手協議。
module handshake_pipe ( input clk, input rst_n, input valid_i, output ready_o, input din, output valid_o, input ready_i, output dout ); ... endmodule
用verilog實現支持valid-ready握手協議的下采樣電路:每輸入2個數據,輸出1個數據。
module handshake_pipe_ds ( input clk, input rst_n, input valid_i, output ready_o, input din, output valid_o, input ready_i, output dout ); ... endmodule
用verilog實現支持valid-ready握手協議的上採樣電路:每輸入1個數據,輸出2個數據。約定clk頻率高於輸出數據速率。
module handshake_pipe_us ( input clk, input rst_n, input valid_i, output ready_o, input [7:0] din, output valid_o, input ready_i, output [7:0] dout ); ... endmodule
用verilog實現支持valid-ready握手協議的分路電路:輸入1路數據,輸出2路數據。
module handshake_pipe_split ( input clk, input rst_n, input valid_i, output ready_o, input [7:0] din, output valid_1_o, input ready_1_i, output [7:0] dout_1, output valid_0_o, input ready_0_i, output [7:0] dout_0 ); ... endmodule
用verilog實現支持valid-ready握手協議的合併電路:輸入2路數據,輸出1路數據。
module handshake_pipe_merge ( input clk, input rst_n, input valid_0_i, output ready_0_o, input [7:0] din_0, input valid_1_i, output ready_1_o, input [7:0] din_1, output valid_o, input ready_i, output [15:0] dout ); ... endmodule
解釋一下valid-ready握手傳輸中的bubble問題,如何解決?
使用valid-ready多級流水時,ready信號通路上組合邏輯過長會帶來什麼問題?怎樣解決?
用verilog實現配置寄存器接口。
地址0 :可讀可寫RW
地址1 :只讀RO
地址2 :只寫,自動清0
地址3 :保留
module blk_ctrl ( input clk, input rst_n, input wr, input [1:0] addr, input [7:0] wdata, input rd, output [7:0] rdata ); ... endmodule
解釋一下觸發器的setup和hold,在芯片使用中若是遇到時序問題,怎樣區分是setup仍是hold的問題?
解釋一下multi cycle path
用verilog實現16bit複數乘法器。
把十進制數8.15
轉換爲單精度浮點數。
把十進制數-6.125
轉換爲雙精度浮點數。
用verilog實現32位浮點數加法。
用verilog實現16位浮點乘法。
解釋booth
乘法器實現原理。(以radix 4爲例)
用verilog實現4位超前進位加法器。
用verilog實現8位桶形移位寄存器。
用verilog實現一個深度爲16的CAM。
用verilog實現8位無符號除法。
用verilog實現8位定點數開平方。
用verilog實現log2(x)
,輸入x爲16bit無符號數。
設計1MHz正弦波發生器。
用verilog實現三輸入round robin仲裁器。
用verilog實現圖像行緩衝(line buffer),輸入數據Yi爲8bit,每行數據1920個,要求同時輸出3行,即當前數據Y0,延遲1行對應的數據Y1,延遲2行對應的數據Y2。
用verilog實現圖像的二維濾波器。輸入輸出圖像分辨率1920x1080,8bit,YUV422。濾波器爲3*3,係數8bit有符號數。濾波操做只針對Y進行處理,UV直通。
用verilog實現MAC單元:輸入32路數據A,32路數據B,都是8bit有符號數。輸出32路A乘以B的累加和。
用verilog實現激活函數ReLU
,輸入爲16bit有符號數。
用verilog實現激活函數sigmoid:f(x) = 1/(1+e^-x)
,輸入x爲16bit有符號數。
用verilog實現max pooling函數,kernel 7x7,數據16bit有符號數。
用verilog實現排序算法。輸入數據爲128個16bit有符號數。
用verilog實現一個APB接口的單口RAM,深度1024,位寬32bit。
用verilog實現一個AHB接口的單口RAM,深度1024,位寬32bit。
用verilog實現一個AXI接口的單口RAM,深度1024,位寬32bit。
解釋一下DMA控制器的基本功能與實現。
使用verilog開發項目須要用到哪些工具?
使用verilog實現APB接口的I2C模塊,兼容標準協議。
舉例說明3條使用verilog開發項目的經驗或教訓。
聲明:轉自微信公衆號。