27.数码管的驱动,使用74HC595移位寄存器芯片

news2024/9/21 12:46:18

PS:升腾A7pro系列FPGA没有数码管外设,因此以AC620FPGA为例展开实验。

(1)共阳极数码管和共阴极数码管示意图:

  • AC620中的数码管属于共阳极数码管,段选端口(dp,g,f,e,d,c,b,a)低电平即可点亮led。
  • 人眼的视觉停留效应:当led以小于20ms的时间间隔进行闪烁时,在人眼看来,就是一直亮着的。
  • 预使8个数码管实现动态扫描的效果,需要扫描间隔小于20ms/8 =2.5ms,不妨取1ms。
  • 第一毫秒位选sel[0]高电平,其余sel[0:6]低电平;第二毫秒位选sel[1]高电平,其余sel[0]、sel[2:6]低电平,依次循环。

(2)段选、位选Verilog代码:

module hex(clk,reset_n,data,sel,seg);

input clk;
input reset_n;
input [31:0]data;

output reg[7:0]sel;
output reg[7:0]seg;

//1ms = 1_000_000ns = 20ns * 50_000;
reg [15:0]cnt;
reg [2:0]sel_cnt;
reg [3:0]temp_data;
reg [7:0]r_sel;

parameter MCNT = 49_999;

//1ms计数器模块
always@(posedge clk or negedge reset_n)
	if(!reset_n)
		cnt <= 16'd0;
	else if(cnt == MCNT)
		cnt <= 16'd0;
	else 
		cnt <= cnt + 16'd1;
		
//sel_cnt计数器模块设计
always@(posedge clk or negedge reset_n)
	if(!reset_n)
		sel_cnt <= 3'd0;
	else if(cnt == MCNT)
		sel_cnt <= sel_cnt + 3'd1;
	else 
		sel_cnt <= sel_cnt;
		
//r_sel信号设计
always@(posedge clk or negedge reset_n)
	if(!reset_n)
		r_sel <= 8'h01;
	else begin
		case(sel_cnt)
			3'd0: r_sel <= 8'h01;
			3'd1: r_sel <= 8'h02;
			3'd2: r_sel <= 8'h04;
			3'd3: r_sel <= 8'h08;
			3'd4: r_sel <= 8'h10;
			3'd5: r_sel <= 8'h20;
			3'd6: r_sel <= 8'h40;
			3'd7: r_sel <= 8'h80;
		endcase
	end
	
//sel信号设计    打一拍的目的是为了和seg信号同步
always@(posedge clk)
	sel <= r_sel;
		
//temp_data信号设计
always@(posedge clk or negedge reset_n)
	if(!reset_n)
		temp_data <= 4'd0;
	else begin
		case(sel_cnt)
			3'd0:temp_data <= data[3:0];
			3'd1:temp_data <= data[7:4];
			3'd2:temp_data <= data[11:8];
			3'd3:temp_data <= data[15:12];
			3'd4:temp_data <= data[19:16];
			3'd5:temp_data <= data[23:20];
			3'd6:temp_data <= data[27:24];
			3'd7:temp_data <= data[31:28];
		endcase
	end

//seg信号设计
always@(posedge clk or negedge reset_n)
	if(!reset_n)
		seg <= 8'hff;
	else begin
		case(temp_data)
			4'h0:seg <= 8'b1100_0000;
			4'h1:seg <= 8'b1111_1001;
			4'h2:seg <= 8'b1010_0100;
			4'h3:seg <= 8'b1011_0000;
			4'h4:seg <= 8'b1001_1001;
			4'h5:seg <= 8'b1001_0010;
			4'h6:seg <= 8'b1000_0010;
			4'h7:seg <= 8'b1111_1000;
			4'h8:seg <= 8'b1000_0000;
			4'h9:seg <= 8'b1001_0000;
			4'ha:seg <= 8'b1000_1000;
			4'hb:seg <= 8'b1000_0011;
			4'hc:seg <= 8'b1100_0110;
			4'hd:seg <= 8'b1010_0001;
			4'he:seg <= 8'b1000_0110;
			4'hf:seg <= 8'b1000_1110;
		endcase
	end

endmodule

(3)对应仿真文件代码:

`timescale 1ns/1ns

module hex_tb;

	reg clk;
	reg reset_n;
	reg [31:0]data;
	
	wire [7:0]sel;
	wire [7:0]seg;

	hex hex_inst(
		.clk(clk),
		.reset_n(reset_n),
		.data(data),
		.sel(sel),
		.seg(seg)
	);
	
	defparam hex_inst.MCNT = 499;

	initial clk = 1'd1;
	always #10 clk = ~clk;
	
	initial begin
		reset_n <= 1'd0;
		#25;
		reset_n <= 1'd1;
		#15;
		data <= 32'h00112233;
		#200_000;
		data <= 32'h44556677;
		#200_000;
		data <= 32'h8899aabb;
		#200_000;
		data <= 32'hccddeeff;
		#200_000;
		$stop;
	end

endmodule

(4)仿真波形:

(5)74HC595芯片:

74HC595芯片内部工作原理:

  • 先传段选,再传位选,先传高位,再传低位。(段位高低)
  • 74HC595芯片在3.3v工作电压下,可以承受的工作频率为12.5MHz。

(6)74HC595驱动代码:

module hc595_driver(clk,reset_n,sel,seg,DIO,SCLK,RCLK);

input clk;
input reset_n;
input [7:0]sel;
input [7:0]seg;

output reg DIO;
output reg SCLK;
output reg RCLK;
	
//74HC595芯片在3.3v工作电压下,可以承受的工作频率为12.5MHz,对应一个周期为80ns,半个周期为两个系统时钟周期
reg div_cnt;
reg [4:0]bit_cnt;

//分频计数器设计
always@(posedge clk or negedge reset_n)
	if(!reset_n)
		div_cnt <= 1'd0;
	else 
		div_cnt <= div_cnt + 1'd1;
		
//bit_cnt设计
always@(posedge clk or negedge reset_n)
	if(!reset_n)
		bit_cnt <= 5'd0;
	else if(div_cnt == 1'd1)
		bit_cnt <= bit_cnt + 5'd1;
	else 
		bit_cnt <= bit_cnt;
		
//序列机设计
always@(posedge clk or negedge reset_n)
	if(!reset_n)begin
		DIO <= 1'd0;
		RCLK <= 1'd0;
		SCLK <= 1'd0;
	end
	else if(div_cnt == 1'd1)begin
		case(bit_cnt)
			5'd0:	begin DIO <= seg[7];SCLK <= 1'd0;RCLK <= 1'd1;end
			5'd1:	begin SCLK <= 1'd1;RCLK <= 1'd0;end
			5'd2:	begin DIO <= seg[6];SCLK <= 1'd0;end
			5'd3:	begin SCLK <= 1'd1;end
			5'd4:	begin DIO <= seg[5];SCLK <= 1'd0;end
			5'd5:	begin SCLK <= 1'd1;end
			5'd6:	begin DIO <= seg[4];SCLK <= 1'd0;end
			5'd7:	begin SCLK <= 1'd1;end
			5'd8:	begin DIO <= seg[3];SCLK <= 1'd0;end
			5'd9:	begin SCLK <= 1'd1;end
			5'd10:begin DIO <= seg[2];SCLK <= 1'd0;end
			5'd11:begin SCLK <= 1'd1;end
			5'd12:begin DIO <= seg[1];SCLK <= 1'd0;end
			5'd13:begin SCLK <= 1'd1;end
			5'd14:begin DIO <= seg[0];SCLK <= 1'd0;end
			5'd15:begin SCLK <= 1'd1;end
			
			5'd16:begin DIO <= sel[7];SCLK <= 1'd0;end
			5'd17:begin SCLK <= 1'd1;end
			5'd18:begin DIO <= sel[6];SCLK <= 1'd0;end
			5'd19:begin SCLK <= 1'd1;end
			5'd20:begin DIO <= sel[5];SCLK <= 1'd0;end
			5'd21:begin SCLK <= 1'd1;end
			5'd22:begin DIO <= sel[4];SCLK <= 1'd0;end
			5'd23:begin SCLK <= 1'd1;end
			5'd24:begin DIO <= sel[3];SCLK <= 1'd0;end
			5'd25:begin SCLK <= 1'd1;end
			5'd26:begin DIO <= sel[2];SCLK <= 1'd0;end
			5'd27:begin SCLK <= 1'd1;end
			5'd28:begin DIO <= sel[1];SCLK <= 1'd0;end
			5'd29:begin SCLK <= 1'd1;end
			5'd30:begin DIO <= sel[0];SCLK <= 1'd0;end
			5'd31:begin SCLK <= 1'd1;end
		endcase
	end
	else begin
		DIO <= DIO;
		RCLK <= RCLK;
		SCLK <= SCLK;
	end
	
endmodule

(7)顶层代码:

module hex_top(clk,reset_n,sw,DIO,SCLK,RCLK);

	input clk;
	input reset_n;
	input [3:0]sw;
	
	output DIO;
	output SCLK;
	output RCLK;
	
	reg [31:0]data;
	
	wire [7:0]sel;
	wire [7:0]seg;
	
	hex hex_inst(
		.clk(clk),
		.reset_n(reset_n),
		.data(data),
		.sel(sel),
		.seg(seg)
	);
	
	hc595_driver hc595_driver_inst(
		.clk(clk),
		.reset_n(reset_n),
		.sel(sel),
		.seg(seg),
		.DIO(DIO),
		.SCLK(SCLK),
		.RCLK(RCLK)
	);
	
//data设计
	always@(posedge clk or negedge reset_n)
		if(!reset_n)
			data <= 32'd0;
		else begin
			case(sw)
				4'h1:data <= 32'h76543210;
				4'h2:data <= 32'hfedcba98;
				4'h4:data <= 32'h98765432;
				4'h8:data <= 32'h12345678;
				default:data <= 32'h00000000;
			endcase
		end


endmodule

(8)引脚绑定:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1925590.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flink CDC 同步表至Paimon 写数据流程,write算子和commit算子。

Flink CDC 同步表至Paimon 写数据流程,write算子和commit算子。(未吃透版) 流程图 一般基本flink cdc 任务同步数据至paimon表时包含3个算子,source、write、global commit。 source端一般是flink connector实现的连接源端进行获取数据的过程,本文探究的是 source算子获…

算法学习笔记(8.6)-编辑距离问题

目录 Question&#xff1a; 动态规划思路&#xff1a; 第一步&#xff1a;思考每轮的决策&#xff0c;定义状态&#xff0c;从而得到dp表 第二步&#xff1a;找出最优子结构&#xff0c;进而推导出状态转移方程 第三步&#xff1a;确定边界条件和状态转移顺序 代码实现&#xf…

BUUCTF逆向wp [FlareOn4]login

按老规矩先查壳&#xff0c;但本题是html文件&#xff0c;查壳会报错 在网上查了一下&#xff0c;可以用vscode查看源代码&#xff0c;我们用VS code打开。 <!DOCTYPE Html /> <html> <head> <title>FLARE On 2017</title> </head> <…

d3dcompiler_47.dll缺失怎么修复,一步步分析d3dcompiler_47.dll文件

d3dcompiler_47.dll缺失怎么修复&#xff1f;快速教大家解决出现d3dcompiler_47.dll问题的方法&#xff0c;一步步教大家快速有效的将丢失的d3dcompiler_47.dll如何修复。 一步步修复d3dcompiler_47.dll分析 1. 重新安装受影响的程序 如果是特定程序报告缺少d3dcompiler_47.d…

Vue实现滚动元素始终固定在最底部

1. 应用场景——聊天 在聊天的时候&#xff0c;展示聊天内容的元素是可以滚动的&#xff0c;通过上下滚动来查看过往消息。不过在首次打开聊天页面以及发送新消息时需要固定在滚动的最底部以及时展示最新的消息&#xff0c;这样才能获得比较好的用户体验。 效果&#xff1a; …

每日一练,java

目录 描述示例 总结 描述 题目来自牛客网 •输入一个字符串&#xff0c;请按长度为8拆分每个输入字符串并进行输出&#xff1b; •长度不是8整数倍的字符串请在后面补数字0&#xff0c;空字符串不处理。 输入描述&#xff1a; 连续输入字符串(每个字符串长度小于等于100) 输…

Wikijs 部署教程

以下是一个 Wikijs 部署的简单教程&#xff0c;涵盖了使用 Docker 和直接安装两种方式&#xff1a; 方法一&#xff1a; 使用 Docker (推荐) Docker 是一个方便快捷的方式来部署 Wikijs&#xff0c;它可以避免许多手动配置步骤。 安装 Docker: 按照 https://docs.docker.com/…

接口测试返回参数的自动化对比!

引言 在现代软件开发过程中&#xff0c;接口测试是验证系统功能正确性和稳定性的核心环节。接口返回参数的对比不仅是确保接口功能实现的手段&#xff0c;也是测试过程中常见且重要的任务。为了提高对比的效率和准确性&#xff0c;我们可以通过自动化手段实现这一过程。本文将…

android CameraX构建相机拍照

Android CameraX 是一个 Jetpack 支持库&#xff0c;旨在简化相机应用的开发工作。它提供了一致且易用的API接口&#xff0c;适用于大多数Android设备&#xff0c;并可向后兼容至Android 5.0&#xff08;API级别21&#xff09;。 CameraX解决了在多种设备上实现相机功能时所遇…

LLM代理应用实战:构建Plotly数据可视化代理

如果你尝试过像ChatGPT这样的LLM&#xff0c;就会知道它们几乎可以为任何语言或包生成代码。但是仅仅依靠LLM是有局限的。对于数据可视化的问题我们需要提供一下的内容 描述数据:模型本身并不知道数据集的细节&#xff0c;比如列名和行细节。手动提供这些信息可能很麻烦&#…

javascipt学习笔记一

JavaScript基础day1 一、编程语言 1.编程 编程&#xff1a;就是让计算机为解决某个问题而使用某种编程设计语言编写程序代码&#xff0c;最终得到结果的过程 计算机程序&#xff1a; 就是计算机所执行的一系列的指令集合。 2.计算机语言 计算机语言指的是用于人与计算机之间通…

Manim的代码练习02:在manim中Dot ,Arrow和NumberPlane对象的使用

Dot&#xff1a;指代点对象或者表示点的符号。Arrow&#xff1a;指代箭头对象&#xff0c;包括直线上的箭头或者向量箭头等。NumberPlane&#xff1a;指代数轴平面对象&#xff0c;在Manim中用来创建包含坐标轴的数学坐标系平面。Text&#xff1a;指代文本对象&#xff0c;用来…

国产数据库VastBase与C/C++程序适配

背景 2022年底的项目&#xff0c;记录一下。 某项目后台使用C程序开发&#xff0c;使用的是OCI连接Oracle数据库。现需要做去O国产化适配改造。 本文聊聊C/C应用程序如何使用VastBase替换Oracle。 编译适配 开发包获取 从VastBase官方或接口人处获取OCI开发包&#xff0c;包含…

品牌产业出海指南如何搭建国际化架构的跨境电商平台?

在“品牌&产业出海指南 – 成功搭建跨境电商平台”系列中&#xff0c;我们将从电商分销系统、跨境平台商城/多商户商城系统和国际化架构三个方面对帮助您梳理不同平台模式的优缺点、应用场景、开发重点和运营建议。 在“品牌&产业出海指南 – 成功搭建跨境电商平台”系…

verITAS:大规模验证图像转换

1. 引言 斯坦福大学Trisha Datta、Binyi Chen 和 Dan Boneh 2024年论文《VerITAS: Verifying Image Transformations at Scale》&#xff0c;开源代码实现见&#xff1a; https://github.com/zk-VerITAS/VerITAS&#xff08;RustPython&#xff09; 依赖https://github.com/a…

Java的高级特性

类的继承 继承是从已有的类中派生出新的类&#xff0c;新的类能拥有已有类的属性和行为&#xff0c;并且可以拓展新的属性和行为 public class 子类 extends 父类{子类类体 } 优点 代码的复用 提高编码效率 易于维护 使类与类产生关联&#xff0c;是多态的前提 缺点 类缺乏独…

纯vue+js实现数字0到增加到指定数字动画效果功能

关于数字增加动画效果网上基本上都是借助第三方插件实现的,就会导致有的项目安装插件总会出问题,所有最好使用原生vue+js实现,比较稳妥 纯vue+js实现数字0到增加到指定数字动画效果功能 vue+js 实现数字增加动画功能 效果图 其中,关于数字变化的间隔时间,延时效果都可…

Linux环境下激活使用Navicat

Linux环境下激活使用Navicat 解压navicat15-premium-linux.zip文件&#xff0c;存放目录自行定义&#xff0c;此处我解压到/home/admin/Downloads&#xff0c;下载地址&#xff1a;https://www.123pan.com/s/hyS7Vv-zJCR.html # 在桌面创建临时目录 mkdir ~/Desktop/navicat…

Flutter和React Native(RN)的比较

Flutter和React Native&#xff08;RN&#xff09;都是用于构建跨平台移动应用程序的流行框架。两者都具有各自的优势和劣势&#xff0c;选择哪个框架取决于您的具体需求和项目。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 以下是…

算法学习笔记(8.5)-零钱兑换问题二

目录 Question&#xff1a; 动态规划思路&#xff1a; 代码实现&#xff1a; 空间优化代码 Question&#xff1a; 给定n种硬币&#xff0c;第i种硬币的面值为coins[i-1],目标金额为amt&#xff0c;每种硬币可以重复选取&#xff0c;问凑出目标金额的硬币组合数量。 动态规划思路…