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

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.mfbz.cn/a/789545.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在亚马逊云科技AWS上利用SageMaker机器学习模型平台搭建生成式AI应用(附Llama大模型部署和测试代码)

项目简介&#xff1a; 接下来&#xff0c;小李哥将会每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践&#xff0c;并应用到自己的日常工作里。本次介绍的是如何在Amazon …

【割点 C++BFS】2556. 二进制矩阵中翻转最多一次使路径不连通

本文涉及知识点 割点 图论知识汇总 CBFS算法 LeetCode2556. 二进制矩阵中翻转最多一次使路径不连通 给你一个下标从 0 开始的 m x n 二进制 矩阵 grid 。你可以从一个格子 (row, col) 移动到格子 (row 1, col) 或者 (row, col 1) &#xff0c;前提是前往的格子值为 1 。如…

【经典链表OJ】环形链表

一、题目要求 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&…

NSAT-8000电源检测软件测试砖式电源模块的方案及优势

砖式电源模块类型 砖式电源&#xff0c;顾名思义其外观尺寸像块砖&#xff0c;具有体积小、功率大、安装方便等特点。砖式电源模块具备高可靠性和高稳定性&#xff0c;能够为设备提供稳定的电力输出&#xff0c;在通信、工业、医疗等领域广泛应用。 根据尺寸大小&#xff0c;砖…

《WebGIS快速开发教程》第7版发布

老规矩先看封面&#xff1a; 可以看到我们在封面上加了“classic”的字样&#xff0c;这意味着第7版将会是经典版本&#xff0c;或者说具有里程碑意义的一个版本。 拿到新书我们可以看到第7版的整体风格是以“业务场景”为核心&#xff0c;所有讲解的知识点和案例都是围绕着业…

window下载安装clang

执行clang报错&#xff1a; c:/>clang test.cclang: warning: unable to find a Visual Studio installation; try running Clang from a developer command prompt [-Wmsvc-not-found] clang: error: unable to execute command: program not executable clang: error: li…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第一篇 嵌入式Linux入门篇-第十七章 Linux 环境变量

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

【竞技宝 】欧洲杯:赛事水货盘点

本届欧洲杯接近尾声,有些球员抓住机会趁势崛起,踢出了身价。可惜还有一些球员的表现无法让球迷和媒体满意,下面我们就来盘点下本届欧洲杯的水货球员,看看哪些人因为糟糕的表现上榜? 格瓦迪奥尔(克罗地亚) 本届欧洲杯是克罗地亚黄金一代球员的谢幕之战,原本格瓦迪奥尔作为球队…

24/07/08数据结构(2.1203)顺序表实现

size属于结构体的作用域 如果要访问一个结构体的指针用-> 如果要访问一个结构体的变量用. 点操作 #include<stdio.h> #include<stdlib.h> #include<string.h> #include"seqlist.h" //typedef struct seqList{ // SLDataType* _data; //需…

重磅来袭!MoneyPrinterPlus一键发布短视频到视频号,抖音,快手,小红书上线了

MoneyPrinterPlus开源有一段时间了&#xff0c;已经实现了批量短视频混剪&#xff0c;一键生成短视频等功能。 有些小伙伴说了&#xff0c;我批量生成的短视频能不能一键上传到视频号,抖音,快手,小红书这些视频平台呢&#xff1f;答案是必须可以。 下面上干货。 软件准备 当…

【Android】基于 LocationManager 原生实现定位打卡

目录 前言一、实现效果二、定位原理三、具体实现1. 获取权限2. 页面绘制3. 获取经纬度4. 方法调用5. 坐标转换6. 距离计算7. 完整代码 前言 最近公司有个新需求&#xff0c;想要用定位进行考勤打卡&#xff0c;在距离打卡地一定范围内才可以进行打卡。本文将借鉴 RxTool 的 Rx…

sdwan是硬件还是网络协议?

SD-WAN&#xff08;Software-Defined Wide Area Network&#xff0c;软件定义广域网&#xff09;并不是一个硬件产品或单一的网络协议&#xff0c;而是结合了软件、硬件和网络技术的一种解决方案。SD-WAN的核心在于其软件定义的特性&#xff0c;它通过软件来控制和管理广域网的…

如何压缩pdf文件大小,怎么压缩pdf文件大小

在数字化时代&#xff0c;pdf文件因其稳定的格式和跨平台兼容性&#xff0c;成为了工作与学习中不可或缺的一部分。然而&#xff0c;随着pdf文件内容的丰富&#xff0c;pdf文件的体积也随之增大&#xff0c;给传输和存储带来了不少挑战。本文将深入探讨如何高效压缩pdf文件大小…

@RequestPart 与 @RequestBody、@RequestParam 注解的异同点

前言 RequestPart 注解是我们在JavaEE 开发中&#xff0c;比较常见的一个注解。它经常会与 RequestBody 、RequestParam 注解进行比较&#xff0c;这篇博文我们以案例和源码相结合&#xff0c;分析这几个注解的异同点。 案例演示 创建实体类 User Data NoArgsConstructor A…

Python requests爬虫

Python的requests库是一个强大且易于使用的HTTP库&#xff0c;用于发送HTTP请求和处理响应。它是Python中最受欢迎的网络爬虫框架之一&#xff0c;被广泛用于从网页中提取数据、爬取网站和进行API调用。 使用requests库&#xff0c;你可以轻松地发送各种HTTP请求&#xff0c;包…

提示词工程(Prompt Engineering)是什么?

一、定义 Prompt Engineering 提示词工程&#xff08;Prompt Engineering&#xff09;是一项通过优化提示词&#xff08;Prompt&#xff09;和生成策略&#xff0c;从而获得更好的模型返回结果的工程技术。 二、System message 系统指令 System message可以被广泛应用在&am…

linux自动化内存监控与告警

文章目录 前言一、脚本实现1. shell脚本实现2. 脚本功能概览 二、设置定时执行1. 编辑cron任务表2. 设置定时任务 三、通知结果示例总结 前言 在当今数字化与网络化日益普及的时代&#xff0c;系统管理与维护成为了确保业务连续性和数据安全的关键环节。其中&#xff0c;监控系…

大模型时代:人工智能与大数据平台的深度融合

在当今的大数据时代&#xff0c;数据已经成为驱动业务增长和创新的关键因素。与此同时&#xff0c;随着人工智能技术的不断进步&#xff0c;AI在大规模数据处理和分析方面的能力日益强大。因此&#xff0c;将人工智能与大数据平台相结合&#xff0c;可以为企业带来巨大的商业价…

linux信息收集与提权

目录 版本信息收集 kali得一些exp网站 kali自带的searchsploit工具 脏牛提权漏洞&#xff08;改写没有写权限的文件&#xff09; 测试靶场下载链接 sudo提权 上传恶意C脚本进行编译生成dirty的elf文件&#xff0c;也可以在攻击机编译好上传 启动&#xff0c;123456是设…

网站地址显示不安全怎么办

当网址栏显示不安全时&#xff0c;通常是因为网站使用的是HTTP而不是HTTPS协议&#xff0c;或者因为网站的SSL证书存在问题。以下是一些解决方法&#xff1a;1、迁移到HTTPS&#xff1a;如果您是网站所有者&#xff0c;最好的解决方法是将网站迁移到HTTPS。HTTPS通过使用SSL/TL…