首页 > 其他分享 >21-数码管静态显示

21-数码管静态显示

时间:2023-07-02 21:46:20浏览次数:38  
标签:sys wire 21 静态 seg 数码管 信号 寄存器

1.数码管静态显示

  • 数码管是一种半导体发光器件,其基本单元是发光二极管
  • 常见的数码管有七段数码管和八段数码管(相差一个小数点),还有米字管,十六段管等

  • 八段发光数码管每一段对应a,b,c,d,e,f,g,dp(小数点)
  • 八段数码管有十个管教,八段+两个公共端com,与数码管内部是导通的
  • 八段数码管又分为共阴极数码管和共阳极数码管,共阴极和共阳极数码管就是将二极管的阴极或者是阳极在数码管内部进行连接起来

1.1 数码管的信息显示

  • 如果显示数字0,那么在0对应的段的端口输入低电平,就可以显示0,a,b,c,d,e,f都点亮,g和dp都是熄灭
  • 十六进制断码中:a对应的二进制数的最低位

1.2 多位八段数码管

  • 六位八段数码管
  • 是否需要48个端口信号?在使用多位8段数码管的时候,为了减少段选的IO口,可以将多个数码管连接起来使用位选信号进行控制,可以通过哪几个数码管
  • 段选信号连在一起,位选信号选择的数码管显示的值是一样的,这就是数码管的静态显示
  • 使用段选+位选的方式只占据14个IO口,但是还是比较多,使用位移缓存器74HC595
  • 74HC595将串行数据转换为并行数据,最低位对应q7,最高位对应q0
  • 内部具有8位移位寄存器,存储器和三态输出
  • 74HC595只有8bit,要满足14bit输入需要两片级联

1.3 串行数据传递顺序

  • DIG6 - 对应位选的第0位,DIG1 - 对应位选的第5位
  • 先传位选信号再传段选信号,位选信号从低位到高位,段选信号从高位到低位

1.4 74HC595使用

使用74HC595芯片,只需要将其四个端口连接到FPGA芯片,就可以使用,所以节省14-4 = 10个IO口

  • DS\SHCP\STCP\OE'端
  • MR'主复位端,低电平有效,MR'有效,可以将移位寄存器中的值进行清0,通常将其接到Vcc,使其为1
  • DS端口,与FPGA芯片进行连接,通过这个端口将串行输入到移位寄存器中
  • SHCP端口,是移位寄存器时钟输入,在上升沿将输入的串行数据移入到移位寄存器当中,注意是移位寄存器,当下一个时钟上升沿到来的之后,上一个上升沿传入的数据就会向下移动一位,如果是串行输入8bit数据,低位传入的数据就回移动到最后面,如果一次输入的超过8bit,比如14bit数据,最先输入的6bit就会通过Q7S端口输出,与下一个595芯片的DS端口连接,就相当于先前输入的6bit会输入到下一个595芯片当中
  • STCP存储寄存器时钟,在上升沿时,会将移位寄存器中的数据写入到存储寄存器中
  • OE'端口信号有效时,就可以将存储寄存器数据通过端口并行输出,输出端口与数码管相连接
  • 通过DS端口传入串行数据,产生SHCP时钟,将DS输入的数据串行移入到移位寄存器中,产生STCP时钟将移位寄存器中的数据传入到存储寄存器中,产生OE信号将存储寄存器中的数据输出

2.FPGA

  • 000000 - FFFFFF,实现六位数码管循环静态显示,每个数值显示时间是0.5s

2.1 框图

  • 输入信号只有时钟和复位信号
  • 输出信号有和595芯片连接的四个信号

2.1.1 子功能模块框图绘制

  • 可以生成两个子功能模块,第一个模块生成位选和片选信号,第二个模块负责驱动595芯片
  • 位选信号是6bit信号,控制6个数码管,段选信号是8bit

2.1.2 系统模块框图绘制

  • 绘制系统框图,可以了解子功能模块的关系
  • 了解子功能模块之间信号关系

2.2 波形图

