-
2022-01-03 16:49:46
(38)FPGA数码管驱动设计(第8天)
1 文章目录
1)文章目录
2)FPGA初级课程介绍
3)FPGA初级课程架构
4)FPGA数码管驱动设计(第8天)
5)技术交流
6)参考资料
2 FPGA初级课程介绍
1)FPGA初级就业课程共100篇文章,目的是为了让想学FPGA的小伙伴快速入门。
2)FPGA初级就业课程包括FPGA简介、Verilog HDL基本语法、Verilog HDL 入门实例、FPGA入门实例、Xilinx FPGA IP core设计、Xilinx FPGA原语与UART通信实例设计、SPI通信实例设计、FPGA基础面试题、FPGA实践面试题。
3)FPGA初级就业课程学习建议:
第一,听说FPGA,每天学习2篇文章,50天学会FPGA。
第二,了解FPGA,每天学习3篇文章,30天学会FPGA。
第三,熟悉FPGA,每天学习5篇文章,20天学会FPGA,FPGA初级就业课程课采用该架构。
第四,精通FPGA,每天学习10篇文章,10天学会FPGA。
第五,精通FPGA,每天学习14篇文章,7天学会FPGA。
3 FPGA初级课程架构
FPGA初级就业课程共100篇文章,总共分为10个阶段,每个阶段10篇文章。
第1阶段:FPGA简介。
1)介绍FPGA芯片、FPGA开发流程、开发语言、开发工具
更多相关内容 -
FPGA数码管
2021-11-25 09:07:58文章目录前言一、工程介绍1.1 LED显示原理... 本工程使用FPGA驱动LED数码管。 1.1 LED显示原理 LED是一个发光二极管,当加正向电压,LED点亮,加反向电压,LED熄灭,在实际连接电路上,FPGA引脚通过一个电阻连接
前言
本系列文章来源于FPGA学习开源网站fpga4fun,网站由浅入深的介绍了26个FPGA工程,通过工程的学习,可以了解什么是FPGA以及它是如何工作的。本人仅用于学习和记录,如有侵权,速删。
一、工程介绍
本工程使用FPGA驱动LED数码管。
1.1 LED显示原理
LED是一个发光二极管,当加正向电压,LED点亮,加反向电压,LED熄灭,在实际连接电路上,FPGA引脚通过一个电阻连接LED,电阻值一般在100Ω-1KΩ之间,实际连接电路如下所示:
1.2 控制LED的发光强度
首先,看一下如何通过verilog代码实现LED的开关,代码类似用verilog代码实现蜂鸣器,具体代码如下所示:
module LEDBlink( input clk_i, //时钟一般在10MHz-50MHz output LED_o ); reg [31:0] cnt; always@(posedge clk_i)begin cnt <= cnt + 1; end assign LED_o = cnt[22]; //这里使用的是计数器23bit控制开关的频率,使用不同的计数器位数实现不同的开关频率 endmodule
其次,看一下如何控制LED实现半亮这种状态,一般由两种解决方案:一是将与FPGA、LED串联的电阻的阻值提高一倍;二是让FPGA输出不停的翻转,使得LED点亮和熄灭的时间一样,这样可以看到半亮的状态,具体代码如下所示:
module LEDhalflit( input clk_i, output LED_o ); reg toggle; always@(posedge clk_i)begin toggle <= ~toggle; //在时钟的一半进行翻转 end assign LED = toggle; endmodule
然后,看一下如何控制LED的强度,一般可以使用pwm的思想。下面是一个使用4bit输入控制LED在16个亮度级别之间进行选择的例子,具体代码如下所示:
module LED_PWM( input clk_i, input [3:0] pwm_i, //16个亮度级别 output LED_o ); reg [4:0] pwm; always@(posedge clk_i)begin pwm <= pwm[3:0] + pwm_i; end assign LED = pwm[4]; endmodule
最后,看一下如何使LED看起来会发光,一般是使用计数器结合pwm的思想,具体代码如下所示:
module LEDglow( input clk_i, output LED_o ); reg [23:0] cnt; reg [ 4:0] pwm; wire [3:0] intensity = cnt[23] ? cnt[22:19] : ~cnt[22:19] //亮度在亮暗切换 always@(posedge clk_i)begin cnt <= cnt + 1; end always@(posedge clk_i)begin pwm <= pwm[3:0] + intensity; end assign LED = PWM[4]; endmodule
1.3 7段发光二极管显示
数码管由8个发光二极管组成,8个二极管命名为‘A’到‘G’,还有一个DP(点)。这8个二极管并不是独立的,一般会将阴极或者阳极接到一起,实际物理器件最少有九个引脚,如下图所示:
FPGA驱动数码管,最简单的方案是使用8个IO引脚,如下图所示,以显示数字2为例,具体代码如下:
module LED_7seg( output segA_o, output segB_o, output segC_o, output segD_o, output segE_o, output segF_o, output segG_o, output segDP_o ); assign {segA_o,segB_o,segC_o,segD_o,segE_o,segF_o,segG_o,segDP_o} = 8'b11011010; endmodule
下面使用FPGA驱动数码管实现一个10进制计数器,具体代码如下所示:
module LED_7seg( input clk_i, output segA_o, output segB_o, output segC_o, output segD_o, output segE_o, output segF_o, output segG_o, output segDP_o ); reg [23:0] cnt; //使用24bit计数器 always@(posedge clk_i)begin cnt <= cnt + 24'h1; end wire cntovf = &cnt; //归约与,&cnt=cnt[0]&cnt[1]&....&cnt[23],每计满24位,cntovf值为1,如果时钟设置好,可以实现1s置1一次 reg [3:0] BCD; always@(posedge clk_i)begin if(cntovf)beign //每一秒,计数器加1 BCD <= (BCD==4'h9 ? 4'h0 : BCD+4'h1); //from 0 to 9 end end reg [7:0] SevenSeg; always@(*)begin case(BCD) 4'h0: SevenSeg = 8'b1111_1100; 4'h1: SevenSeg = 8'b0110_0000; 4'h2: SevenSeg = 8'b1101_1010; 4'h3: SevenSeg = 8'b1111_0010; 4'h4: SevenSeg = 8'b0110_0110; 4'h5: SevenSeg = 8'b1011_0110; 4'h6: SevenSeg = 8'b1011_1110; 4'h7: SevenSeg = 8'b1110_0000; 4'h8: SevenSeg = 8'b1111_1110; 4'h9: SevenSeg = 8'b1111_0110; default: SevenSeg = 8'b0000_0000; endcase end assign {segA_o,segB_o,segC_o,segD_o,segE_o,segF_o,segG_o,segDP_o} = SevenSeg; endmodule
下面使用FPGA驱动数码管实现一个10进制平滑计数器,效果实现淡入淡出,具体代码如下所示:
module LED_7seg( input clk_i, output segA_o, output segB_o, output segC_o, output segD_o, output segE_o, output segF_o, output segG_o, output segDP_o ); reg [23:0] cnt; //使用24bit计数器 always@(posedge clk_i)begin cnt <= cnt + 24'h1; end wire cntovf = &cnt; //归约与,&cnt=cnt[0]&cnt[1]&....&cnt[23],每计满24位,cntovf值为1,如果时钟设置好,可以实现1s置1一次 reg [3:0] BCD_new; reg [3:0] BCD_old; always@(posedge clk_i)begin if(cntovf)beign //每一秒,计数器加1 BCD_new <= (BCD_new==4'h9 ? 4'h0 : BCD_new+4'h1); //from 0 to 0 end end always@(posedge clk_i)begin if(cntovf)beign BCD_old <= BCD_new; //将计数器打一拍 end end reg [4:0] pwm; wire [3:0] pwm_input = cnt[22:19]; always@(posedge clk_i)begin pwm <= pwm[3:0] + pwm_input; //通过pwm控制实现淡入淡出效果 end wire [3:0] BCD = (cnt[23] | pwm[4]) ? BCD_new : BCD_old; reg [7:0] SevenSeg; always@(*)begin case(BCD) 4'h0: SevenSeg = 8'b1111_1100; 4'h1: SevenSeg = 8'b0110_0000; 4'h2: SevenSeg = 8'b1101_1010; 4'h3: SevenSeg = 8'b1111_0010; 4'h4: SevenSeg = 8'b0110_0110; 4'h5: SevenSeg = 8'b1011_0110; 4'h6: SevenSeg = 8'b1011_1110; 4'h7: SevenSeg = 8'b1110_0000; 4'h8: SevenSeg = 8'b1111_1110; 4'h9: SevenSeg = 8'b1111_0110; default: SevenSeg = 8'b0000_0000; endcase end assign {segA_o,segB_o,segC_o,segD_o,segE_o,segF_o,segG_o,segDP_o} = SevenSeg; endmodule
-
FPGA 数码管计数显示程序 verilog
2018-06-07 15:17:14FPGA 6个数码管计数显示程序,verilog编写。。。。。。。 -
Hello_dis_FPGA数码管扫描显示_
2021-10-03 12:24:03FPGA 数码管滚动显示"HELLO"字符串,速度可调 -
FPGA数码管简单显示
2022-05-04 22:57:37一、了解数码管的原理 数电的书中有介绍,如下图。具体按照接地还是接电源,分为共阴极与共阳极,本文讨论是共阳极,即低电平无效。简单的原理就是abcdefg七个管脚+dp(小数点),根据逻辑编写代码,控制亮灭,达到...一、了解数码管的原理
数电的书中有介绍,如下图。具体按照接地还是接电源,分为共阴极与共阳极,本文讨论是共阳极,即低电平无效。简单的原理就是abcdefg七个管脚+dp(小数点),根据逻辑编写代码,控制亮灭,达到显示数字的效果。
如果想表示两位,三位或者四位甚至更多,就需要更多的数码器,数码器的数量根据需要配置,本文讨论是4位数码器。多位数码器编写,需要分两步控制:第一步控制哪一个数码器有效(即给哪一个数码器供电),第二步针对已供电的数码器显示数字。
二、代码编写的思路
为了是代码清晰,可移植能力强分为三个模块编写。
第一个模块:静态模块,做位选,段选信号,本文简单,位选给所有数码器供电,段选按照0-9控制数码器的亮灭,达到显示效果。
第二个模块:驱动模块,设计1ms计数器,从0开始1ms数字加1,到9置0循环。
第三个模块:顶层模块,调用驱动,静态模块,达到显示0-9不断循环效果。
三、代码编写
1、静态模块编写
2、驱动模块编写
3、顶层模块编写
四、测试代码编写
五、总结
1、主要是对于细节的把控,例化时,wire,reg的区分,input,output的定义原理是什么,结合着输入输出进一步的理解。
2、为下一步继续实现多位数字的显示,打好基础。 -
FPGA数码管动态显示
2015-12-17 17:00:32100进制可逆加法器的数码管动态显示,设计步骤和流畅,代码编写 -
FPGA数码管的显示总结
2021-08-04 15:03:472: 数码管位选和 段选,确定信号是高电平有效,还是低电平有效。 3: 知道0~f 数字用数码管怎么表示。 4: 仿真的情况: 应该是生成1k 时钟的时候,再输入显示的数据。 源代码: `timescale 1ns / 1ps ///////...1:由于视觉暂留效应,首先生成1k 的时钟。
2: 数码管位选和 段选,确定信号是高电平有效,还是低电平有效。
3: 知道0~f 数字用数码管怎么表示。
4: 仿真的情况: 应该是生成1k 时钟的时候,再输入显示的数据。
源代码:
`timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2021/08/04 10:10:22 // Design Name: // Module Name: HEX_TOP // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // // module HEX_TOP( input clk, input reset_n, input [31:0] disp_data, output reg [7:0] seg, output reg [7:0] sel ); reg [15:0] clk_cnt;// 25000; //reg [17:0] cnt_disp;//12500; reg clk_1k; reg [2:0] sel_cnt; reg [3:0] num; always@(posedge clk or negedge reset_n)begin if(!reset_n)begin clk_cnt <= 16'd0; clk_1k <= 1'b0; end else if(clk_cnt == 12500-1)begin clk_cnt <= 16'd0; clk_1k <= ~clk_1k; end else clk_cnt <= clk_cnt+1'b1; end always@(posedge clk_1k or negedge reset_n)begin if(!reset_n) sel_cnt<=3'd0; else sel_cnt <= sel_cnt+1'b1; end always@(posedge clk_1k)begin case(sel_cnt) 0:num <= disp_data[3:0]; 1:num <= disp_data[7:4]; 2:num <= disp_data[11:8]; 3:num <= disp_data[15:12]; 4:num <= disp_data[19:16]; 5:num <= disp_data[23:20]; 6:num <= disp_data[27:24]; 7:num <= disp_data[31:28]; endcase end always@(posedge clk_1k)begin case(sel_cnt) 0:sel <= 8'b0000_0001; 1:sel <= 8'b0000_0010; 2:sel <= 8'b0000_0100; 3:sel <= 8'b0000_1000; 4:sel <= 8'b0001_0000; 5:sel <= 8'b0010_0000; 6:sel <= 8'b0100_0000; 7:sel <= 8'b1000_0000; default: sel <= 8'b0000_0000; endcase end always@(posedge clk_1k)begin case(num) 0: seg <= 8'hc0; 1: seg <= 8'hf9; 2: seg <= 8'ha4; 3: seg <= 8'hb0; 4: seg <= 8'h99; 5: seg <= 8'h92; 6: seg <= 8'h82; 7: seg <= 8'hf8; 8: seg <= 8'h80; 9: seg <= 8'h90; 10: seg <= 8'h88; 11: seg <= 8'h83; 12: seg <= 8'hc6; 13: seg <= 8'ha1; 14: seg <= 8'h86; 15: seg <= 8'h8e; default:seg <= 8'hff; endcase end endmodule
仿真代码:
`timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2021/08/04 14:18:44 // Design Name: // Module Name: hex_tb // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // // module hex_tb(); reg clk; reg reset_n; reg [31:0] disp_data; wire [7:0] seg; wire [7:0] sel ; HEX_TOP HEX_TOP_inst1( .clk(clk), .reset_n(reset_n), .disp_data(disp_data), .seg(seg), .sel(sel) ); initial begin reset_n =0; clk=0; disp_data = 32'd0; #201; reset_n=1; #2010_0000; disp_data = 32'h12345678; #2000_0000; disp_data = 32'ha19bcd4; #200; $stop; end always #20 clk =~ clk; endmodule
仿真的波形显示:
-
FPGA 数码管显示
2014-03-16 16:13:51对于初学FPGA 的 可以借鉴 VHDL -
FPGA数码管滚动显示学号
2021-10-30 19:25:49运用FPGA平台的6个数码管流动显示7位学号 -
FPGA数码管显示Verilog HDL
2021-04-05 18:13:20fpga数码管显示 -
基于FPGA数码管数字钟显示
2015-12-18 17:15:56用FPGA当主控芯片来显示数码管数据,里面有三种设计方法,模块化设计程序,模块之间有详细讲解! -
seg_led_static_FPGA数码管_sickfi3_
2021-09-30 16:30:14实现FPGA的静态数码管显示,已经过试验验证,改进后可实现动态数码管显示 -
FPGA数码管显示
2021-06-25 15:22:55数码管 数码管显示部分的电路如图所示。我们使用的是一个四位带小数点的七段共阳数码管,当我们相应的输出脚为低电平时,该段位的LED点亮。位选位也是低电平选通。 模块实现 //数码管显示 module digitalTube( ... -
FPGA数码管循环显示0-9
2021-06-01 20:07:56有没有大佬帮忙写一个电路模块和仿真程序,小弟属实比较笨,用verilog,谢谢了</p> -
FPGA数码管流动显示学号
2021-11-02 16:02:21主要功能:通过FPGA的6个数码管流动显示7位学号 工程放在下边 链接:https://pan.baidu.com/s/14ILTfXZ5AZa98r7p7w39UQ 提取码:3aho -
fpga数码管的驱动
2014-10-02 00:22:46fpga数码管的驱动,用这个驱动可以方便的操作fpga的数码管 -
FPGA数码管显示自动计数+按键计数+蜂鸣器
2021-11-01 14:43:22top顶层文件 module seg_test( input clk, input rst_n, input key1, input key2, output buzzer, output [5:0] seg_sel, output [7:0] seg_data ); wire button_negedge; ax_debounce ax_debounce_... .clk . -
FPGA 数码管 代码 VERILOG
2011-11-24 14:11:05FPGA 数码管 代码 VERILOG希望对大家有帮助 -
FPGA-数码管
2022-05-11 19:47:56闪烁的数码管 在HEX0上连续循环地显示数字0~9,每秒刷新一次显示。使用计数器产生1 s的时间间隔,这个计数器的时钟由DE2-115平台上的50 MHz时钟提供。注意:这个设计中只允许使用DE2-115平台上的50 MHz时钟,而不... -
fpga数码管计数+键控作业
2020-10-24 21:58:33作业3: 利用LED、KEY和Segment LED,实现下面的功能; (1)在前三次作业的基础上,实现6位的10进制计数器计数,并在Segment LED显示计数器的次数; 即4盏LED一秒内循环点亮, 10进制计数器加1,同时在Segment LED... -
FPGA数码管时钟
2013-09-25 11:06:50FPGA驱动八个数码管动态扫描,数码管使用74hc573驱动 -
基于FPGA的数字时钟数码管显示
2020-08-26 09:31:43这是两年前开始学习FPGA的时候做的实验,已经好久没有接触FPGA了,板卡也积灰不少了,是时候安排时间重新拾起曾经美好的回忆了。下面是曾经的实验笔记。 -
深入学习FPGA之数码管的动态扫描(上)
2020-07-13 19:36:47在以单片机和ARM为主的电子系统中,液晶屏是理想的...数码管作为一种能够直观显示一定数据信息的输出设备,具有驱动简单,显示直观的特点,尤其适合作为FPGA系统的输出设备。本文就带大家一起进行数码管驱动的开发。