国产精品免费无遮挡无码永久视频-国产高潮视频在线观看-精品久久国产字幕高潮-国产精品99精品无码视亚

基于至簡設(shè)計(jì)法的數(shù)字時(shí)鐘設(shè)計(jì)

發(fā)布時(shí)間:2017-2-15 16:35    發(fā)布者:mdykj33
基于至簡設(shè)計(jì)法的數(shù)字時(shí)鐘設(shè)計(jì)
明德?lián)P科技教育有限公司
  網(wǎng):www.mdy-edu.com
  寶:mdy-edu.taobao.com
QQ 群:97925396


至簡設(shè)計(jì)法數(shù)字時(shí)鐘視頻鏈接:http://www.mdy-edu.com/article_cat/video?id=20

數(shù)字時(shí)鐘是常見的畢業(yè)設(shè)計(jì)題目。我們做畢業(yè)設(shè)計(jì)時(shí),一般使用數(shù)碼管來顯示數(shù)字。小時(shí)、分鐘和秒鐘各兩位數(shù)字,所以需要用到6位的數(shù)碼管。
如果平時(shí)不動手,要做這個(gè)畢業(yè)設(shè)計(jì),很多人都會覺得挺難的。收集到的代碼,其風(fēng)格也是五花八門,第一感覺是貌似能看懂,但就是不知道怎么設(shè)計(jì)出來的。
其實(shí)如果有正確的設(shè)計(jì)思路和方法,其實(shí)現(xiàn)起來是非常簡單的。下面我們就核心的數(shù)字模塊為例,講解如何使用至簡設(shè)計(jì)法來實(shí)現(xiàn)。

數(shù)字模塊的功能,是產(chǎn)生6個(gè)信號,分別表示時(shí)十位、時(shí)個(gè)位、分十位、分個(gè)位、秒十位和秒個(gè)位的值。例如上述信號值依次為2、1、4、3、5、9時(shí),則表示時(shí)間為21點(diǎn)43分59秒。
仔細(xì)觀察6個(gè)信號,每個(gè)單獨(dú)來看,其數(shù)字都是遞增的,增加到一定數(shù)后就清零。以秒個(gè)位為例,開始時(shí)值為0,然后是1、2、3依次增加,直到變成9后,然后變成0,再次循環(huán)。其他信號都是相同的規(guī)律。這些依次遞增的信號,就是計(jì)數(shù)器。
我們認(rèn)識到這些信號是計(jì)數(shù)器,那就好辦了,明德?lián)P最擅長就是計(jì)數(shù)器的設(shè)計(jì)。計(jì)數(shù)器設(shè)計(jì)只需要考慮兩點(diǎn),什么時(shí)候加1和要數(shù)多少個(gè),明確這兩個(gè)問題后,剩下的就是套用明德?lián)P計(jì)數(shù)器模板了。
以秒個(gè)位這個(gè)計(jì)數(shù)器為例,這個(gè)計(jì)數(shù)器加1的條件是什么呢?到了1秒就加1。那我們怎么知道1秒鐘時(shí)間到了呢?FPGA是通過數(shù)時(shí)鐘周期數(shù)來確定時(shí)間的。例如下圖,假設(shè)時(shí)鐘頻率是50MHz,即時(shí)鐘周期是20ns,cnt是每個(gè)時(shí)鐘加1,則當(dāng)cnt==99時(shí),就說明數(shù)了100個(gè)時(shí)鐘周期,也就是時(shí)間是100*20=2000ns了。


同樣的道理,1秒鐘時(shí)間,我們就是數(shù)1s/20ns= 50_000_000個(gè)時(shí)鐘周期。我們也認(rèn)識到這個(gè)cnt也是計(jì)數(shù)器,其加1條件是“1”,要數(shù)50_000_000個(gè)數(shù)。我們套用明德?lián)P計(jì)數(shù)器模塊,即有下面代碼。



1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
  
14


always @(posedge clk or negedge  rst_n)begin
  
        if(!rst_n)begin
  
            cnt <= 0;
  
        end
  
        else if(add_cnt)begin
  
            if(end_cnt)
  
                cnt <= 0;
  
            else
  
                cnt <= cnt + 1;
  
        end
  
     end
  
  
     assign add_cnt = 1 ;      
  
     assign end_cnt = add_cnt && cnt== 50_000_000-1;   



