/// WDTimer.cpp
// 2020/12/23 by marsee
//
#include <ap_int.h>
int WDTimer(ap_uint<1> *rst_in, volatile ap_uint<1> *rst_out, ap_uint<1> *enable){
#pragma HLS INTERFACE ap_none register port=rst_out
#pragma HLS INTERFACE ap_ctrl_none port=return
ap_uint<20> i;
*rst_out = 0;
for(i=0; i<1048575; i++){
if(*enable == ap_uint<1>(1)){
i = i;
}else{
--i;
continue;
}
if(*rst_in == ap_uint<1>(1))
i = 0;
else
i = i;
if(i>524287){
*rst_out = 1;
--i;
}else{
*rst_out = 0;
}
}
return(0);
}
// ==============================================================
// RTL generated by Vitis HLS - High-Level Synthesis from C, C++ and OpenCL
// Version: 2020.1
// Copyright (C) 1986-2020 Xilinx, Inc. All Rights Reserved.
//
// ===========================================================
`timescale 1 ns / 1 ps
(* CORE_GENERATION_INFO="WDTimer_WDTimer,hls_ip_2020_1,{HLS_INPUT_TYPE=cxx,HLS_INPUT_FLOAT=0,HLS_INPUT_FIXED=0,HLS_INPUT_PART=xc7z020-clg400-1,HLS_INPUT_CLOCK=10.000000,HLS_INPUT_ARCH=others,HLS_SYN_CLOCK=6.914250,HLS_SYN_LAT=-1,HLS_SYN_TPT=none,HLS_SYN_MEM=0,HLS_SYN_DSP=0,HLS_SYN_FF=27,HLS_SYN_LUT=210,HLS_VERSION=2020_1}" *)
module WDTimer (
ap_clk,
ap_rst,
rst_in,
rst_out,
enable,
ap_return
);
parameter ap_ST_fsm_state1 = 4'd1;
parameter ap_ST_fsm_state2 = 4'd2;
parameter ap_ST_fsm_pp0_stage0 = 4'd4;
parameter ap_ST_fsm_state5 = 4'd8;
input ap_clk;
input ap_rst;
input [0:0] rst_in;
output [0:0] rst_out;
input [0:0] enable;
output [31:0] ap_return;
reg [0:0] rst_out_1_data_reg;
reg [0:0] rst_out_1_data_in;
reg rst_out_1_vld_reg;
reg rst_out_1_vld_in;
reg rst_out_1_ack_in;
reg [19:0] empty_reg_77;
wire [0:0] enable_read_read_fu_64_p2;
(* fsm_encoding = "none" *) reg [3:0] ap_CS_fsm;
wire ap_CS_fsm_state2;
wire [0:0] icmp_ln882_fu_99_p2;
wire ap_CS_fsm_pp0_stage0;
wire ap_block_state3_pp0_stage0_iter0;
wire ap_block_state4_pp0_stage0_iter1;
wire ap_block_pp0_stage0_11001;
wire [0:0] tmp_fu_120_p3;
wire [19:0] add_ln695_fu_135_p2;
reg ap_enable_reg_pp0_iter0;
wire ap_block_pp0_stage0_subdone;
reg ap_condition_pp0_exit_iter0_state3;
reg ap_enable_reg_pp0_iter1;
reg [19:0] ap_phi_mux_empty_11_phi_fu_91_p6;
wire [19:0] add_ln696_fu_105_p2;
wire [19:0] ap_phi_reg_pp0_iter0_empty_11_reg_88;
wire [19:0] select_ln23_fu_112_p3;
wire [19:0] add_ln696_1_fu_128_p2;
wire ap_CS_fsm_state1;
wire ap_block_pp0_stage0_01001;
wire ap_block_pp0_stage0;
wire ap_CS_fsm_state5;
reg [3:0] ap_NS_fsm;
reg ap_idle_pp0;
wire ap_enable_pp0;
// power-on initialization
initial begin
#0 rst_out_1_data_reg = 1'd0;
#0 rst_out_1_vld_reg = 1'b0;
#0 ap_CS_fsm = 4'd1;
#0 ap_enable_reg_pp0_iter0 = 1'b0;
#0 ap_enable_reg_pp0_iter1 = 1'b0;
end
always @ (posedge ap_clk) begin
if (ap_rst == 1'b1) begin
ap_CS_fsm <= ap_ST_fsm_state1;
end else begin
ap_CS_fsm <= ap_NS_fsm;
end
end
always @ (posedge ap_clk) begin
if (ap_rst == 1'b1) begin
ap_enable_reg_pp0_iter0 <= 1'b0;
end else begin
if (((1'b0 == ap_block_pp0_stage0_subdone) & (1'b1 == ap_condition_pp0_exit_iter0_state3) & (1'b1 == ap_CS_fsm_pp0_stage0))) begin
ap_enable_reg_pp0_iter0 <= 1'b0;
end else if ((1'b1 == ap_CS_fsm_state2)) begin
ap_enable_reg_pp0_iter0 <= 1'b1;
end
end
end
always @ (posedge ap_clk) begin
if (ap_rst == 1'b1) begin
ap_enable_reg_pp0_iter1 <= 1'b0;
end else begin
if (((1'b0 == ap_block_pp0_stage0_subdone) & (1'b1 == ap_condition_pp0_exit_iter0_state3))) begin
ap_enable_reg_pp0_iter1 <= (1'b1 ^ ap_condition_pp0_exit_iter0_state3);
end else if ((1'b0 == ap_block_pp0_stage0_subdone)) begin
ap_enable_reg_pp0_iter1 <= ap_enable_reg_pp0_iter0;
end else if ((1'b1 == ap_CS_fsm_state2)) begin
ap_enable_reg_pp0_iter1 <= 1'b0;
end
end
end
always @ (posedge ap_clk) begin
if ((1'b1 == ap_CS_fsm_state2)) begin
empty_reg_77 <= 20'd0;
end else if (((ap_enable_reg_pp0_iter0 == 1'b1) & (1'b0 == ap_block_pp0_stage0_11001) & (icmp_ln882_fu_99_p2 == 1'd0) & (1'b1 == ap_CS_fsm_pp0_stage0))) begin
empty_reg_77 <= add_ln695_fu_135_p2;
end
end
always @ (posedge ap_clk) begin
if ((((1'b1 == 1'b1) & (rst_out_1_vld_in == 1'b1) & (rst_out_1_vld_reg == 1'b1)) | ((rst_out_1_vld_in == 1'b1) & (rst_out_1_vld_reg == 1'b0)))) begin
rst_out_1_data_reg <= rst_out_1_data_in;
end
end
always @ (*) begin
if ((icmp_ln882_fu_99_p2 == 1'd1)) begin
ap_condition_pp0_exit_iter0_state3 = 1'b1;
end else begin
ap_condition_pp0_exit_iter0_state3 = 1'b0;
end
end
always @ (*) begin
if (((ap_enable_reg_pp0_iter1 == 1'b0) & (ap_enable_reg_pp0_iter0 == 1'b0))) begin
ap_idle_pp0 = 1'b1;
end else begin
ap_idle_pp0 = 1'b0;
end
end
always @ (*) begin
if ((icmp_ln882_fu_99_p2 == 1'd0)) begin
if (((tmp_fu_120_p3 == 1'd1) & (enable_read_read_fu_64_p2 == 1'd1))) begin
ap_phi_mux_empty_11_phi_fu_91_p6 = add_ln696_1_fu_128_p2;
end else if (((tmp_fu_120_p3 == 1'd0) & (enable_read_read_fu_64_p2 == 1'd1))) begin
ap_phi_mux_empty_11_phi_fu_91_p6 = select_ln23_fu_112_p3;
end else if ((enable_read_read_fu_64_p2 == 1'd0)) begin
ap_phi_mux_empty_11_phi_fu_91_p6 = add_ln696_fu_105_p2;
end else begin
ap_phi_mux_empty_11_phi_fu_91_p6 = ap_phi_reg_pp0_iter0_empty_11_reg_88;
end
end else begin
ap_phi_mux_empty_11_phi_fu_91_p6 = ap_phi_reg_pp0_iter0_empty_11_reg_88;
end
end
always @ (*) begin
if (((rst_out_1_vld_reg == 1'b0) | ((1'b1 == 1'b1) & (rst_out_1_vld_reg == 1'b1)))) begin
rst_out_1_ack_in = 1'b1;
end else begin
rst_out_1_ack_in = 1'b0;
end
end
always @ (*) begin
if (((ap_enable_reg_pp0_iter0 == 1'b1) & (tmp_fu_120_p3 == 1'd1) & (1'b0 == ap_block_pp0_stage0_01001) & (icmp_ln882_fu_99_p2 == 1'd0) & (enable_read_read_fu_64_p2 == 1'd1) & (1'b1 == ap_CS_fsm_pp0_stage0))) begin
rst_out_1_data_in = 1'd1;
end else if (((1'b1 == ap_CS_fsm_state1) | ((ap_enable_reg_pp0_iter0 == 1'b1) & (tmp_fu_120_p3 == 1'd0) & (1'b0 == ap_block_pp0_stage0_01001) & (icmp_ln882_fu_99_p2 == 1'd0) & (enable_read_read_fu_64_p2 == 1'd1) & (1'b1 == ap_CS_fsm_pp0_stage0)))) begin
rst_out_1_data_in = 1'd0;
end else begin
rst_out_1_data_in = 'bx;
end
end
always @ (*) begin
if (((1'b1 == ap_CS_fsm_state1) | ((ap_enable_reg_pp0_iter0 == 1'b1) & (tmp_fu_120_p3 == 1'd1) & (1'b0 == ap_block_pp0_stage0_11001) & (icmp_ln882_fu_99_p2 == 1'd0) & (enable_read_read_fu_64_p2 == 1'd1) & (1'b1 == ap_CS_fsm_pp0_stage0)) | ((ap_enable_reg_pp0_iter0 == 1'b1) & (tmp_fu_120_p3 == 1'd0) & (1'b0 == ap_block_pp0_stage0_11001) & (icmp_ln882_fu_99_p2 == 1'd0) & (enable_read_read_fu_64_p2 == 1'd1) & (1'b1 == ap_CS_fsm_pp0_stage0)))) begin
rst_out_1_vld_in = 1'b1;
end else begin
rst_out_1_vld_in = 1'b0;
end
end
always @ (*) begin
case (ap_CS_fsm)
ap_ST_fsm_state1 : begin
ap_NS_fsm = ap_ST_fsm_state2;
end
ap_ST_fsm_state2 : begin
ap_NS_fsm = ap_ST_fsm_pp0_stage0;
end
ap_ST_fsm_pp0_stage0 : begin
if (~((ap_enable_reg_pp0_iter0 == 1'b1) & (1'b0 == ap_block_pp0_stage0_subdone) & (icmp_ln882_fu_99_p2 == 1'd1))) begin
ap_NS_fsm = ap_ST_fsm_pp0_stage0;
end else if (((ap_enable_reg_pp0_iter0 == 1'b1) & (1'b0 == ap_block_pp0_stage0_subdone) & (icmp_ln882_fu_99_p2 == 1'd1))) begin
ap_NS_fsm = ap_ST_fsm_state5;
end else begin
ap_NS_fsm = ap_ST_fsm_pp0_stage0;
end
end
ap_ST_fsm_state5 : begin
if (((1'b1 == ap_CS_fsm_state5) & (rst_out_1_ack_in == 1'b1))) begin
ap_NS_fsm = ap_ST_fsm_state1;
end else begin
ap_NS_fsm = ap_ST_fsm_state5;
end
end
default : begin
ap_NS_fsm = 'bx;
end
endcase
end
assign add_ln695_fu_135_p2 = (ap_phi_mux_empty_11_phi_fu_91_p6 + 20'd1);
assign add_ln696_1_fu_128_p2 = ($signed(select_ln23_fu_112_p3) + $signed(20'd1048575));
assign add_ln696_fu_105_p2 = ($signed(empty_reg_77) + $signed(20'd1048575));
assign ap_CS_fsm_pp0_stage0 = ap_CS_fsm[32'd2];
assign ap_CS_fsm_state1 = ap_CS_fsm[32'd0];
assign ap_CS_fsm_state2 = ap_CS_fsm[32'd1];
assign ap_CS_fsm_state5 = ap_CS_fsm[32'd3];
assign ap_block_pp0_stage0 = ~(1'b1 == 1'b1);
assign ap_block_pp0_stage0_01001 = ~(1'b1 == 1'b1);
assign ap_block_pp0_stage0_11001 = ~(1'b1 == 1'b1);
assign ap_block_pp0_stage0_subdone = ~(1'b1 == 1'b1);
assign ap_block_state3_pp0_stage0_iter0 = ~(1'b1 == 1'b1);
assign ap_block_state4_pp0_stage0_iter1 = ~(1'b1 == 1'b1);
assign ap_enable_pp0 = (ap_idle_pp0 ^ 1'b1);
assign ap_phi_reg_pp0_iter0_empty_11_reg_88 = 'bx;
assign ap_return = 32'd0;
assign enable_read_read_fu_64_p2 = enable;
assign icmp_ln882_fu_99_p2 = ((empty_reg_77 == 20'd1048575) ? 1'b1 : 1'b0);
assign rst_out = rst_out_1_data_reg;
assign select_ln23_fu_112_p3 = ((rst_in[0:0] === 1'b1) ? 20'd0 : empty_reg_77);
assign tmp_fu_120_p3 = select_ln23_fu_112_p3[32'd19];
endmodule //WDTimer
`default_nettype none
`timescale 100ps / 1ps
// WDTimer_tb.v
// 2020/12/24 by marsee
//
module WDTimer_tb;
parameter DELAY = 10;
wire ap_clk;
wire ap_rst;
reg rst_in;
wire rst_out;
wire ap_rst_0;
wire ap_rst_1;
reg enable;
assign ap_rst = ap_rst_0 | ap_rst_1;
WDTimer WDTimer_i(
.ap_clk(ap_clk),
.ap_rst(ap_rst),
.rst_in(rst_in),
.rst_out(rst_out),
.enable(enable),
.ap_return()
);
// clk_gen のインスタンス(ap_clk)
clk_gen #(
.CLK_PERIOD(100), // 10 nsec, 100 MHz
.CLK_DUTY_CYCLE(0.5),
.CLK_OFFSET(0),
.START_STATE(1'b0)
) ACLKi (
.clk_out(ap_clk)
);
// reset_gen のインスタンス
reset_gen #(
.RESET_STATE(1'b1),
.RESET_TIME(1000) // 100nsec
) RESETi (
.reset_out(ap_rst_0),
.init_done()
);
assign ap_rst_1 = rst_out;
initial begin
rst_in = 1'b0;
enable = 1'b0;
#1000 // wait reset
#10000000 // 1 ms wait
enable = 1'b1;
#30000000 // 3 ms wait
@(posedge ap_clk); // 次のクロックへ
#DELAY;
rst_in = 1'b1;
@(posedge ap_clk); // 次のクロックへ
#DELAY;
rst_in = 1'b0;
#70000000 // 7 ms wait
$stop;
end
endmodule
module clk_gen #(
parameter CLK_PERIOD = 100,
parameter real CLK_DUTY_CYCLE = 0.5,
parameter CLK_OFFSET = 0,
parameter START_STATE = 1'b0 )
(
output reg clk_out
);
begin
initial begin
#CLK_OFFSET;
forever
begin
clk_out = START_STATE;
#(CLK_PERIOD-(CLK_PERIOD*CLK_DUTY_CYCLE)) clk_out = ~START_STATE;
#(CLK_PERIOD*CLK_DUTY_CYCLE);
end
end
end
endmodule
module reset_gen #(
parameter RESET_STATE = 1'b1,
parameter RESET_TIME = 100 )
(
output reg reset_out,
output reg init_done
);
begin
initial begin
reset_out = RESET_STATE;
init_done = 1'b0;
#RESET_TIME;
reset_out = ~RESET_STATE;
init_done = 1'b1;
end
end
endmodule
`default_nettype wire
日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|
- | - | - | - | - | 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | - | - | - | - | - | - |