数码管静态显示(一)

1.原理

计数0.5S,一个时钟周期20ns,因此要计数0.5s就是要从0计数到24999_999。

级联两个芯片可以实现16位得串并转换

MR是主复位端口,横线表示低电平有效。通常接到vcc,防止数据得清零。DS输入数据,SHCP输入时钟,在上升沿时刻,将输入的串行数据输入到移位寄存器中。Q7S溢出8位会输入到下一个595芯片中。内部得8位寄存器由STCP控制,是一个时钟,当STCP上升沿会将数据输入到寄存器当中,使能信号OE低电平有效时就将存储得数据输出出去。

实验目标,动态显示000000-FFFFFF的循环静态显示,每个字符的显示时间是0.5s。

2.代码

复制代码
module seg_static#(
	parameter CNT_MAX=25'd24999_999
)
(
	input 	wire			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==CNT_MAX)
		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'b1)
		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'b0;
	else 
		sel<=6'b111_111;
		
always@(posedge sys_clk or negedge sys_rst_n)
	if(sys_rst_n==1'b0)
		seg<=8'hc0;
	else case(data)
		4'd0:	seg=8'hc0;
		4'd1:	seg=8'hf9;
		4'd2:	seg=8'ha4;
		4'd3:	seg=8'hb0;
		4'd4:	seg=8'h99;
		4'd5:	seg=8'h92;
		4'd6:	seg=8'h82;
		4'd7:	seg=8'hf8;
		4'd8:	seg=8'h80;
		4'd9:	seg=8'h90;
		4'd10:  seg=8'h88;
		4'd11:  seg=8'h83;
		4'd12:  seg=8'hc6;
		4'd13:  seg=8'ha1;
		4'd14:  seg=8'h86;
		4'd15:  seg=8'h8e;
		default:seg=8'hc0;
	endcase
	
endmodule;

seg_595_static.v

复制代码
module seg_595_static
(
	input wire 		sys_clk			,
	input wire 		sys_rst_n		,
	
	output reg 		ds				,
	output reg 		shcp			,
	output reg		stcp			,
	output reg 		oe		
);

wire [5:0]sel;
wire [7:0]seg;

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_seg_595_static.v

复制代码
`timescale 1ns/1ns
module tb_seg_595_static();

reg sys_clk;
reg sys_rst_n;

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
相关推荐
橘为己有44114 分钟前
51单片机:定时/计数器
单片机·51单片机
杯子不吃紫菜3 小时前
LangGraph 体系实战(下):中断恢复、流式、子图与设计模式
单片机·嵌入式硬件·设计模式
qq_448011163 小时前
中断服务函数简介
嵌入式硬件
Risehuxyc3 小时前
STM32程序逻辑---入口函数逻辑和NVIC嵌套向量中断控制器初始化
stm32·单片机·嵌入式硬件
【 STM32开发 】4 小时前
CubeMX+STM32】SD卡U盘实现__USB+FATFS (F103 篇)
stm32·单片机·嵌入式硬件
jianqiang.xue4 小时前
3倍向量算力:Arm给最小MCU装上本地AI
arm开发·人工智能·单片机
无敌最俊朗-18 小时前
【电感专题2:电感的感抗、电路的阻抗、电流的滞后】
单片机·嵌入式硬件·元器件·电感
wuyk5551 天前
嵌入式故障诊断-Bug002-局部大数组压栈高温必死机
stm32·单片机·嵌入式硬件·mcu·物联网·51单片机·嵌入式实时数据库
Zwawa1 天前
嵌入式OLED表驱动菜单:用一张表、一个栈和一个窗口重写表驱动菜单
c语言·单片机·嵌入式
Dev_XH1 天前
【成品设计】基于沁恒单片机的电动汽车充电站智慧调度系统
stm32·单片机·嵌入式硬件·物联网