| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314 |
- //`timescale 1ns / 1ps
- //////////////////////////////////////////////////////////////////////////////////
- // Company:
- // Engineer:
- //
- // Create Date: 10:02:35 04/20/2020
- // Design Name:
- // Module Name: PulseGen
- // Project Name:
- // Target Devices:
- // Tool versions:
- // Description:
- //
- // Dependencies:
- //
- // Revision:
- // Revision 0.01 - File Created
- // Additional Comments:
- //
- //////////////////////////////////////////////////////////////////////////////////
- module PulseGenV2
- #(
- parameter CmdRegWidth = 32
- )
- (
- input Rst_i,
- input Clk_i,
- input EnPulse_i,
-
- input PulsePol_i,
- input EnEdge_i,
- input [CmdRegWidth-29:0] Mode_i,
- input [CmdRegWidth-1:0] P1Del_i,
- input [CmdRegWidth-1:0] P2Del_i,
- input [CmdRegWidth-1:0] P3Del_i,
- input [CmdRegWidth-1:0] P1Width_i,
- input [CmdRegWidth-1:0] P2Width_i,
- input [CmdRegWidth-1:0] P3Width_i,
-
- output Pulse_o
- );
- //================================================================================
- // LOCALPARAM
- localparam IDLE = 2'h0;
- localparam DELAY = 2'h1;
- localparam PULSE = 2'h2;
-
- localparam DISABLED = 8'd0;
- localparam SINGLE = 8'd1;
- localparam DOUBLE = 8'd2;
- localparam TRIPPLE = 8'd3;
- localparam BURST = 8'd4;
- localparam CONTINIOUS = 8'd5;
-
- //================================================================================
- reg pulse;
- wire [31:0] delArray [2:0];
- wire [31:0] widthArray [2:0];
-
- reg [31:0] pulseCnt;
- reg [31:0] delayCnt;
- reg [31:0] widthCnt;
-
- reg [31:0] currWidthValue;
- reg [31:0] currDelValue;
- reg [1:0] currState;
- reg [1:0] nextState;
-
- reg pulseDone;
- wire delayDone = (currState == DELAY)? delayCnt==currDelValue-1:1'b0;
-
- wire zeroDelay = (P1Del_i==0);
-
- reg patternDone;
- reg enPulseR;
-
- wire enPulsePos = (!enPulseR&EnPulse_i);
- wire enPulseNeg = (enPulseR&!EnPulse_i);
-
- wire enPulse = (EnEdge_i)? enPulseNeg:enPulsePos;
- wire enPulseEn = (Mode_i != 0)? enPulse:1'b0;
- //================================================================================
- // ASSIGNMENTS
- assign delArray [0] = P1Del_i;
- assign delArray [1] = P2Del_i;
- assign delArray [2] = P3Del_i;
-
- assign widthArray [0] = P1Width_i;
- assign widthArray [1] = P2Width_i;
- assign widthArray [2] = P3Width_i;
-
- assign Pulse_o = (PulsePol_i)? ~pulse:pulse;
- //================================================================================
- // CODING
- always @(posedge Clk_i) begin
- if (!Rst_i) begin
- enPulseR <= EnPulse_i;
- end else begin
- enPulseR <= 1'b0;
- end
- end
- always @(posedge Clk_i) begin
- if (!Rst_i) begin
- if (Mode_i >=1 & Mode_i<=3) begin
- if (currState != IDLE) begin
- delayCnt <= delayCnt+1;
- end else begin
- delayCnt <= 0;
- end
- end else begin
- if (currState == DELAY) begin
- delayCnt <= delayCnt+1;
- end else begin
- delayCnt <= 0;
- end
- end
- end else begin
- delayCnt <= 0;
- end
- end
- always @(posedge Clk_i) begin
- if (!Rst_i) begin
- if (currState == PULSE) begin
- widthCnt <= widthCnt+1;
- end else begin
- widthCnt <= 0;
- end
- end else begin
- widthCnt <= 0;
- end
- end
- always @(*) begin
- if (!Rst_i) begin
- if (currState == PULSE) begin
- if (widthCnt==currWidthValue-1) begin
- pulseDone = 1'b1;
- end else begin
- pulseDone = 1'b0;
- end
- end else begin
- pulseDone = 1'b0;
- end
- end else begin
- pulseDone = 1'b0;
- end
- end
- always @(posedge Clk_i) begin
- if (!Rst_i) begin
- if (pulseDone) begin
- if (!patternDone) begin
- pulseCnt <= pulseCnt+1;
- end else begin
- pulseCnt <= 0;
- end
- end
- end else begin
- pulseCnt <= 0;
- end
- end
- always @(posedge Clk_i) begin
- if (!Rst_i) begin
- if (Mode_i == 0) begin
- currDelValue <= 0;
- currWidthValue <= 0;
- end else begin
- if (Mode_i >=1 & Mode_i<=3) begin
- currDelValue <= delArray[pulseCnt];
- currWidthValue <= widthArray[pulseCnt];
- end else begin
- if (Mode_i == 4|Mode_i == 5) begin
- if (currState == IDLE) begin
- currDelValue <= delArray[0];
- currWidthValue <= widthArray[0];
- end else if (currState == PULSE & pulseDone) begin
- currDelValue <= delArray[1];
- currWidthValue <= widthArray[0];
- end
- end
- end
- end
- end else begin
- currDelValue <= 0;
- currWidthValue <= 0;
- end
- end
- always @(*) begin
- if (!Rst_i) begin
- if (currState != IDLE) begin
- case(Mode_i)
- 8'd0: begin
- patternDone = 0;
- end
- 8'd1: begin
- patternDone = ((pulseCnt==Mode_i-1)&pulseDone);
- end
- 8'd2: begin
- patternDone = ((pulseCnt==Mode_i-1)&pulseDone);
- end
- 8'd3: begin
- patternDone = ((pulseCnt==Mode_i-1)&pulseDone);
- end
- 8'd4: begin
- patternDone = ((pulseCnt==P2Width_i-1)&pulseDone);
- end
- 8'd5: begin
- patternDone = 0;
- end
- default :begin
- patternDone = 0;
- end
- endcase
- end else begin
- patternDone = 0;
- end
- end else begin
- patternDone = 0;
- end
- end
-
- always @(posedge Clk_i) begin
- if (!Rst_i) begin
- currState <= nextState;
- end else begin
- currState <= IDLE;
- end
- end
- always @(*) begin
- nextState = IDLE;
- case(currState)
- IDLE : begin
- if (enPulseEn) begin
- if (zeroDelay) begin
- nextState = PULSE;
- end else begin
- nextState = DELAY;
- end
- end else begin
- nextState = IDLE;
- end
- end
-
- DELAY : begin
- if (delayDone) begin
- nextState = PULSE;
- end else begin
- nextState = DELAY;
- end
- end
- PULSE : begin
- if (pulseDone) begin
- if (!patternDone) begin
- nextState = DELAY;
- end else begin
- nextState = IDLE;
- end
- end else begin
- nextState = PULSE;
- end
- end
- endcase
- end
- always @(*) begin
- if (!Rst_i) begin
- if (Mode_i != 0) begin
- case(currState)
- IDLE: begin
- pulse = 1'b0;
- end
- DELAY: begin
- pulse = 1'b0;
- end
- PULSE: begin
- pulse = 1'b1;
- end
- default:begin
- pulse = 1'b0;
- end
- endcase
- end else begin
- pulse = 1'b0;
- end
- end else begin
- pulse = 1'b0;
- end
- end
- endmodule
|