0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

FPGA學(xué)習(xí)系列:19. rom到數(shù)碼管顯示設(shè)計

FPGA學(xué)習(xí)交流 ? 2018-06-18 19:24 ? 次閱讀

設(shè)計背景:

rom是讀寫的的靜態(tài)存儲單元,在我們的設(shè)計中我們會經(jīng)常用到,數(shù)碼管模塊同樣的大大小小的設(shè)計還是工程應(yīng)用中都有這至關(guān)重要的作用。

設(shè)計原理:

前幾節(jié)我們學(xué)習(xí)了rom存儲器的設(shè)計,還有數(shù)碼管模塊的設(shè)計,為了我們聯(lián)系這兩個模塊的應(yīng)用我們今天將設(shè)計一個按鍵來控制讀取rom中的數(shù)據(jù),來顯示到數(shù)碼管上。

因為我們的數(shù)碼管模塊的顯示頻率是10K,所以我們應(yīng)該小于10K的頻率給一個rom地址,從而出一個數(shù)據(jù),我們的設(shè)計是0.5s出一個數(shù)據(jù),這樣我們就能在數(shù)碼管上顯示隨著地址的增加,數(shù)據(jù)同樣也在變化。

第一步我們要先設(shè)計我們的.mif文件,我們在前10個地址是上寫入0 -- 10,然后建立一個rom 的ip核,添加進去從而便于后面的例化。

設(shè)計模塊,我們前面講過數(shù)碼管模塊,這樣就可以直接拿過來用了,今天我們將主要給大家展示我們的rom控制模塊。

設(shè)計架構(gòu)圖:

image.png

設(shè)計代碼:

頂層模塊

0modulerom_seg (clk,rst_n,key,sel,seg_n);

1

2 inputclk,rst_n;

3 inputkey;

4 output[7:0]seg_n;//段選信號

5 output[2:0]sel;//位選信號

6

7 wire[3:0]data;

8 wire[23:0]hex;

9

10 //6個數(shù)碼管上顯示同樣的數(shù)據(jù)

11 assignhex[23:0]= {data[3:0],data[3:0],data[3:0],data[3:0],data[3:0],data[3:0]};

12

13 rom rom_inst ( //rom控制模塊的例化

14 .key(key),

15 .clk(clk),

16 .rst_n(rst_n),

17 .data(data)

18 );

19

20

21 seg SEG( //數(shù)碼管模塊的裂化

22 .clk(clk),

23 .rst_n(rst_n),

24 .sel(sel),

25 .seg7(seg_n),

26 .data_in(hex)

27 );

28

29

30endmodule

設(shè)計模塊

0modulerd_rom (key,clk,rst_n,addr);

1

2 inputclk;//輸入系統(tǒng)時鐘

3 inputrst_n;//輸入系統(tǒng)復(fù)位

4 inputkey;//按鍵控制

5

6 outputreg[3:0]addr;

7 reg[31:0]cnt;

8

9 always@(posedgeclk ornegedgerst_n)

10 begin

11 if(!rst_n)//異步復(fù)位

12 addr <=0;

13 elseif(addr <15&&key ==0&&cnt ==50000000/2-1)

14 addr <=addr +1'b1;//地址加1

15 else

16 addr <=addr;

17 end

18

19 always@(posedgeclk ornegedgerst_n)

20 begin

21 if(!rst_n)

22 begin

23 cnt<=0;

24 end

25 else

26 begin

27 if(cnt <50000000/2-1)// 50000000/10000/2 1hz的一 28 cnt <=cnt +1;

29 else

30 cnt <=0;

31 end

32 end

33endmodule

測試模塊

0`timescale1ns/1ps

1

2modulerom_seg_tb;

3

4 regclk;

5 regrst_n;

6 regkey;

7

8 wire[2:0]sel;

9 wire[7:0]seg_n;

10

11 initialbegin

12 clk =0;

13 rst_n =0;

14 key =1;

15

16 #200.1rst_n=1;

17 #200

18 forever

19 begin

20 #50key =1; //模擬按鍵

21 #50key =0;

22 end

23 end

24

25 always#10clk =~clk;

26

27 rom_seg rom_seg_dut( //例化頂層模塊

28 .clk(clk),

29 .rst_n(rst_n),

30 .key(key),

31 .sel(sel),

32 .seg_n(seg_n)

33 );

34

35endmodule

仿真:

image.png

在設(shè)計我們可以看到我們讀出了第一個數(shù),然后下面的數(shù)我們可以調(diào)整我們的計數(shù)單元來通過顯示。

數(shù)碼管模塊我們可以用我們以前的 或者下面的:

0moduleseg(clk,rst_n,sel,seg7,data_in);//端口定義

1

2 inputclk;

3 inputrst_n;

4 input[23:0]data_in;//輸入6個燈的數(shù)據(jù)

5

6 outputreg[2:0]sel;

7 outputreg[7:0]seg7;

8

9 parameters0 =3'b000;

10 parameters1 =3'b001;

11 parameters2 =3'b010;

12 parameters3 =3'b011;

13 parameters4 =3'b100;

14 parameters5 =3'b101;

15

16 //`define T1ms 50_000 //定義1k的計數(shù)值

