一、2x1 MUX實現邏輯門(傳輸門可化簡)
- 各種邏輯門均可以使用三目運算符實現,三目運算符F = X?B:A 對應於2x1 MUX可見下圖。
1、與門:F=A?B:0;或門:F=A?1:B;非門:F=A?0:1;傳輸門:F=A:1:0;
2、異或:F=A?(B?0:1):(B?1:0);同或:F=A?(B?1:0):(B?0:1);(傳輸門化簡後僅使用2個2選1MUX),其中inv可替換非門。
參考:加油站| 邏輯電路中的24種表達式(大疆通用硬件崗解析)
二、邊沿檢測
如上圖所示dat爲輸入信號,紅色虛線所標即爲輸入信號上升沿,藍色虛線所標即爲輸入信號下降沿,pose_dge爲上升沿檢測信號,nege_dge即爲下降沿檢測信號。(assign寫法)
1、對應verilog代碼爲:
module u1(
input CLK,
input dat,
input rst_n,
output pose_dge,
output nege_dge
);
reg dat_delay;
always @(posedge CLK)begin
if(!rst_n)
dat_delay <= 1'b0;
else
dat_delay <= dat;
end
assign pose_dge = rst_n ? (dat)&(~dat_delay ) : 0;
assign nege_dge = rst_n ? (~dat)&(dat_delay ) : 0;
endmodule
2、時序改寫verilog:
- 該方法會使得輸出延後一個時鐘
module u2(
input CLK,
input dat,
input rst_n,
output pose_dge,
output nege_dge
);
reg dat_delay,pose_dge,nege_dge;
always @(posedge CLK)begin
if(!rst_n)
dat_delay <= 1'b0;
else
dat_delay <= dat;
end
always @(posedge CLK)begin
if(!rst_n)
pose_dge <= 1'b0;
else
pose_dge <= (dat)&(~dat_delay );
end
always @(posedge CLK)begin
if(!rst_n)
nege_dge<= 1'b0;
else
nege_dge<= (~dat)&(dat_delay );
end
endmodule
3、同時檢測上升下降沿:
不難發現上升沿檢測爲形式,下降沿檢測爲形式,同時檢測即爲異或操作即可 dat^dat_delay。
4、快時鐘域 向慢時鐘域 傳輸脈衝數據 :
由於快時鐘域數據週期短,存在漏檢情況,除了週期展寬之外還可以將數據轉化爲沿,即發送端數據每存在一個脈衝,輸出信號進行一次翻轉,輸出信號跨時鐘域打拍後(需要多打一拍作爲延遲信號),進行邊沿檢測(異或)即可恢復。
參考:加油站| 單比特信號跨時鐘域問題詳解(大疆FPGA邏輯崗A卷)
三、使用卡諾圖進行化簡/形式變化
- 最小項,最大項,最小項化簡式,最大項化簡式 之間互相轉化時,已知最小項將K圖標1,剩下標0即爲最大項對應項,畫圈化簡即可得到最大項化簡式,最大項轉化最小項反之。
- 最大項本身對應卡諾圖行列標號是相反的:如,對應標號爲 00/1。
- K圖細節知識參考:卡諾圖化簡法
四、異步FIFO實現
- 其中FIFO深度計算公式(快時鐘域至慢時鐘域)爲:
爲給出單週期中最大發送量,爲慢時鐘頻率,爲快時鐘頻率。
- verilog實現中的關鍵點:
1、 二進制轉格雷碼:a^(a>>1);
2、格雷碼轉二進制(假設N位數據):
parameter N=
assign binary[N-1]=grey[N-1];
//
generate
genvar i;
for(i=N-2;i>=0;i=i-1)
assign binary[i] = grey[i+1]^binary[i];
//
end
endgenerate
參考:verilog實現格雷碼與二進制的轉化
3、加入標誌位(標誌兩個指針之間計數週期差別)後的格雷碼空滿比較(默認讀指針不會超過寫指針):讀空:格雷碼相同,由於打拍可能出現虛空;
寫滿:格雷碼高兩位相異,其餘位相同,由於打拍可能出現虛滿;
- 具體verilog實現及詳細分析參考:異步FIFO—Verilog實現
五、靜態時序分析
- 建立時間需滿足:
- 保持時間需滿足:
- 可根據建立時間餘量(Setup Slack)爲0時對應的得到。