模型功能
- always實現時序邏輯
- assign實現組合邏輯
- 兩者共同構成數字系統
模型框圖
reg r_A;
wire w_A;
always@(posedge clk)
begin
if(!i_rst_n)
begin
r_A <= 1'b0;
end
else
begin
r_A <= ~r_A;
end
end
assign w_A = r_A;
實現步驟
- always的電路描述
- always@(posedge clk)實現觸發器FF(也可以作為鎖存器,但是FPGA內很少見)
- 觸發器的復位包括三種:同步復位、異步復位、時鐘使能(本人按照作用進行劃分,非傳統復位)
- 同步復位不需要將復位加入到敏感列表
- 異步復位則需要加入
- 時鐘使能則是需要將值進行保持
- 之所以將前面三種模式聯合,是因為這三種信號共同組成了control sets
- 對于FPGA來說,相近的邏輯使用相同的control sets可以提高資源利用率
- 所以always描述應當盡可能保持一致,以降低資源浪費
- 觸發器的復位包括三種:同步復位、異步復位、時鐘使能(本人按照作用進行劃分,非傳統復位)
- always@(*)實現的是組合邏輯,一般用于希望使用case的組合邏輯
- assign的簡單使用
- 將wire信號和其他信號關聯,實現復雜的線邏輯
- assign形成的硬件包含了所有的組合邏輯
- 高低電平轉化
- DUT邏輯
- 比較器
- always和generate的綜合使用
- always也可以在generate內形成級聯邏輯
- 具體的用法可以見前一章的reg級聯中的示例
- 本章需要解釋的是always級聯后的硬件意義
- always級聯時,依舊遵循module類似的原則
- 相同位寬進行復制、不同位寬進行補位
- 其底層的硬件邏輯是先構建一定數量的FF
- 然后按照原則將所有的端口進行級聯
- always級聯時,依舊遵循module類似的原則
- 最終,該級聯會形成一個可以調整的邏輯組,用于實現一些復雜的邏輯
parameter STR = "hello";
reg [7:0] r_string [0:9-1];
generate genvar i;
for(i = 0; i < 9; i = i + 1)
begin: FOR_9
always@(posedge clk)
begin
r_string[i] <= STR[8*(i+1)-1:8*i];
end
end
endgenerate
- 上圖是一個簡單的將字符串緩存到二維變量的例子
- 如果加入一些判斷條件,就可以進行字符串的遍歷
- 更加重要的時,for里面可以在進行for,實現快速的bit位尋找
- 比如找出128'h00010023000340中的最高位
- 使用for可以得到極其簡易的代碼,且方便修改
最終效果
- 略
調用接口
- 略
======== ======\\ ======= -
|| || \\ // \\ /-\
|| || || // // \\
|| || // || // \\
====== ======= || === ========
|| || || \\ // \\
|| || \\ || // \\
|| || \\ // // \\
|| || ======= // \\
作者:綠葉落秋風,專注FPGA技術分析和分享,轉載請注明原文鏈接:http://www.rzrgm.cn/electricdream/p/18104765,文中資源鏈接如下:
1. GITHUB開源倉庫
浙公網安備 33010602011771號