0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FPGA学习系列:19. rom到数码管显示设计

FPGA学习交流 2018-06-18 19:24 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

设计背景:

rom是读写的的静态存储单元,在我们的设计中我们会经常用到,数码管模块同样的大大小小的设计还是工程应用中都有这至关重要的作用。

设计原理:

前几节我们学习了rom存储器的设计,还有数码管模块的设计,为了我们联系这两个模块的应用我们今天将设计一个按键来控制读取rom中的数据,来显示到数码管上。

因为我们的数码管模块的显示频率是10K,所以我们应该小于10K的频率给一个rom地址,从而出一个数据,我们的设计是0.5s出一个数据,这样我们就能在数码管上显示随着地址的增加,数据同样也在变化。

第一步我们要先设计我们的.mif文件,我们在前10个地址是上写入0 -- 10,然后建立一个rom 的ip核,添加进去从而便于后面的例化。

设计模块,我们前面讲过数码管模块,这样就可以直接拿过来用了,今天我们将主要给大家展示我们的rom控制模块。

设计架构图:

image.png

设计代码:

顶层模块

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个数码管上显示同样的数据

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( //数码管模块的裂化

22 .clk(clk),

23 .rst_n(rst_n),

24 .sel(sel),

25 .seg7(seg_n),

26 .data_in(hex)

27 );

28

29

30endmodule

设计模块

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

1

2 inputclk;//输入系统时钟

3 inputrst_n;//输入系统复位

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)//异步复位

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

在设计我们可以看到我们读出了第一个数,然后下面的数我们可以调整我们的计数单元来通过显示。

数码管模块我们可以用我们以前的 或者下面的:

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

1

2 inputclk;

3 inputrst_n;

