FPGA設計中一些經驗

2022-08-26 21:12:20 字數 3635 閱讀 3596

1 verilog的技術點23

1. 0-n迴圈計數器

4////////////////////////

//0-n迴圈計數器

5reg [19:0]cnt;

6always@(posedge clk or

negedge rst_n)

7if(!rst_n)

8 cnt<=20

'd0;

9else

if(cnt<20

'dn)

10 cnt<=cnt+1

'b1;

11else

12 cnt<=20

'd0;

13 或者

14reg [19:0]cnt;

15always@(posedge clk or

negedge rst_n)

16if(!rst_n)

17 cnt<=20

'd0;

18else

if(cnt==(20

'dn-1))

19 cnt<=20

'd0;

20else

21 cnt<=cnt+1

'b1;

2223

2. 復位訊號的處理

241. 如果沒有使用pll模組,則將rst打兩拍,形成「非同步復位,同步釋放」;

252. 如果使用了pll模組,則:

26 a. 先將rst打兩拍,形成「非同步復位,同步釋放」的同步復位rst1;

27 b. 取pll_rst = ~rst1 和 clk送入pll模組,並將locked訊號 和 rst相「與」形成 rst2;/*

注1_2

*/28 c. 再將rst2打兩拍,形成「非同步復位,同步釋放」的同步復位sys_syc_rst;

29 即(1) 還可以做個上電200us計數器,200us_ok高電平表示上電200us,在b中rst2=rst & locked & 200us_ok

30 (2) 外部復位釋放 且

31 pll輸出穩定 且

32 上電已滿200us,系統內部電路的復位才釋放,開始執行;

3334

input clk;

35input rst_n;

36output rst_nr2;

37reg rst_nr1,rst_nr2;

38//

非同步復位,同步釋放

39always@(posedge clk or

negedge rst_n)

40if(!rst_n)

41 rst_nr1<=1

'd0;

42else

43 rst_nr1<=1

'd1;

44//

再用一級暫存器進行同步處理

45always@(posedge clk or

negedge rst_n)

46if(!rst_n)

47 rst_nr2<=1

'd0;

48else

49 rst_nr2<=rst_nr1;

50//

如下處理後,可以保證系統充分穩定後(復位按鍵釋放 且 pll輸出穩定)才退出復位狀態,開始執行

51wire sys_rst_nr0 = rst_n & pll_locked;

52//

一級同步

53always@(posedge clk or

negedge rst_n)

54if(!sys_rst_nr0 )

55 sys_rst_nr1<=1

'd0;

56else

57 sys_rst_nr1 <=1

'd1;

58//

二級同步

59always@(posedge clk or

negedge rst_n)

60if(!sys_rst_nr0 )

61 sys_rst_nr2 <=1

'd0;

62else

63 sys_rst_nr2 <=sys_rst_nr1;

64//

生成最終系統復位訊號:控制其它電路

65wire sys_rst_n = sys_rst_nr2;

6667

3.帶使能端的暫存器

68 (輸出埠資料在en和clk控制下進行週期更新,每個資料的維持時間為以時鐘週期t的整數倍)

69reg en_regout;

70always@(posedge clk or

negedge rst_n)

71if(!rst_n)

72 en_regout<=1

'd0;

73else

if(en==1

'd1)

74 en_regout<=en_regin; //

en有效,資料在時鐘沿更新;不然,一直保持原值

753.1分頻時鐘:系統時鐘+分頻使能訊號=分頻時鐘

76 (a)最佳用pll產生分頻時鐘

77 (b)沒有pll時,用計數器產生分頻時鐘,但推薦用「分頻使能時鐘」

78 即用計數器產生分頻單週期脈衝,將之作為使能訊號配合原時鐘驅動外部reg

79 《===》用原時鐘的分頻時鐘 驅動外部reg

8081

8283

4.上公升沿和下降沿檢測器

84//

input signal

85reg signal_r;

86always@(posedge clk or

negedge rst_n)

87if(!rst_n)

88 signal_r<=1

'd0;

89else

90 signal_r<=signal;

9192

wire rising_edge_flag = signal & (!signal_r) ; //

判斷按鍵動作:按下?釋放?

93wire faling_edge_flag = (!signal) & signal_r ;

9495

5.跨時鐘域處理(同步處理)

965-0.使用接收域時鐘對輸入訊號進行2級同步處理;

975-1.單向控制訊號檢測

98 (用接收域時鐘檢測輸入控制訊號的上公升沿、下降沿;

99 利用單週期寬度的上公升沿、下降沿標誌作為控制使能訊號)

1005-2.專用握手訊號

1015-3.使用fifo

102103

6.m4k使用:寬度最大只能到36bit

104105

7.如何解決verilog中引數化的賦值:賦全0,賦全1,賦全z,賦全x

106 結論:賦全0、全x或者全z可採用'

b0、'bx或者'

bz的方式;

107 賦全1可採用賦~0或賦-1的方式較為簡潔。

Enumeration 使用中一些經驗

vector v new vector for int i 0 i 10 i v.add new integer i enumeration e v.elements while e.hasmoreelements system.out.println v.size 如果沒去執行這段程式,可能有的人...

MTK開發中一些經驗總結

1.在確定你的mtk工程完整而且在模擬器和真機上能正常執行 之前,不要開始工作。2.mtk開發 c是唯一選擇,不要試圖用把c 工程移植到mtk平台。3.ads c c compiler不同的編譯選項可能導致 的效能差異很大。ads使用armv4指令集,而真機是thumb指令集。4.mmi gui的工...

AND一些經驗

目錄 一 參考 1 程式設計師2020工作規範范文 總結 good 適合多看,程式設計師每天 每月做的事情總結了 一 目的 1 在公司來了很久了,有時候一些經驗想把記錄下來,專案 做人 等等 一 專案 1 板卡 pci2012a分為支援和不支援音效卡的 一 做人 1 不要過度依賴別人 1 有問題立馬...