`include "versatile_counter_defines.v"
|
`include "versatile_counter_defines.v"
|
`define LFSR_LENGTH `CNT_LENGTH
|
`define LFSR_LENGTH `CNT_LENGTH
|
`include "lfsr_polynom.v"
|
`include "lfsr_polynom.v"
|
`let CNT_INDEX=CNT_LENGTH-1
|
`let CNT_INDEX=CNT_LENGTH-1
|
module `CNT_MODULE_NAME
|
module `CNT_MODULE_NAME
|
(
|
(
|
`ifdef CNT_TYPE_GRAY
|
`ifdef CNT_TYPE_GRAY
|
output reg [`CNT_LENGTH:1] q,
|
output reg [`CNT_LENGTH:1] q,
|
`ifdef CNT_Q_BIN
|
`ifdef CNT_Q_BIN
|
output [`CNT_LENGTH:1] q_bin,
|
output [`CNT_LENGTH:1] q_bin,
|
`endif
|
`endif
|
`else
|
`else
|
`ifdef CNT_Q
|
`ifdef CNT_Q
|
output [`CNT_LENGTH:1] q,
|
output [`CNT_LENGTH:1] q,
|
`endif
|
`endif
|
`endif
|
`endif
|
`ifdef CNT_CLEAR
|
`ifdef CNT_CLEAR
|
input clear,
|
input clear,
|
`endif
|
`endif
|
`ifdef CNT_SET
|
`ifdef CNT_SET
|
input set,
|
input set,
|
`endif
|
`endif
|
`ifdef CNT_REW
|
`ifdef CNT_REW
|
input rew,
|
input rew,
|
`endif
|
`endif
|
`ifdef CNT_CE
|
`ifdef CNT_CE
|
input cke,
|
input cke,
|
`endif
|
`endif
|
`ifdef CNT_QNEXT
|
`ifdef CNT_QNEXT
|
output [`CNT_LENGTH:1] q_next,
|
output [`CNT_LENGTH:1] q_next,
|
`endif
|
`endif
|
`ifdef CNT_Z
|
`ifdef CNT_Z
|
output z,
|
output z,
|
`endif
|
`endif
|
`ifdef CNT_ZQ
|
`ifdef CNT_ZQ
|
output reg zq,
|
output reg zq,
|
`endif
|
`endif
|
input clk,
|
input clk,
|
input rst
|
input rst
|
);
|
);
|
|
|
`ifdef CNT_SET
|
`ifdef CNT_SET
|
parameter set_value = `CNT_SET_VALUE;
|
parameter set_value = `CNT_SET_VALUE;
|
`endif
|
`endif
|
`ifdef CNT_WRAP
|
`ifdef CNT_WRAP
|
parameter wrap_value = `CNT_WRAP_VALUE;
|
parameter wrap_value = `CNT_WRAP_VALUE;
|
`endif
|
`endif
|
|
|
// internal q reg
|
// internal q reg
|
reg [`CNT_LENGTH:1] qi;
|
reg [`CNT_LENGTH:1] qi;
|
|
|
`ifndef CNT_QNEXT
|
`ifndef CNT_QNEXT
|
wire [`CNT_LENGTH:1] q_next;
|
wire [`CNT_LENGTH:1] q_next;
|
`endif
|
`endif
|
`ifdef CNT_REW
|
`ifdef CNT_REW
|
wire [`CNT_LENGTH:1] q_next_fw;
|
wire [`CNT_LENGTH:1] q_next_fw;
|
wire [`CNT_LENGTH:1] q_next_rew;
|
wire [`CNT_LENGTH:1] q_next_rew;
|
`endif
|
`endif
|
|
|
`ifndef CNT_REW
|
`ifndef CNT_REW
|
assign q_next =
|
assign q_next =
|
`else
|
`else
|
assign q_next_fw =
|
assign q_next_fw =
|
`endif
|
`endif
|
`ifdef CNT_CLEAR
|
`ifdef CNT_CLEAR
|
clear ? `CNT_LENGTH'd0 :
|
clear ? `CNT_LENGTH'd0 :
|
`endif
|
`endif
|
`ifdef CNT_SET
|
`ifdef CNT_SET
|
set ? set_value :
|
set ? set_value :
|
`endif
|
`endif
|
`ifdef CNT_WRAP
|
`ifdef CNT_WRAP
|
(qi == wrap_value) ? `CNT_LENGTH'd0 :
|
(qi == wrap_value) ? `CNT_LENGTH'd0 :
|
`endif
|
`endif
|
`ifdef CNT_TYPE_LFSR
|
`ifdef CNT_TYPE_LFSR
|
{qi[`CNT_INDEX:1],~(`LFSR_FB)};
|
{qi[`CNT_INDEX:1],~(`LFSR_FB)};
|
`else
|
`else
|
qi + `CNT_LENGTH'd1;
|
qi + `CNT_LENGTH'd1;
|
`endif
|
`endif
|
|
|
`ifdef CNT_REW
|
`ifdef CNT_REW
|
assign q_next_rew =
|
assign q_next_rew =
|
`ifdef CNT_CLEAR
|
`ifdef CNT_CLEAR
|
clear ? `CNT_LENGTH'd0 :
|
clear ? `CNT_LENGTH'd0 :
|
`endif
|
`endif
|
`ifdef CNT_SET
|
`ifdef CNT_SET
|
set ? set_value :
|
set ? set_value :
|
`endif
|
`endif
|
`ifdef CNT_WRAP
|
`ifdef CNT_WRAP
|
(qi == `CNT_LENGTH'd0) ? wrap_value :
|
(qi == `CNT_LENGTH'd0) ? wrap_value :
|
`endif
|
`endif
|
`ifdef CNT_TYPE_LFSR
|
`ifdef CNT_TYPE_LFSR
|
{~(`LFSR_FB_REW),qi[`CNT_LENGTH:2]};
|
{~(`LFSR_FB_REW),qi[`CNT_LENGTH:2]};
|
`else
|
`else
|
qi - `CNT_LENGTH'd1;
|
qi - `CNT_LENGTH'd1;
|
`endif
|
`endif
|
`endif
|
`endif
|
|
|
`ifdef CNT_REW
|
`ifdef CNT_REW
|
assign q_next = rew ? q_next_rew : q_next_fw;
|
assign q_next = rew ? q_next_rew : q_next_fw;
|
`endif
|
`endif
|
|
|
always @ (posedge clk or posedge rst)
|
always @ (posedge clk or posedge rst)
|
if (rst)
|
if (rst)
|
qi <= `CNT_LENGTH'd0;
|
qi <= `CNT_LENGTH'd0;
|
else
|
else
|
`ifdef CNT_CE
|
`ifdef CNT_CE
|
if (cke)
|
if (cke)
|
`endif
|
`endif
|
qi <= q_next;
|
qi <= q_next;
|
|
|
`ifdef CNT_Q
|
`ifdef CNT_Q
|
`ifdef CNT_TYPE_GRAY
|
`ifdef CNT_TYPE_GRAY
|
always @ (posedge clk or posedge rst)
|
always @ (posedge clk or posedge rst)
|
if (rst)
|
if (rst)
|
q <= `CNT_RESET_VALUE;
|
q <= `CNT_RESET_VALUE;
|
else
|
else
|
`ifdef CNT_CE
|
`ifdef CNT_CE
|
if (cke)
|
if (cke)
|
`endif
|
`endif
|
q <= (q_next>>1) ^ q_next;
|
q <= (q_next>>1) ^ q_next;
|
`ifdef CNT_Q_BIN
|
`ifdef CNT_Q_BIN
|
assign q_bin = qi;
|
assign q_bin = qi;
|
`endif
|
`endif
|
`else
|
`else
|
assign q = q_next;
|
assign q = q_next;
|
`endif
|
`endif
|
`endif
|
`endif
|
|
|
`ifdef CNT_Z
|
`ifdef CNT_Z
|
assign z = (q == `CNT_LENGTH'd0);
|
assign z = (q == `CNT_LENGTH'd0);
|
`endif
|
`endif
|
|
|
`ifdef CNT_ZQ
|
`ifdef CNT_ZQ
|
always @ (posedge clk or posedge rst)
|
always @ (posedge clk or posedge rst)
|
if (rst)
|
if (rst)
|
zq <= 1'b1;
|
zq <= 1'b1;
|
else
|
else
|
`ifdef CNT_CE
|
`ifdef CNT_CE
|
if (cke)
|
if (cke)
|
`endif
|
`endif
|
zq <= q_next == `CNT_LENGTH'd0;
|
zq <= q_next == `CNT_LENGTH'd0;
|
`endif
|
`endif
|
endmodule
|
endmodule
|
|
|