17 `defineT1ms 5

18 reg[15:0]count;

19 wireflag;

20 always@(posedgeclk ornegedgerst_n)

21 if(!rst_n)

22 begin

23 count <=15'b0;

24 end

25 else

26 if(count ==`T1ms-1)//計數(shù)到1MS

27 begin

28 count <=15'b0;

29 end

30 else

31 begin

32 count <=count +1'b1;

33 end

34

35 assignflag =(count ==`T1ms-1)?1'b1:1'b0;//標志位賦值

36

37 reg[2:0]state;

38 reg[3:0]num;

39 always@(posedgeclk ornegedgerst_n)

40 if(!rst_n)

41 begin

42 sel <=3'b0;

43 state <=3'b0;

44 num <=4'b0;

45 end

46 else

47 begin

48 case(state)

49 s0:begin

50 if(flag)

51 state <=s1;//亮第一個燈,給24位數(shù)據(jù)的 4

52 else

53 begin

54 sel <=3'b000;

55 num <=data_in[23:20];

56 end

57 end

58 s1:begin

59 if(flag) ////亮第2個燈,給24位數(shù)據(jù) 4

60 state <=s2;

61 else

62 begin

63 sel <=3'b001;

64 num <=data_in[19:16];

65 end

66 end

67 s2:begin

68 if(flag) //亮第3個燈,給24位數(shù)據(jù)的 4

69 state <=s3;

70 else

71 begin

72 sel <=3'b010;

73 num <=data_in[15:12];

74 end

75 end

76 s3:begin

77 if(flag) //亮第4個燈,給24位數(shù)據(jù)的4

78 state <=s4;

79 else

80 begin

81 sel <=3'b011;

82 num <=data_in[11:8];

83 end

84 end

85 s4:begin

86 if(flag) //亮第5個燈,給24位數(shù)據(jù)的4

87 state <=s5;

88 else

89 begin

90 sel <=3'b100;

91 num <=data_in[7:4];

92 end

93 end

94 s5:begin

95 if(flag) //亮第6個燈,給24位數(shù)據(jù)的4

96 state <=s0;

97 else

98 begin

99 sel <=3'b101;

100 num <=data_in[3:0];

101 end

102 end

103 default:state <=s0;

104 endcase

105 end

106

107 always@(*) //數(shù)碼管的譯碼模塊

108 begin

109 case(num)

110 0:seg7 =8'b1100_0000;

111 1:seg7 =8'b1111_1001;

112 2:seg7 =8'b1010_0100;

113 3:seg7 =8'b1011_0000;

114 4:seg7 =8'b1001_1001;

115 5:seg7 =8'b1001_0010;

116 6:seg7 =8'b1000_0010;

117 7:seg7 =8'b1111_1000;

118 8:seg7 =8'b1000_0000;

119 9:seg7 =8'b1001_0000;

120 10:seg7 =8'b1000_1000;

121 11:seg7 =8'b1000_0011;

122 12:seg7 =8'b1100_0110;

123 13:seg7 =8'b1010_0001;

124 14:seg7 =8'b1000_0110;

125 15:seg7 =8'b1000_1110;

126 default:;

127 endcase

128 end

129endmodule


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1630

    文章

    21796

    瀏覽量

    605523
  • 數(shù)碼管
    +關(guān)注

    關(guān)注

    32

    文章

    1883

    瀏覽量

    91363
收藏 人收藏

    評論

    相關(guān)推薦

    基于FPGA實現(xiàn)數(shù)碼管顯示

    本文介紹數(shù)碼管顯示譯碼基本工作原理及Verilog HDL驅(qū)動代碼編寫,進一步熟練掌握FPGA入門基礎(chǔ)知識。
    的頭像 發(fā)表于 10-24 14:44 ?1089次閱讀
    基于<b class='flag-5'>FPGA</b>實現(xiàn)<b class='flag-5'>數(shù)碼管</b><b class='flag-5'>顯示</b>

    數(shù)碼管的使用方法和接線步驟

    數(shù)碼管的基本單元是發(fā)光二極(LED),通過控制不同LED的亮滅來顯示數(shù)字和字符。根據(jù)段數(shù),數(shù)碼管可分為七段和八段,其中八段數(shù)碼管比七段多一
    的頭像 發(fā)表于 08-29 18:22 ?3324次閱讀

    簡述led數(shù)碼管的類型和顯示原理

    LED數(shù)碼管是一種常見的顯示設(shè)備,廣泛應(yīng)用于各種電子設(shè)備和系統(tǒng)中。本文將介紹LED數(shù)碼管的類型和顯示原理,以幫助讀者更好地了解這種設(shè)備。 LED數(shù)碼
    的頭像 發(fā)表于 08-29 09:11 ?1343次閱讀

    數(shù)碼管顯示屏的靜態(tài)顯示編程是什么

    ,要么全部熄滅不顯示任何內(nèi)容,而不涉及動態(tài)掃描或快速切換來模擬多個數(shù)碼管同時顯示的效果。 在靜態(tài)顯示中,每個
    的頭像 發(fā)表于 08-28 17:14 ?664次閱讀

    數(shù)碼管顯示屏的作用和功能是什么

    數(shù)碼管顯示屏是一種廣泛應(yīng)用于各種電子設(shè)備中的顯示技術(shù),它具有多種作用和功能。 一、數(shù)碼管顯示屏的基本概念 1.1
    的頭像 發(fā)表于 08-28 17:11 ?1288次閱讀

    驅(qū)動器數(shù)碼管顯示不良原因

    驅(qū)動器數(shù)碼管顯示不良的原因可能有很多,涉及硬件、軟件、環(huán)境等多個方面。 一、引言 驅(qū)動器數(shù)碼管是一種廣泛應(yīng)用于工業(yè)自動化、電子設(shè)備等領(lǐng)域的顯示
    的頭像 發(fā)表于 08-28 16:38 ?1051次閱讀

    什么原因造成數(shù)碼管顯示錯誤

    數(shù)碼管顯示錯誤是一個常見的問題,可能由多種原因引起。 一、引言 數(shù)碼管是一種常用的顯示設(shè)備,廣泛應(yīng)用于各種電子設(shè)備中,如電子鐘、計算器、溫度計等。然而,在使用過程中,
    的頭像 發(fā)表于 08-28 16:36 ?2083次閱讀

    8位數(shù)碼管怎么不顯示數(shù)字

    8位數(shù)碼管是一種常見的電子顯示設(shè)備,用于顯示數(shù)字或字符。然而,有時8位數(shù)碼管可能無法正常顯示數(shù)字。 電源問題 電源是8位
    的頭像 發(fā)表于 08-28 16:34 ?1068次閱讀

    7段數(shù)碼管共陰共陽如何顯示數(shù)字

    7段數(shù)碼管是一種常見的顯示設(shè)備,用于顯示數(shù)字和部分字母。它由7個LED發(fā)光二極組成,每個LED可以獨立控制,從而實現(xiàn)數(shù)字和字母的顯示。 一
    的頭像 發(fā)表于 08-28 16:19 ?2781次閱讀

    數(shù)碼管驅(qū)動芯片引腳功能

    數(shù)碼管驅(qū)動芯片是一種用于驅(qū)動數(shù)碼管顯示數(shù)字或字符的集成電路。數(shù)碼管驅(qū)動芯片的引腳功能是實現(xiàn)數(shù)碼管正常顯示
    的頭像 發(fā)表于 08-28 16:08 ?1093次閱讀

    數(shù)碼管驅(qū)動芯片原理是什么

    數(shù)碼管驅(qū)動芯片是一種廣泛應(yīng)用于數(shù)字顯示領(lǐng)域的電子元件,它能夠?qū)?shù)字信號轉(zhuǎn)換為可視的數(shù)字顯示。 一、數(shù)碼管驅(qū)動芯片概述 1.1 數(shù)碼管驅(qū)動芯片
    的頭像 發(fā)表于 08-28 16:07 ?1063次閱讀

    數(shù)碼管驅(qū)動芯片好壞判斷方法

    數(shù)碼管驅(qū)動芯片是數(shù)字顯示設(shè)備中的核心部件,其性能好壞直接影響數(shù)碼管顯示效果和使用壽命。 一、數(shù)碼管
    的頭像 發(fā)表于 08-28 15:57 ?1074次閱讀

    硬件模塊---數(shù)碼管基本原理與實現(xiàn)方法

    如果陽極連在一起,就是共陽極數(shù)碼管,陰極連在一起,就是共陰極數(shù)碼管。 如上圖,是一個共陰極數(shù)碼管,要使數(shù)碼管顯示不同的數(shù)字,只需點亮對應(yīng)LE
    的頭像 發(fā)表于 05-11 09:20 ?4628次閱讀
    硬件模塊---<b class='flag-5'>數(shù)碼管</b>基本原理與實現(xiàn)方法

    【基于Lattice MXO2的小腳丫FPGA核心板】03數(shù)碼管顯示控制

    的信號都連接到FPGA的管腳,作為輸出信號控制。FPGA只要輸出這些信號就能夠控制數(shù)碼管的那一段LED亮或者滅。這樣我們可以通過開關(guān)來控制FPGA的輸出。通過組合邏輯的輸出來控制
    發(fā)表于 02-29 09:01

    51單片機數(shù)碼管靜態(tài)顯示

    ? 數(shù)碼管靜態(tài)顯示其實在實際應(yīng)用中很少,除非項目中就只用到了一位數(shù)碼管顯示,否則的話靜態(tài)顯示非常占用IO口。但是,靜態(tài)
    的頭像 發(fā)表于 02-26 11:05 ?2198次閱讀
    51單片機<b class='flag-5'>數(shù)碼管</b>靜態(tài)<b class='flag-5'>顯示</b>