免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
FPGA整潔代碼之道3-信號命名和定義應(yīng)該明確

在設(shè)計中,我們不斷的給目錄、源代碼、文件、函數(shù)、變量、參數(shù)、類、封包進(jìn)行命名與定義。當(dāng)一件工作需要進(jìn)行的次數(shù)非常之多,足以證明它是不可或缺的基本工作。我們一定要知道一點,基礎(chǔ)工作是整個項目的基石。忽視抑或是輕視基礎(chǔ)工作是一件非常錯誤的工作理念。我們需要用最嚴(yán)謹(jǐn)認(rèn)真的態(tài)度去對待,同時作為回報,它將令你的作品顯得專業(yè)而優(yōu)雅。

我們以信號的定義為例來說明這個問題。先來看這么一組代碼:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

4344

45

464748

always @(posedge clk or negedge rst_n)begin

if(!rst_n)begin

cnt <=>

end

else if(add_cnt)begin

if(end_cnt)

cnt <=>

else

cnt <= cnt="" +="">

end

end

assign add_cnt = flag1||flag2 ;

assign end_cnt = add_cnt && cnt==x-1 ;

always @(posedge clk or negedge rst_n)begin

if(rst_n==1'b0)begin

flag1 <=>

end

else if(en1)begin

flag1 <=>

end

else if(end_cnt)begin

flag1 <=>

end

end

always @(posedge clk or negedge rst_n)begin

if(rst_n==1'b0)begin

flag2 <=>

end

else if(en2)begin

flag2 <=>

end

else if(end_cnt)begin

flag2 <=>

end

end

always @(*)begin

if(flag1)

x = 5;

else if(flag2)

x = 7;

else begin

x = 0;

end

end

這組代碼的功能是當(dāng)en1時計數(shù)5下;en2計數(shù)7下。在這組代碼中,en1時flag1拉高;end-cnt時flag1變低;en2時flag2拉高;end-cnt時flag2變低;也就是在flag1或者flag2時加一,然后用flag1和flag2分別區(qū)分計數(shù)5下和7下。

盡管能夠?qū)崿F(xiàn)功能,但是在這組代碼中,存在信號定義不明確得現(xiàn)象。flag1和flag2到底是什么意思?是表示flag1(flag2)時en1產(chǎn)生,還是en1(en2)時的計數(shù)狀態(tài)?為說明這一點就得用到XXXXX (寫加一條件時需要用到add_cnt = flag1||flag2)語句。

這里重申一下我們很重要的那條簡單原則,一個代碼(信號)只做一件事且做好這件事!按照這個規(guī)則,思路就是這樣了:用一個信號flag1來表示計數(shù)狀態(tài),另外一個信號flag2表示是由en1還是en2所產(chǎn)生。那么,加一與否的條件非常簡單,就是是否處于工作狀態(tài)(flag1);同理,計數(shù)5或者7下只需要使用flag2一個信號。那么代碼就會是這樣:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

3839

404142

43

44

45

always @(posedge clk or negedge rst_n)begin

if(!rst_n)begin

cnt <=>

end

else if(add_cnt)begin

if(end_cnt)

cnt <=>

else

cnt <= cnt="" +="">

end

end

assign add_cnt = flag1 ;

assign end_cnt = add_cnt && cnt==x-1 ;

always @(posedge clk or negedge rst_n)begin

if(rst_n==1'b0)begin

flag1 <=>

end

else if(en1||en2 )begin

flag1 <=>

end

else if(end_cnt)begin

flag1 <=>

end

end

always @(posedge clk or negedge rst_n)begin

if(rst_n==1'b0)begin

flag2 <=>

end

else if(en1)begin

flag2 <=>

end

else if(en2)begin

flag2 <=>

end

end

always @(*)begin

if(flag==0)

x = 5;

else

x = 7;

end

看到這里,也許有些朋友會覺得:好像區(qū)別沒那么大???ok,我們假設(shè)一下,如果程序中不僅是是en1,en2,而是有en3,en4……enX,又或者將來需要維護(hù)和優(yōu)化,這兩者的區(qū)別將會天壤之別。

關(guān)于信號定義方面,《至簡設(shè)計法》的作者潘文明給出了一個近乎完美的答案。例如在計數(shù)器代碼設(shè)計中的“架構(gòu)八步法”,第一步就是明確定義信號,用具體、清晰且無疑異的語句,定義每個信號所要實現(xiàn)的功能,以及重點描述信號的變化情況。如下圖中的信號列表。

信號列表。(4)(用文字版)

信號名

I/O

位寬

說明

clk

I

1

系統(tǒng)工作時鐘

rst_n

I

1

系統(tǒng)復(fù)位信號

Din_sop

I

1

當(dāng)vld=1時才有效,輸入報文頭指示信號

Din_eop

I

1

當(dāng)vld=1時才有效,輸入報文尾指示信號

Din_vld

I

1

輸入數(shù)據(jù)有效標(biāo)志,高電平有效

Din_err

I

1

輸入報文錯誤標(biāo)志,在eop有效時才有效

din

I

8

輸入數(shù)據(jù)總線

Dout_sop

O

1

當(dāng)vld=1時才有效,輸出報文頭指示信號

Dout_eop

O

1

當(dāng)vld=1時才有效,輸出報文尾指示信號

Dout_vld

O

1

輸出數(shù)據(jù)有效標(biāo)志,高電平有效

dout

O

8

輸出數(shù)據(jù)總線

Dout_err

O

1

輸出報文錯誤標(biāo)志,在eop有效時才有效

從中可以看出,優(yōu)秀的FPGA設(shè)計師一開始就從頂層結(jié)構(gòu)明確定義信號,將可能出現(xiàn)的混亂從根源上解決。這樣的思路和方法實在非常值得我們每一位從業(yè)者學(xué)習(xí)和借鑒。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
【精品博文】從零開始學(xué)FPGA系列練習(xí)一:計數(shù)器設(shè)計
UART通信接口設(shè)計
MCU與FPGA串口通信
初識FPGA:各種RTL小型電路模塊的設(shè)計
基于CPLD/FPGA的呼吸燈效果實現(xiàn)_呼吸燈源碼_明德?lián)P資料
【記錄】關(guān)于IIC的學(xué)習(xí)以及調(diào)試
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服