4 input[23:0]data_in;//输入6个灯的数据

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的计数值

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)//计数到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位数据的 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位数据 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位数据的 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位数据的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位数据的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位数据的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@(*) //数码管的译码模块

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


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1664

    文章

    22502

    浏览量

    639106
  • 数码管
    +关注

    关注

    32

    文章

    1894

    浏览量

    94415
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【RA-Eco-RA2E1-V1.0开发板试用】串行数码管模块显示驱动

    为了便于输出显示,就为开发板配备了以MAX7219为控制芯片的数码管显示模块,它有两种工作模式,一种是采用编码的工作模式,另一种则是采用非编码的工作模式。 为了驱动该模块,所使用的是接口J3,见图1
    发表于 01-26 11:54

    数码管 选型手册2025年最新版

    数码管具有高亮度、多种颜色、宽视角、简单驱动、长寿命、抗震抗冲击、节能环保和成本低等特点。适用于电子设备、工业控制和家用电器等领域的数字显示,提供清晰、均匀的显示效果,易于集成和控制。
    发表于 12-30 11:34 0次下载

    【EASY EAI Nano-TB(RV1126B)开发板试用】+串行数码管显示驱动

    在开发板上,为用户预留了3个GPIO引脚以便测试和使用,见图1所示。 图1预留的GPIO资源 这3个GPIO引脚的位置见图2所示,用它可驱动串行数码管显示模块来实现显示功能。 图2 引脚位置 为此
    发表于 12-24 19:03

    第6章 中断与数码管动态显示(6.1 6.2)

    中断是单片机系统重点中的重点,因为有了中断,单片机就具备了快速协调多模块工作的能力,可以完成复杂的任务。本章将首先带领大家学习一些必要的C语言基础知识,然后讲解数码管动态显示的原理,并最终借助于中断
    的头像 发表于 12-08 17:03 800次阅读

    第5章 定时器与数码管基础(5.3)

    5.3 数码管学习 LED小灯是一种简单的LED,只能通过亮和灭来表达简单的信息。这节课学习一种能表达更复杂信息的器件——LED数码管。 5.3.1
    的头像 发表于 12-02 15:57 1295次阅读
    第5章 定时器与<b class='flag-5'>数码管</b>基础(5.3)

    FZH183 带键盘扫描接口的LED(发光二极显示器)驱动控制专用电路--方中禾科技

    ,数据按低位高位写入。示例:共阴数码管显示“0”需向地址00H写入数据3FH。键盘扫描自动完成键扫描,用户需按时序读取键值。键扫数据通过4字节寄存器(BYTE1-BYTE4)存储,按键按下时对应
    发表于 11-28 09:31

    FZH182 带键盘扫描接口的LED(发光二极显示器)驱动控制专用电路

    驱动。o 显示数据通过16字节寄存器(00H-0FH)存储,数据按低位高位写入。o 示例:共阴数码管显示“0”需向地址00H写入数据3FH。键盘扫描o 自动完成键扫描,用户需按时序读
    发表于 11-27 14:58

    【瑞萨RA6E2】ADC数据采集与数码管显示

    概述 项目简介 本报告基于瑞萨RA6E2评估板,实现了一个完整的ADC数据采集与显示系统。通过板载ADC通道采集模拟信号,将采集的数字量通过动态扫描方式在4位数码管上实时显示,展示了
    发表于 11-27 00:52

    FZH181 一种带键盘扫描接口的LED(发光二极显示器)驱动控制专用电路

    ,工作电压5V±10%。关键功能模块显示控制o 支持共阴/共阳数码管驱动。o 显示数据通过14字节寄存器(00H-0DH)存储,数据按低位高位写入。o 示例:共阴
    发表于 11-26 15:46

    原厂 FZH114C  一款LED(发光二极数码管、点阵屏)驱动控制专用芯片

    :驱动6位数码管,每位数码管7段(a-g)。8段×5位:驱动5位数码管,每位数码管8段(含小数点DP)。亮度调节:段驱动电流8级可调(建议≥2/8以确保亮度)。位占空比16级可调,灵活
    发表于 11-19 14:43

    FZH114  LED(发光二极数码管、点阵屏)驱动控制专用芯片,集成数字通讯电路、 解码电路、数据锁存器、震荡器

    显示、LED点阵屏、机顶盒显示等。 工业控制设备:需要多位数码管或LED点阵显示的场景。 注意事项 段驱动电流:建议设置为2/8及以上,以确保LED正常点亮。 共阴设计:仅适用于共阴
    发表于 11-19 11:13

    级联动态扫描显示数码管问题

    GD32F103C8T6 硬件SPI连接移位寄存器74HC595级联,动态扫描显示五位数码管 是否需要电平转换芯片TXB0104 数码管选择共阴极和共阳极区别是什么 若使用TXB0104,TXB0104的OE脚在代码书写时是否需
    发表于 10-07 20:36

    抗噪数显驱动数码管显示IC芯片VK1616

    产品品牌:永嘉微电/VINKA 产品型号:VK1616 封装形式:SOP16 产品年份:新年份 概述:VK1616是一种数码管或点阵LED驱动控制专用芯片,内部集成有3线串行接口、数据锁存器、LED
    发表于 08-18 17:27

    广州唯创电子语音芯片WTV380-B001数码管显示驱动ic:开启智能厨房的“芯”体验

    在现代家庭中,智能厨电正迅速成为品质生活的标配。然而,操作复杂、交互生硬、功能单一等问题仍困扰着用户。深圳广州唯创电子推出的WTV380-B001智能语音芯片数码管显示驱动IC,以高度集成的“一芯
    的头像 发表于 07-31 08:49 525次阅读
    广州唯创电子语音芯片WTV380-B001<b class='flag-5'>数码管</b><b class='flag-5'>显示</b>驱动ic:开启智能厨房的“芯”体验

    【应用】工业现场的“智能显示管家”:亿佰特EID051-1xx系列 Modbus数码管解析

    数码管。亿佰特新推出的EID051-1xx系列Modbus数码管,以多种核心优势,成为工业现场的一大助力。一.什么是Modbus数码管?Modbus
    的头像 发表于 07-17 19:34 805次阅读
    【应用】工业现场的“智能<b class='flag-5'>显示</b>管家”:亿佰特EID051-1xx<b class='flag-5'>系列</b> Modbus<b class='flag-5'>数码管</b>解析