2.2.1 产生段选和位选的控制信号

  • 输入信号:时钟和复位
  • 每个数字需要维持0.5s,需要计数器
  • 数码管显示:通过一个变量(data)控制字符的切换,每经过一个0.5s就切换一个数值,16个循环
  • 为了控制字符显示,生成cnt_flag信号

2.2.2 产生控制信号的模块波形

  • 定义一个变量data 14bit进行拼接
  • 进行时钟的分频,使用计数器进行时钟分频,时钟信号不能太高也不能太低
  • 50M时钟进行四分频12.5M
  • 再声明一个计数器对于输出的bit数进行计数cnt_bit,分频时钟每经过一个周期,输出一个数,cnt_bit计数器加1,计数到最大值13清0
  • ds信号,初值为0,其他时刻ds等于data数据的从高到低的bit位的值(data[cnt_bit])
  • shcp,为了能够准确采集到数据,要在分频时钟中间采样(上升沿位于分频时钟中间)
  • shtp,14bit数据在存储在移位寄存器之后,产生一个高电平,将移位寄存器的数据移动存储寄存器
  • oe信号,低电平有效,保持低电平有效即可

2.3 RTL

module seg_static 
#(
	parameter CNT_MAX = 25'd24_999_999
)
(
	input wrie sys_clk,
	input wire sys_rst_n,
	
	output reg [5:0] sel,
	output reg [7:0] seg,
		
	
);
	reg [24:0] cnt;
	reg [3:0] data;
	reg cnt_flag;
	
	always@(posedge sys_clk or negedge sys_rst_n)
		if(sys_rst_n == 1'b0)
			cnt <= 25'd0;
		else if(cnt == CNT_MAX)
			cnt <= 25'd0;
		else 
			cnt <= cnt + 1'b1;
			
	
	always@(posedge sys_clk or negedge sys_rst_n)
		if(sys_rst_n == 1'b0)
			data <= 4'd0;
		else if((cnt_flag == 1'b1) && (data == 4'd15))
			data <= 4'd0;
        else if(cnt_flag == 1'b1)
            data <= data + 1'b1;
		else data <= data;
		
	always@(posedge sys_clk or negedge sys_rst_n)
		if(sys_rst_n == 1'b0)
			cnt_flag <= 1'b0
		else if(cnt == CNT_MAX-1)
			cnt_flag <= 1'b1;
		else 
			cnt_flag <= 1'b0;
	
	always@(posedge sys_clk or negedge sys_rst_n)
		if(sys_rst_n == 1'b0)
			sel <= 6'b000_000;
		else 
			sel <= 6'b111_111;
			
	always@(posedge sys_clk or negedge sys_rst_n)
		if(sys_rst_n == 1'b0)
			seg <= 8'hff;
		else case (data)
			4'd0:seg <= 8'hc0;
			4'd0:seg <= 8'hf9;
			4'd0:seg <= 8'ha4;
			4'd0:seg <= 8'hb0;
			4'd0:seg <= 8'h99;
			4'd0:seg <= 8'h92;
			4'd0:seg <= 8'h82;
			4'd0:seg <= 8'hf8;
			4'd0:seg <= 8'h80;
			4'd0:seg <= 8'h88;
			4'd0:seg <= 8'h90;
			4'd0:seg <= 8'h83;
			4'd0:seg <= 8'hc6;
			4'd0:seg <= 8'ha1;
			4'd0:seg <= 8'h86;
			4'd0:seg <= 8'h8e;
			default:seg <= 8'hff;
		endcase
endmodule
  • 段码可以参数化
module hc595_ctrl
(
	input wire sys_clk,
	input wire sys_rst_n,
	input wire [5:0] sel,
	input wire [7:0] seg,
	
	output reg ds,
	output reg shcp,
	output reg stcp,
	output wire oe

);
	wire [13:0] data;
	reg [1:0] cnt;
	reg [3:0] cnt_bit;
	
	assign data = {seg[0],seg[1],seg[2],seg[3],seg[4],seg[5],seg[6],seg[7],sel};
	
	always@(posedge sys_clk or negedge sys_rst_n)
		if(sys_rst_n == 1'b0)
			cnt <= 2'd0;
		else if(cnt == 2'd3)
			cnt <= 2'd0;
		else	
			cnt <= cnt + 1'b1;
	
	always@(posedge sys_clk or negedge sys_rst_n)
		if(sys_rst_n == 1'b0)
			cnt_bit <= 4'd0;
		else if((cnt_bit == 4'd13) && (cnt == 2'd3))
			cnt_bit <= 4'd0;
		else if(cnt == 2'd3)
			cnt_bit <= cnt_bit + 1'b1;
		else
			cnt_bit <= cnt_bit
	
	always@(posedge sys_clk or negedge sys_rst_n)
		if(sys_rst_n == 1'b0)
			ds <= 1'b0;
		else if(cnt == 2'd0)
			ds <= data[cnt_bit]
		else	
			ds <= ds;
			
	always@(posedge sys_clk or negedge sys_rst_n)
		if(sys_rst_n == 1'b0)
			shcp <= 1'b0;
		else if(cnt == 2'd2)
			shcp <= 1'b1;
		else if(cnt == 2'd0)
			shcp <= 1'b0;
		else
			shcp <= shcp;
			
	always@(posedge sys_clk or negedge sys_rst_n)
		if(sys_rst_n == 1'b0)
			stcp <= 1'b0;
		else if((cnt_bit == 4'd0) && (cnt == 2'd0))
			stcp <= 1'b1;
		else if((cnt_bit == 4'd0) && (cnt == 2'd2))
			stcp <= 1'b1;
		else	
			stcp <= stcp;
			
	assign oe <= 1'b0;
endmodule

top


module seg_595_static 
(
	input wire sys_clk,
	input wire sys_rst_n,
	
	output wire ds,
	output wire shcp,
	output wire stcp,
	output wire oe
)

	// 将子模块的输出信号引出
	wire [5:0] sel;
	wire [7:0] sel;


	// 例化子模块
	seg_static 
	# (
		.CNT_MAX (25'd24);
	)
	seg_static_inst(
		.sys_clk (sys_clk),
		.sys_rst_n (sys_rst_n).
		.sel (sel),
		.seg (seg)
	);
	
	hc595_ctrl hc595_ctrl_inst(
		.sys_clk (sys_clk),
	    .sys_rst_n (sys_clk),
		.sel (sel),
        .seg (seg),
		.ds (ds),
		.shcp (shcp),
		.stcp (stcp),
	    .oe (oe)
		
	);
endmodule

2.4 testbench

// tb

module tb_seg_static ();
	reg sys_clk;
	reg sys_rst_n;
	
	wire [5;0] sel;
	wire [7:0] seg;
	
	initial begin
		sys_clk = 1'b1;
		sys_rst_n <= 1'b0;
		#20;
		sys_rst_n <= 1'b1;
	end
	
	always #10 sys_clk =~sys_clk;
	
	seg_static
	#(
		.CNT_MAX (25'd24)
	)
	seg_static_inst(
		.sys_clk (sys_clk),
		.sys_rst_n (sys_rst_n),
		.sel (sel),
		.seg (seg)
	);

	
endmodule


顶层模块tb

// tb

`timescale 1ns/1ns

module tb_seg_595_static ();
	reg sys_clk,
	reg sys_rst_n,
	
	wire ds,
	wire shcp,
	wire stcp,
	wire oe,
	
	initial begin
		sys_clk = 1'b1;
		sys_rst_n <= 1'b0;
		#20;
		sys_rst_n <= 1'b1;
	end
	
	always #10 sys_clk =~sys_clk;
	
	seg_595_static seg__595_static_inst(
		.sys_clk (sys_clk),
		.sys_rst_n (sys_clk),

        .ds (ds),
        .shcp (shcp),
        .stcp (stcp),
	    .oe (oe)

	); 
endmodule

标签:sys,wire,21,静态,seg,数码管,信号,寄存器
From: https://www.cnblogs.com/Icer-newer/p/17493448.html

相关文章

  • 二进制转BCD8421码
    8421码是BCD码中最常用的编码,使用4位二进制表示十进制数0~9,即0000~1001。例如十进制数12转二进制为1100,转化为8421码为00010010(十进制为18),两个编码相减得6。二进制转8421的规则是≥10就加6,否则不加6进行校正。\[\begin{array}{r}10010B\\-1100B\\\hline0110B\end{array}......
  • [WPF]静态资源(StaticResource)和动态资源(DynamicResource)
    一、文章概述本演示介绍了WPF的静态资源和动态资源的基本使用,并对两者做了简单的比较。静态资源(StaticResource)指的是在程序载入内存时对资源的一次性使用,之后就不再访问这个资源了;动态资源(DynamicResource)使用指的是在程序运行过程中然会去访问资源。相关下载(代码、屏幕录像):h......
  • P1217
    难度:4/10总结1同时试验了O(k*根号n)的质数试验法和O(nloglogn)≈O(n)的埃氏筛法,虽然看上去筛法更快,但是,当k不大且n不小的时候,即真正所需知道是否的质数的数不多时,朴素的挨个试验法其实更快,两个方法的代码都在这里。2scanf/printf功能更强大而且读写速度几乎比cin/cout快了一倍,所以......
  • 1321. 餐馆营业额变化增长
    1321.餐馆营业额变化增长SQL架构表:Customer+---------------+---------+|ColumnName|Type|+---------------+---------+|customer_id|int||name|varchar||visited_on|date||amount|int|+-------------......
  • AtCoder Grand Contest 021 E Ball Eat Chameleons
    洛谷传送门AtCoder传送门容易发现一个变色龙是红色当且仅当,设\(R\)为红球数量,\(B\)为蓝球数量,那么\(R\geB\)或\(R=B\)且最后一个球是蓝球。考虑如何判定一个颜色序列是否可行。考虑贪心。若\(R<B\)显然不行。若\(R\geB+n\),每个变色龙都可以分到比蓝球......
  • 结合静态与动态分析优势范围的fuzzer:Arbiter
    对于Arbier这款新型fuzzer的研究,目前网络上几乎没有内容,因此大部分内容的直接来源于Arbier的论文《Arbiter:BridgingtheStaticandDynamicDivideinVulnerabilityDiscoveryonBinaryPrograms》,该论文随着2022年8月的USENIX安全研讨会的论文集中发表。1.引言当前最先......
  • 【题解】P8741 [蓝桥杯 2021 省 B] 填空问题 题解
    P8741[蓝桥杯2021省B]填空问题题解题目传送门欢迎大家指出错误并联系这个蒟蒻更新日志2023-05-0923:19文章完成2023-05-0923:20通过审核2023-06-2021:03优化了文章代码格式试题A:空间【解析】本题考察计算机存储的基础知识,只要掌握空间存储的换算方法,就能......
  • Windows兼容模式怎么设置?140.210.18.x
    服务器兼容是什么意思?服务器兼容性怎么改?兼容性(compatibility)是指硬件之间、软件之间或是软硬件组合系统之间的相互协调工作的程度。兼容的概念比较广,相对于硬件来说,几种不同的电脑部件,如CPU、主板、显示卡等,如果在工作时能够相互配合、稳定地工作,就说它们之间的兼容性比较好,反之就......
  • 将onnx的静态batch改为动态batch及修改输入输出层的名称
    目录背景操作修改输入输出层修改输入输出层名称完整代码背景在模型的部署中,为了高效利用硬件算力,常常会需要将多个输入组成一个batch同时输入网络进行推理,这个batch的大小根据系统的负载或者摄像头的路数时刻在变化,因此网络的输入batch是在动态变化的。对于pytorch等框架来说,我......
  • 代码随想录算法训练营第二十一天| 216.组合总和III 17.电话号码的字母组合
    216.组合总和III  思路:很像上一个组合类型的题目,唯一不同的就是自己写一个sum代码:1voidconvertBST_cur(TreeNode*root,vector<TreeNode*>&nodes)2{3if(!root)return;4if(root->left)convertBST_cur(root->left,nodes);5nodes.push_bac......