代碼中,always語句除了名字后,完全套用模板,不用更改。加1條件體現(xiàn)在第13行,要數(shù)多少個(gè)體現(xiàn)在第14行。

確定了cnt后,那么秒個(gè)位的加1條件就非常明確了,就是cnt數(shù)到50_000_000個(gè),也就是end_cnt有效的時(shí)候。所以秒個(gè)位的加1條件是end_cnt。
秒個(gè)位要數(shù)多少個(gè)數(shù)字呢?由0到9,因此有10個(gè)。

綜上所述,我們得到秒個(gè)位的代碼如下表。



1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
  
14


always@(posedge clk or negedge  rst_n)begin
  
        if(rst_n==1'b0)begin
  
            miao_g <= 0;
  
        end
  
        else if(add_miao_g)begin
  
            if(end_miao_g)
  
                miao_g <= 0;
  
            else
  
                miao_g <= miao_g + 1;
  
        end
  
     end
  
  
     assign add_miao_g = end_cnt;
  
     assign end_miao_g = add_miao_g && miao_g == 10-1;



用類似于秒個(gè)位的思考方法,我們可以得到秒十位、分個(gè)位、分十位、時(shí)個(gè)位和時(shí)十位的代碼,完整的代碼如下表。



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
  
43
  
44
  
45
  
46
  
47
  
48
  
49
  
50
  
51
  
52
  
53
  
54
  
55
  
56
  
57
  
58
  
59
  
60
  
61
  
62
  
63
  
64
  
65
  
66
  
67
  
68
  
69
  
70
  
71
  
72
  
73
  
74
  
75
  
76
  
77
  
78
  
79
  
80
  
81
  
82
  
83
  
84
  
85
  
86
  
87
  
88
  
89
  
90
  
91
  
92
  
93
  
94
  
95
  
96
  
97
  
98
  
99
  
100
  
101
  
102
  
103
  
104
  
105
  
106
  
107
  
108
  
109
  
110
  
111
  
112
  
113
  
114
  
115
  
116
  
117
  
118
  
119
  
120
  
121
  
122
  
123


always @(posedge clk or negedge rst_n)begin
  
        if(!rst_n)begin
  
            cnt <= 0;
  
        end
  
        else  if(add_cnt)begin
  
            if(end_cnt)
  
                cnt <= 0;
  
            else
  
                cnt <=  cnt + 1;
  
        end
  
    end
  
  
    assign add_cnt = 1  ;      
  
    assign end_cnt = add_cnt  && cnt== 50_000_000-1;   
  
  
    always@(posedge clk or  negedge rst_n)begin
  
        if(rst_n==1'b0)begin
  
            miao_g <= 0;
  
        end
  
        else if(add_miao_g)begin
  
             if(end_miao_g)begin
  
                miao_g <=  0;
  
            end
  
            else begin
  
                miao_g <=  miao_g + 1;
  
            end
  
        end
  
    end
  
  
    assign add_miao_g =  end_cnt;
  
    assign end_miao_g =  add_miao_g && miao_g == 10-1;
  
  
    always  @(posedge clk or negedge rst_n)begin
  
        if(rst_n==1'b0)begin
  
            miao_s <= 0;
  
        end
  
        else  if(add_miao_s)begin
  
             if(end_miao_s)begin
  
                miao_s <=  0;
  
            end
  
            else begin
  
                miao_s <=  miao_s + 1;
  
            end
  
        end
  
    end
  
  
    assign add_miao_s =  end_miao_g;
  
    assign end_miao_s =  add_miao_s && miao_s == 6-1;
  
  
    always  @(posedge clk or negedge rst_n)begin
  
        if(rst_n==1'b0)begin
  
            fen_g <= 0;
  
        end
  
        else  if(add_fen_g)begin
  
             if(end_fen_g)begin
  
                fen_g <=  0;
  
            end
  
            else begin
  
                fen_g <=  fen_g + 1;
  
            end
  
        end
  
    end
  
  
    assign add_fen_g =  end_miao_s;
  
    assign end_fen_g =  add_fen_g && fen_g == 10-1;
  
  
    always  @(posedge clk or negedge rst_n)begin
  
        if(rst_n==1'b0)begin
  
            fen_s <= 0;
  
        end
  
        else  if(add_fen_s)begin
  
             if(end_fen_s)begin
  
                fen_s <= 0;
  
            end
  
            else begin
  
                fen_s <=  fen_s + 1;
  
            end
  
        end
  
    end
  
  
    assign add_fen_s =  end_fen_g;
  
    assign end_fen_s =  add_fen_s && fen_s == 6-1;
  
  
    always  @(posedge clk or negedge rst_n)begin
  
        if(rst_n==1'b0)begin
  
            shi_g <= 0;
  
        end
  
        else  if(add_shi_g)begin
  
             if(end_shi_g)begin
  
                shi_g <=  0;
  
            end
  
            else begin
  
                shi_g <=  shi_g + 1;
  
            end
  
        end
  
    end
  
  
    assign add_shi_g =  end_fen_s;
  
    assign end_shi_g =  add_shi_g &&  shi_g ==x-1;
  
  
    always  @(posedge clk or negedge rst_n)begin
  
        if(rst_n==1'b0)begin
  
            shi_s <= 0;
  
        end
  
        else  if(add_shi_s)begin
  
             if(end_shi_s)begin
  
                shi_s <=  0;
  
            end
  
            else begin
  
                shi_s <=  shi_s + 1;
  
            end
  
        end
  
    end
  
  
    assign add_shi_s =  end_shi_g;
  
assign end_shi_s = add_shi_s && shi_s == 3-1;
  
  
always@(*)begin
  
         if(shi_s==2)
  
            x  =4;
  
        else
  
            x  =10;
  
end
  




細(xì)心的讀者可以發(fā)現(xiàn),上面每段計(jì)數(shù)器格式都非常相似。沒錯(cuò),這就是明德?lián)P設(shè)計(jì)的技巧。我們設(shè)計(jì)的這套模板,基本上可以應(yīng)用于任何場合,任何時(shí)候讀者只考慮兩個(gè)因素就夠了,不會出現(xiàn)丟三落四的情況,而且每次只需要考慮一個(gè)因素,保證能做出最優(yōu)的設(shè)計(jì)。
如果你還未發(fā)現(xiàn)這代碼優(yōu)秀的地方,建議你百度下數(shù)字時(shí)鐘的代碼,好好比一比,特別是好好想想我們的設(shè)計(jì)思路,明德?lián)P是有方法有步驟、可以做到一次性設(shè)計(jì)對,而他們的則是想到哪寫到哪,每次設(shè)計(jì)都不同的想法。每次設(shè)計(jì)都是不同的思想,水平怎么能提高!

明德?lián)P整個(gè)培訓(xùn)周期,都是訓(xùn)練類似于這種固定、專業(yè)的思維方法,無論你遇到多復(fù)雜多前衛(wèi)的項(xiàng)目,都能用這種思維方式來設(shè)計(jì)。

對了,上面代碼中,我們沒有補(bǔ)充信號定義這些。其實(shí)我們認(rèn)為這些信號定義純屬體力勞動,是根本就不需要學(xué)習(xí)的,所以我們就沒列出來。讀者有興趣可必補(bǔ)充。另外加上數(shù)碼管譯碼電路,那么一個(gè)完整的數(shù)字時(shí)鐘代碼就出來了。

本文地址:http://www.4huy16.com/thread-353756-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區(qū)
  • 電動兩輪車設(shè)計(jì)生態(tài)系統(tǒng)
  • 技術(shù)熱潮席卷三城,2025 Microchip中國技術(shù)精英年會圓滿收官!
  • Microchip第22屆中國技術(shù)精英年會上海首站開幕
  • “芯”光璀璨,鵬城共賞——2025 Microchip中國技術(shù)精英年會深圳站回顧
  • 貿(mào)澤電子(Mouser)專區(qū)

相關(guān)在線工具

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表