在seg_595 基础上,更改data_gen模块,的数字时钟。

module data_gen
#(
parameter MAX_1S = 26'd49_999_999 ,
NINE = 4'd9 ,
FIVE = 4'd5
)(
input wire sys_clk ,
input wire sys_rst_n ,
output reg [19:00] data ,
output wire [05:00] point ,
output wire sign ,
output reg seg_en
);
// reg signal define
reg [25:00] cnt_1s ;
reg add_flag ;
reg [03:00] sec_g ;
reg [03:00] sec_s ;
reg [03:00] min_g ;
reg [03:00] min_s ;
reg [03:00] hou_g ;
reg [03:00] hou_s ;
reg [19:00] data_time ;
// [25:00] cnt_1s ;
always @(posedge sys_clk or negedge sys_rst_n) begin
if(~sys_rst_n) begin
cnt_1s <= 26'd0 ;
end else begin
if(cnt_1s == MAX_1S) begin
cnt_1s <= 26'd0 ;
end else begin
cnt_1s <= cnt_1s + 1'b1 ;
end
end
end
// add_flag ;
always @(posedge sys_clk or negedge sys_rst_n) begin
if(~sys_rst_n) begin
add_flag <= 1'b0 ;
end else begin
if(cnt_1s == ( MAX_1S - 1'b1) ) begin
add_flag <= 1'b1;
end else begin
add_flag <= 1'b0 ;
end
end
end
// [03:00] sec_g ;
always @(posedge sys_clk or negedge sys_rst_n) begin
if(~sys_rst_n) begin
sec_g <= 4'd0 ;
end else begin
if(add_flag) begin
if(sec_g == NINE) begin
sec_g <= 4'd0 ;
end else begin
sec_g <= sec_g + 1'b1 ;
end
end else begin
sec_g <= sec_g ;
end
end
end
// [03:00] sec_s ;
always @(posedge sys_clk or negedge sys_rst_n) begin
if(~sys_rst_n) begin
sec_s <= 4'd0 ;
end else begin
if(add_flag && ( sec_g == NINE) ) begin
if(sec_s == FIVE) begin
sec_s <= 4'd0 ;
end else begin
sec_s <= sec_s + 1'b1 ;
end
end else begin
sec_s <= sec_s ;
end
end
end
// [03:00] min_g ;
always @(posedge sys_clk or negedge sys_rst_n) begin
if(~sys_rst_n) begin
min_g <= 4'b0 ;
end else begin
if(add_flag && (sec_g == NINE) && (sec_s == FIVE)) begin
if(min_g == NINE) begin
min_g <= 4'd0 ;
end else begin
min_g <= min_g + 1'b1 ;
end
end else begin
min_g <= min_g ;
end
end
end
// [03:00] min_s ;
always @(posedge sys_clk or negedge sys_rst_n) begin
if(~sys_rst_n) begin
min_s <= 4'd0 ;
end else begin
if(add_flag && (sec_g == NINE) && (sec_s == FIVE) && (min_g == NINE)) begin
if(min_s == FIVE) begin
min_s <= 4'd0 ;
end else begin
min_s <= min_s + 1'b1 ;
end
end else begin
min_s <= min_s ;
end
end
end
// [03:00] hou_g ;
always @(posedge sys_clk or negedge sys_rst_n) begin
if(~sys_rst_n) begin
hou_g <= 4'd0 ;
end else begin
if(add_flag && (sec_g == NINE) && (sec_s == FIVE) && (min_g == NINE) && (min_s == FIVE)) begin
if( ((hou_s == 4'd2) && (hou_g == 4'd3)) || (hou_s != 4'd2) && (hou_g == NINE) ) begin
hou_g <= 4'd0 ;
end else begin
hou_g <= hou_g + 1'b1 ;
end
end else begin
hou_g <= hou_g ;
end
end
end
// [03:00] hou_s ;
always @(posedge sys_clk or negedge sys_rst_n) begin
if(~sys_rst_n) begin
hou_s <= 4'd0 ;
end else begin
if(hou_s == 4'd2) begin
if(add_flag && (sec_g == NINE) && (sec_s == FIVE) && (min_g == NINE) && (min_s == FIVE) && (hou_g == 4'd3)) begin
hou_s <= 4'd0 ;
end else begin
hou_s <= hou_s ;
end
end else begin
if(add_flag && (sec_g == NINE) && (sec_s == FIVE) && (min_g == NINE) && (min_s == FIVE) && (hou_g == NINE)) begin
hou_s <= hou_s +1'b1 ;
end else begin
hou_s <= hou_s ;
end
end
end
end
// [19:00] data_time ;
always @(posedge sys_clk or negedge sys_rst_n) begin
if(~sys_rst_n) begin
data_time <= 20'd0 ;
end else begin
data_time <= sec_g + sec_s * 10 + min_g * 100 + min_s * 1000 + hou_g * 1000_0 + hou_s * 1000_00 ;
end
end
// output
// data
always @(posedge sys_clk or negedge sys_rst_n) begin
if(~sys_rst_n) begin
data <= 20'd0 ;
end else begin
data <= data_time ;
end
end
// point
assign point = 6'b001010 ;
// sign
assign sign = 1'b0 ;
// seg_en
always @(posedge sys_clk or negedge sys_rst_n) begin
if(~sys_rst_n) begin
seg_en <= 1'b0 ;
end else begin
seg_en <= 1'b1 ;
end
end
endmodule
`timescale 1ns/1ns
module test_data_gen();
reg sys_clk ;
reg sys_rst_n ;
wire [19:00] data ;
wire [05:00] point ;
wire sign ;
wire seg_en ;
data_gen
#(
.MAX_1S ( 23'd5 ),
.NINE ( 4'd9 ),
.FIVE ( 4'd5 )
)
data_gen_insert
(
.sys_clk ( sys_clk ) ,
.sys_rst_n ( sys_rst_n ) ,
.data ( data ) ,
.point ( point ) ,
.sign ( sign ) ,
.seg_en ( seg_en )
);
parameter CYCLE = 20 ;
initial begin
sys_clk = 1'b1 ;
sys_rst_n <= 1'b0 ;
#( CYCLE * 10 ) ;
sys_rst_n <= 1'b1 ;
#( 210 ) ;
sys_rst_n <= 1'b0 ;
#( 10 ) ;
#( CYCLE * 10 ) ;
sys_rst_n <= 1'b1 ;
#( CYCLE * 1000 ) ;
$stop ;
end
always #( CYCLE / 2 ) sys_clk = ~sys_clk ;
endmodule
本文详细描述了一个模块化设计,对data_gen模块进行了修改,用于生成实时的数字时钟,包括秒、分钟和小时的计数,以及相应的输出信号如数据、点数、符号和段启用。
522

被折叠的 条评论
为什么被折叠?



