首页 > 其他分享 >FPGA使用两个HC595驱动8位数码管

FPGA使用两个HC595驱动8位数码管

时间:2024-03-22 16:12:10浏览次数:27  
标签:FPGA Clk HC595 数码管 Rst input CP data

FPGA使用两个HC595驱动8位数码管

本文章给出使用FPGA3根线来驱动8位数码管的示例代码,输入为disp_data,共7*8=56位,输出输入如图所示。

image-20240322155823890

硬件方面参数

6beb5f11cfb3feb083671545bf3e3804

  1. 该程序只能控制数码管的7位,如有小数点位则控制不了,如有需要请自行修改。
  2. 最低7位是最右边的那个数码管(这个需要根据你自己的板子硬件连接来看)。
  3. 0是亮,1是灭(共阳极数码管是这样,共阴极则相反,如为共阴极则需要修改HEX8中对应的内容)。
  4. 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,Clk,HC595,数码管,Rst,input,CP,data
From: https://www.cnblogs.com/hnu-hua/p/18089710

相关文章

  • proteus+keil5仿真学习笔记(第二章 1位数码管计数器)
    第二章1位数码管计数器目录第二章1位数码管计数器前言一、数码管的结构原理二、按键应用三、中断处理四、程序设计及仿真proteus电路程序总结前言主要介绍数码管、按键的应用,并涉及单片机中断处理技术。一、数码管的结构原理数码管结构如下:有两种数码......
  • proteus+keil5仿真学习笔记(第三章 4位数码管计数器)
    第三章4位数码管计数器前言一、多位数码管显示程序二、定时器原理三、程序设计与仿真proteus电路程序总结前言4位数码管计数器与1位数码管计数器相比,增加了片选电路,以确定选择哪个数码管进行工作。单片机定时器的应用也与中断处理相似,需要设置一些规定的寄存器,以......
  • 基于EP4CE6F17C8的FPGA单数码管秒计数实例
    一、电路模块本例的电路模块与“基于EP4CE6F17C8的FPGA数码管动态显示实例”中的完全一样,此处就不再给出了。二、实验代码本例实现1个数码管循环显示字符1~F,显示间隔为1秒,代码使用Verilog编写,采用例化的形式,共有三个文件。先编写数码管实现显示字形解码的程序,模块名称为seg_de......
  • m基于FPGA的电子钟verilog实现,可设置闹钟,包含testbench测试文件
    1.算法仿真效果本系统进行Vivado2019.2平台的开发,测试结果如下所示:   2.算法涉及理论知识概要       电子钟是现代生活中常见的计时工具,其准确性和功能性不断提高。基于FPGA的电子钟设计不仅具有灵活的可定制性,还能通过集成其他功能(如闹钟)来增强实用性。Verilog......
  • DSP,STM32,ARM,51单片机,FPGA相关解释
    搞嵌入式,物联网相关的朋友们可能将这些硬件的一些技术栈混淆,本文将大致对此进行梳理:对比ARM与其他架构ARM架构的优势在于它的高能效比,这使得它非常适合于移动设备和嵌入式系统。与之相比,例如x86架构更常见于个人电脑和服务器中,它们通常追求更高的性能,能耗问题不是首要考虑。......
  • FPGA之串口接收数据(看注释)
    兜兜转转看了好多家视频和好几本书,明白了FPGA难学的原因之一是因为讲的好(我觉得就是很详细,告诉你为什么这么来写代码)的视频比较少,之前看到的那本书其实也很好,只是没有说为什么这么写,以及某些步骤的用意,这次看了野火的视频,发现挺符合我的需求,他们视频和我借的那本书思路是相同的,野......
  • FPGA入门笔记008——数码管动态扫描设计与验证
    #FPGA入门笔记008——数码管动态扫描设计与验证1、数码管动态扫描原理​ 8段数码管的结构图如图1所示:图1——8段数码管结构图(a为共阴极,b为共阳极)​ 对于共阴数码管需要给对应段以高电平才会使其点亮,而对于共阳极数码管则需要给低电平才会点亮。AC620上板载的是共阳极数......
  • FPGA通过I2C控制AT24C64
    文章目录前言一、代码设计框图二、IIC_drive模块设计2.1、模块接口:2.2、代码功能描述:2.3、IIC协议实现过程:三、EEPROM_ctrl模块设计3.1、模块接口:3.2、代码功能描述四、EEPROM_drive模块五、iic_top模块前言继上一篇FPGA学习_I2C总线协议内容,本文将基于FPGA通过I2......
  • 锁相环技术原理及FPGA实现(第四章4.1)
            经过前面几章的学习,我们已积累了设计锁相环电路的一些基本技能。根据作者的学习经验,这个阶段最期望的一定不是再去理解什么原理公式,学习什么方法思路。好比初次接触到羽毛球时,在网上看了一段中规中矩的教学视频,又刚好买回一支炫丽的球拍,走进球场,实在没有心情......
  • FPGA设计优化(3.7)
            设计规则1:对综合后的设计就要开始进行扇出分析,以尽早发现高扇出的网线,并评估其可能对设计造成的影响。report_high_fanout_nets的具体用法如Tcl代码9-1所示。代码第3行的选项-load_types生成的报告样例如图9-1所示。从此报告中可以看到网线rectify_reset的扇出......