FPGA使用两个HC595驱动8位数码管
FPGA使用两个HC595驱动8位数码管
本文章给出使用FPGA3根线来驱动8位数码管的示例代码,输入为disp_data
,共7*8=56位,输出输入如图所示。
硬件方面参数
- 该程序只能控制数码管的7位,如有小数点位则控制不了,如有需要请自行修改。
- 最低7位是最右边的那个数码管(这个需要根据你自己的板子硬件连接来看)。
- 0是亮,1是灭(共阳极数码管是这样,共阴极则相反,如为共阴极则需要修改
HEX8
中对应的内容)。 - a是7位中的最低位。
程序
- 顶层程序
module HEX_top(
Clk,
Rst_n,
disp_data,
SH_CP,
ST_CP,
DS
);
input Clk; //50M
input Rst_n;
output SH_CP; //shift clock
output ST_CP; //latch data clock
output DS; //data
input disp_data;
wire [7:0] sel;//数码管位选(选择当前要显示的数码管)
wire [6:0] seg;//数码管段选(当前要显示的内容)
wire [55:0] disp_data;
HEX8 HEX8(
.Clk(Clk),
.Rst_n(Rst_n),
.En(1'b1),
.disp_data(disp_data),
.sel(sel),
.seg(seg)
);
HC595_Driver HC595_Driver(
.Clk(Clk),
.Rst_n(Rst_n),
.Data({1'b1,seg,sel}),
.S_EN(1'b1),
.SH_CP(SH_CP),
.ST_CP(ST_CP),
.DS(DS)
);
endmodule
- 8位7段数码管显示设计
module HEX8(
Clk,
Rst_n,
En,
disp_data,
sel,
seg
);
input Clk; //50M
input Rst_n;
input En; //数码管显示使能,1使能,0关闭
input [55:0]disp_data;
output [7:0] sel;//数码管位选(选择当前要显示的数码管)
output wire [6:0] seg;//数码管段选(当前要显示的内容)
reg [14:0]divider_cnt;//25000-1
reg clk_1K;
reg [7:0]sel_r;
reg [7:0]data_tmp;//数据缓存
// 分频计数器计数模块
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)
divider_cnt <= 15'd0;
else if(!En)
divider_cnt <= 15'd0;
else if(divider_cnt == 24999)
divider_cnt <= 15'd0;
else
divider_cnt <= divider_cnt + 1'b1;
//1K扫描时钟生成模块
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)
clk_1K <= 1'b0;
else if(divider_cnt == 24999)
clk_1K <= ~clk_1K;
else
clk_1K <= clk_1K;
//8位循环移位寄存器
always@(posedge clk_1K or negedge Rst_n)
if(!Rst_n)
sel_r <= 8'b0000_0001;
else if(sel_r == 8'b1000_0000)
sel_r <= 8'b0000_0001;
else
sel_r <= sel_r << 1;
always@(*)
case(sel_r)
8'b0000_0001:data_tmp = disp_data[6:0];
8'b0000_0010:data_tmp = disp_data[13:7];
8'b0000_0100:data_tmp = disp_data[20:14];
8'b0000_1000:data_tmp = disp_data[27:21];
8'b0001_0000:data_tmp = disp_data[34:28];
8'b0010_0000:data_tmp = disp_data[41:35];
8'b0100_0000:data_tmp = disp_data[48:42];
8'b1000_0000:data_tmp = disp_data[55:49];
default:data_tmp = 7'b0000000;
endcase
assign seg = data_tmp;
assign sel = (En)?sel_r:8'b0000_0000;
endmodule
- 74HC595移位寄存器驱动设计
module HC595_Driver(
Clk,
Rst_n,
Data,
S_EN,
SH_CP,
ST_CP,
DS
);
parameter DATA_WIDTH = 16;
input Clk;
input Rst_n;
input [DATA_WIDTH-1 : 0] Data; //data to send
input S_EN; //send en
output reg SH_CP; //shift clock
output reg ST_CP; //latch data clock
output reg DS; //shift serial data
parameter CNT_MAX = 4;
reg [15:0] divider_cnt;//分频计数器
wire sck_pluse;
reg [4:0]SHCP_EDGE_CNT;//SH_CP EDGE counter
reg [15:0]r_data;
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)
r_data <= 16'd0;
else if(S_EN)
r_data <= Data;
else
r_data <= r_data;
//clock divide
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)
divider_cnt <= 16'd0;
else if(divider_cnt == CNT_MAX)
divider_cnt <= 16'd0;
else
divider_cnt <= divider_cnt + 1'b1;
assign sck_pluse = (divider_cnt == CNT_MAX);
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)
SHCP_EDGE_CNT <= 5'd0;
else if(sck_pluse)begin
if(SHCP_EDGE_CNT == 5'd31)
SHCP_EDGE_CNT <= 5'd0;
else
SHCP_EDGE_CNT <= SHCP_EDGE_CNT + 1'd1;
end
else
SHCP_EDGE_CNT <= SHCP_EDGE_CNT;
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)begin
SH_CP <= 1'b0;
ST_CP <= 1'b0;
DS <= 1'b0;
end
else begin
case(SHCP_EDGE_CNT)
5'd0:begin SH_CP <= 1'b0; ST_CP <= 1'b1; DS <= r_data[15]; end
5'd1:begin SH_CP <= 1'b1; ST_CP <= 1'b0;end
5'd2:begin SH_CP <= 1'b0; DS <= r_data[14];end
5'd3:begin SH_CP <= 1'b1; end
5'd4:begin SH_CP <= 1'b0; DS <= r_data[13];end
5'd5:begin SH_CP <= 1'b1; end
5'd6:begin SH_CP <= 1'b0; DS <= r_data[12];end
5'd7:begin SH_CP <= 1'b1; end
5'd8:begin SH_CP <= 1'b0; DS <= r_data[11];end
5'd9:begin SH_CP <= 1'b1; end
5'd10:begin SH_CP <= 1'b0; DS <= r_data[10];end
5'd11:begin SH_CP <= 1'b1; end
5'd12:begin SH_CP <= 1'b0; DS <= r_data[9];end
5'd13:begin SH_CP <= 1'b1; end
5'd14:begin SH_CP <= 1'b0; DS <= r_data[8];end
5'd15:begin SH_CP <= 1'b1; end
5'd16:begin SH_CP <= 1'b0; DS <= r_data[7];end
5'd17:begin SH_CP <= 1'b1; end
5'd18:begin SH_CP <= 1'b0; DS <= r_data[6];end
5'd19:begin SH_CP <= 1'b1; end
5'd20:begin SH_CP <= 1'b0; DS <= r_data[5];end
5'd21:begin SH_CP <= 1'b1; end
5'd22:begin SH_CP <= 1'b0; DS <= r_data[4];end
5'd23:begin SH_CP <= 1'b1; end
5'd24:begin SH_CP <= 1'b0; DS <= r_data[3];end
5'd25:begin SH_CP <= 1'b1; end
5'd26:begin SH_CP <= 1'b0; DS <= r_data[2];end
5'd27:begin SH_CP <= 1'b1; end
5'd28:begin SH_CP <= 1'b0; DS <= r_data[1];end
5'd29:begin SH_CP <= 1'b1; end
5'd30:begin SH_CP <= 1'b0; DS <= r_data[0];end
5'd31:begin SH_CP <= 1'b1; end
endcase
end
endmodule
代码来自于小梅哥的资料,进行了部分修改,使得整个程序可以更方便的被移植
FPGA使用两个HC595驱动8位数码管的更多相关文章
- 树莓派进阶之路 (016) - 通过595驱动4位LED显示系统时间
模块图片,4位共阳极数码管. 我们使用树莓派wiringPi的库来通过74HC595驱动4位数码管: C 代码如下: #include <wiringPi.h> #include < ...
- 【C语言】求两个数中不同的位的个数
//求两个数中不同的位的个数 #include <stdio.h> int count_different(int a, int b) { int count = 0; int c = a ...
- AVR单片机8位数码管显示的程序实现
AVR单片机8位数码管显示的程序实现 转载:http://www.sohu.com/a/117255149_119709 2016-10-26 16:30 我们接着来完成 数码管的显示实验.现在我 ...
- #51单片机#8位数码管(74HC595芯片)的使用方法
数码管基本属性:1.采用2片595驱动数码管,需要单片机3路IO口,根据数码管动态扫描原理进行显示:2.宽工作电压3.3V到5V:3.PCB板尺寸:71mm*22mm4.数码管型号:0.36 4位共阳 ...
- 基于FPGA的4x4矩阵键盘驱动调试
好久不见,因为博主最近两个月有点事情,加上接着考试,考完试也有点事情要处理,最近才稍微闲了一些,这才赶紧记录分享一篇博文.FPGA驱动4x4矩阵键盘.这个其实原理是十分简单,但是由于博主做的时候遇到了 ...
- 我的 FPGA 学习历程(10)—— 实验:数码管驱动
根据黑金 AX301 手册,数码管位选信号命名为 SEL[5:0],其中 SEL[5] 对应最左边的数码管,而SEL[0] 对应最右边数码管:作为约定,在下面的描述中我们对应的称之为数码管 5 和数码 ...
- python-mysql驱动64位
安装Python-MySQL驱动一直没有成功: https://pypi.python.org/pypi/MySQL-python/1.2.5#downloads 上面网站下的版本安装都不能通过 提示 ...
- 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同
思路:利用&用算加右移的方法来提取二进制中的每一位数,然后进行比较,查看是否相同. #include<stdio.h> #include<stdlib.h> int m ...
- C++:用字符串数组实现大数运算,以两个不高于40位的大数运算为例。
因为基本数据类型中整型的内存范围有限,所以直接进行大数之间的运算,不仅浪费空间,而且运行缓慢,甚至有些会导致数据溢出. 那怎么办呢? 这时我们就想直接不行,那咱们来间接的. 这就是我们今天主要要讲的: ...
- FPGA图像处理 两路sensor的色调不一致
怎么调?可以让两路sensor的色调一致.
随机推荐
- SpringCloud带你走进微服务的世界
认识微服务 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构.这些架构之间有怎样的差别呢? 单体架构 单体架构:将业务的所有功能集中在一个项目中开发,打 ...
- kubernetes安装配置使用vGPU
前言 AI 落地时,在某些场景下 AI 模型在训练或者是推理时,其算力要求不需要占用整卡的 GPU,比如只需要0.5卡 GPU 即可满足需求. 在这种情况下,可以使用 GPU 虚拟化技术来解决这个问题 ...
- 入口函数与包初始化:Go程序的执行次序
前言 我们可能经常会遇到这样一个问题:一个 Go 项目中有数十个 Go 包,每个包中又有若干常量.变量.各种函数和方法,那 Go 代码究竟是从哪里开始执行的呢?后续的执行顺序又是什么样的呢? 事实上, ...
- Sql 字符串截取
注意 不同数据库内置函数名称或有差异,可参考 1.从左至右截取 ①使用left()函数可以从左至右对字符串进行截取 语法:LEFT(str,length) str是要进行截取的字符串,length是要 ...
- 使用Shader画常见的数学函数
使用Shader画常见的数学函数 本篇博文的灵感来自于Shader Books这一小节:https://thebookofshaders.com/05/?lan=ch 代码运行网站:http://ed ...
- 3.14 + 1e10 - 1e10 = 0 ? ——浮点数的本质
3.14 + 1e10 - 1e10 = 0 ? --浮点数的本质 我们先看这样一个例子: #include <iostream> int main(int argc, char **ar ...
- spring的三级缓存
spring的三级缓存: Spring 容器的"三级缓存" Spring 容器的整个生命周期中,单例Bean对象是唯一的.即可以使用缓存来加速访问 Spring 源码中使用了大量的 ...
- 在 CentOS 系统下搭建 ZeroTier Moon 服务器
安装 ZeroTier One: 首先,确保已经安装了 ZeroTier One.你可以按照上述说明,使用以下命令进行安装: sudo yum install zerotier-one 启动 Zero ...
- while循环、dowhile循环、三种循环的区别
1.while循环 案例:使用while循环,打印出水仙花数 while执行流程: 1.先执行初始化语句 2.执行判断条件 结果为true,则执行第3步 结果为false,循环结束 3.执行循环体语句 ...
- ASP.NET Core 项目归档
把一些基于 ASP.NET Core 的实用项目找个地方记录下... 项目列表: IdentityServer