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