always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
delay_cnt_1hz<=26'd0;
else if(delay_cnt_1hz==26'd49999999)
delay_cnt_1hz<=26'd0;
else
delay_cnt_1hz<=delay_cnt_1hz+1'b1;
end
always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
disp_dat<=4'd0;
else if(delay_cnt==16'd49999)
disp_dat<=disp_dat+1'b1;
else
disp_dat<=disp_dat;
end
always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
count<=6'd0;
else if(delay_cnt_1hz==26'd49999999)
count<=count+1'b1;
else if(count==60)
count<=6'd0;
else
count<=count;
end
always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
shi<=4'd0;
else
shi<=count/10;
end
always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
ge<=4'd0;
else
ge<=count%10;
end
sys_rstn ,
sm_seg ,
sm_bit
);
input sys_clk ;
input sys_rstn ;
output [7:0] sm_seg ;
output [7:0] sm_bit ;
reg [7:0] sm_seg ;
reg [7:0] sm_bit ;
reg [4:0] dataout_buf ;
reg [3:0] shi ;
reg [3:0] ge ;
reg [5:0] count ;
reg [1:0] disp_dat ;
reg [15:0] delay_cnt ;
reg [25:0] delay_cnt_1hz ;
always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
delay_cnt<=16'd0;
else if(delay_cnt==16'd49999)
delay_cnt<=16'd0;
else
delay_cnt<=delay_cnt+1'b1;
end
always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
delay_cnt_1hz<=26'd0;
else if(delay_cnt_1hz==26'd49999999)
delay_cnt_1hz<=26'd0;
else
delay_cnt_1hz<=delay_cnt_1hz+1'b1;
end
always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
disp_dat<=4'd0;
else if(delay_cnt==16'd49999)
disp_dat<=disp_dat+1'b1;
else
disp_dat<=disp_dat;
end
always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
count<=6'd0;
else if(delay_cnt_1hz==26'd49999999)
count<=count+1'b1;
else if(count==60)
count<=6'd0;
else
count<=count;
end
always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
shi<=4'd0;
else
shi<=count/10;
end
always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
ge<=4'd0;
else
ge<=count%10;
end
always @(disp_dat)
begin
case(disp_dat)
2'b00 :
sm_bit = 8'b1111_1110;
2'b01 :
sm_bit = 8'b1111_1101;
/* 2'b10 :
sm_bit = 8'b1111_1110;
2'b11 :
sm_bit = 8'b1111_1101;*/
default :
sm_bit = 8'b1111_1110;
endcase
end
always@(sm_bit)
begin
case(sm_bit)
8'b1111_1110:
dataout_buf<=ge;
8'b1111_1101:
dataout_buf<=shi;
/*8'b1111_1011:
dataout_buf=2;
8'b1111_0111:
dataout_buf=3;
8'b1110_1111:
dataout_buf=4;
8'b1101_1111:
dataout_buf=5;
8'b1011_1111:
dataout_buf=6;
8'b0111_1111:
dataout_buf=7;*/
default:
dataout_buf=0;
endcase
end
always@(dataout_buf)
begin
case(dataout_buf)
4'h0 : sm_seg = 8'hc0; // "0"
4'h1 : sm_seg = 8'hf9; // "1"
4'h2 : sm_seg = 8'ha4; // "2"
4'h3 : sm_seg = 8'hb0; // "3"
4'h4 : sm_seg = 8'h99; // "4"
4'h5 : sm_seg = 8'h92; // "5"
4'h6 : sm_seg = 8'h82; // "6"
4'h7 : sm_seg = 8'hf8; // "7"
4'h8 : sm_seg = 8'h80; // "8"
4'h9 : sm_seg = 8'h90; // "9"
4'ha : sm_seg = 8'h88; // "a"
4'hb : sm_seg = 8'h83; // "b"
4'hc : sm_seg = 8'hc6; // "c"
4'hd : sm_seg = 8'ha1; // "d"
4'he : sm_seg = 8'h86; // "e"
4'hf : sm_seg = 8'h8e; // "f"
default :
sm_seg = 8'hc0; // "0"
endcase
end
endmodule
用systemverilog写的,相比于Verilog就多了个logic 变量,其它与Verilog一致。
顶层模块:
`timescale 1ns/1ps
//模块说明:7段数码管显示,一共有8个数码管
//共阳模式,低电平点亮,数码管采用3-8 译码器——74HC138芯片,
module cnt_60
(
input logic CLK , //输入时钟,频率:
input logic RST_n , //复位端口,低电平复位
output logic [3:0] DSEL , //7段数码管【8--1】对应选择
output logic DEN , //数码管使能,高电平有效
output logic [7:0] led7_out //数据输出,最低位为小数点
);
logic [26:0] num; //待显示的数字
logic [2:0] dot; //待显示数字的小数点位置
always@(posedge CLK,negedge RST_n)
begin
if(!RST_n)
num <= 27'd0;
else
num = (num != 59)? (num + 27'd1) : num;
end
LED_7 U_LED_7
(
.CLK (CLK ), //输入时钟
.RST_n (RST_n ), //复位端口,低电平复位
.data_num (num ), //待显示的数据
.data_dot (dot ), //输入数据小数点位置
.DSEL (DSEL ), //7段数码管【8--1】对应选择
.DEN (DEN ), //数码管使能,高电平有效
.led7_out (led7_out ) //数据输出,最低位为小数点
);
endmodule
一周热门 更多>