|
| 1 | +`timescale 1ns / 1ps |
| 2 | +////////////////////////////////////////////////////////////////////////////////// |
| 3 | +// Company: |
| 4 | +// Engineer: |
| 5 | +// |
| 6 | +// Create Date: 21:01:28 08/30/2017 |
| 7 | +// Design Name: messbauer_test_environment |
| 8 | +// Module Name: messbauer_diff_discriminator_signals |
| 9 | +// Project Name: |
| 10 | +// Target Devices: Spartan 6 |
| 11 | +// Tool versions: ISE 14.7 |
| 12 | +// Description: ALINX AX309 MESSBAUER DIFF DISCRIMINATOR SIGNALS |
| 13 | +// |
| 14 | +// Dependencies: |
| 15 | +// |
| 16 | +// Revision: |
| 17 | +// Revision 1.0 |
| 18 | +// Additional Comments: |
| 19 | +// |
| 20 | +////////////////////////////////////////////////////////////////////////////////// |
| 21 | + module messbauer_diff_discriminator_signals # |
| 22 | + ( |
| 23 | + parameter GCLK_PERIOD = 20, // nanoseconds |
| 24 | + parameter LOWER_THRESHOLD_DURATION = 3, // GCLK_PERIOD |
| 25 | + parameter UPPER_THRESHOLD_DURATION = 1, // GCLK_PERIOD |
| 26 | + parameter DISCRIMINATOR_IMPULSES_PAUSE = 10, // GCLK_PERIOD |
| 27 | + parameter IMPULSES_PER_CHANNEL = 16, |
| 28 | + parameter IMPULSES_FOR_SELECTION = 4 // number of impulses passes through diff disriminator MUST be smaller than IMPULSES_PER_CHANNEL |
| 29 | + ) |
| 30 | + ( |
| 31 | + input wire aclk, |
| 32 | + input wire areset_n, |
| 33 | + input wire channel, |
| 34 | + output reg lower_threshold, |
| 35 | + output reg upper_threshold |
| 36 | + ); |
| 37 | + |
| 38 | + localparam INITIAL_STATE = 0; |
| 39 | + localparam LOWER_THRESHOLD_HIGH_PHASE = 1; |
| 40 | + localparam UPPER_THRESHOLD_HIGH_PHASE = 2; |
| 41 | + localparam UPPER_THRESHOLD_LOW_PHASE = 3; |
| 42 | + localparam LOWER_THRESHOLD_LOW_PHASE = 4; |
| 43 | + localparam FINAL_STATE = 5; |
| 44 | + |
| 45 | + reg enable; |
| 46 | + reg[7:0] clk_counter; |
| 47 | + reg[7:0] impulse_counter; |
| 48 | + reg[7:0] total_impulse_counter; |
| 49 | + reg[2:0] state; |
| 50 | + reg impulse_selected; |
| 51 | + |
| 52 | + always @(posedge aclk) |
| 53 | + begin |
| 54 | + if(~areset_n) |
| 55 | + begin |
| 56 | + clk_counter <= 0; |
| 57 | + impulse_counter <= 0; |
| 58 | + total_impulse_counter <= 0; |
| 59 | + impulse_selected <= 0; |
| 60 | + state <= INITIAL_STATE; |
| 61 | + end |
| 62 | + else |
| 63 | + begin |
| 64 | + if(enable) |
| 65 | + begin |
| 66 | + clk_counter <= clk_counter + 1; |
| 67 | + case (state) |
| 68 | + INITIAL_STATE: |
| 69 | + begin |
| 70 | + clk_counter <= 0; |
| 71 | + state <= LOWER_THRESHOLD_HIGH_PHASE; |
| 72 | + end |
| 73 | + LOWER_THRESHOLD_HIGH_PHASE: |
| 74 | + begin |
| 75 | + lower_threshold <= 1; |
| 76 | + clk_counter <= 0; |
| 77 | + if((impulse_selected == 0 || impulse_counter == 0) && impulse_counter <= IMPULSES_FOR_SELECTION) |
| 78 | + begin |
| 79 | + state <= LOWER_THRESHOLD_LOW_PHASE; |
| 80 | + impulse_selected <= 1; |
| 81 | + impulse_counter <= impulse_counter + 1; |
| 82 | + end |
| 83 | + else state <= UPPER_THRESHOLD_LOW_PHASE; |
| 84 | + end |
| 85 | + UPPER_THRESHOLD_HIGH_PHASE: |
| 86 | + begin |
| 87 | + impulse_selected <= 0; |
| 88 | + upper_threshold <= 1; |
| 89 | + if(clk_counter == UPPER_THRESHOLD_DURATION) |
| 90 | + state <= UPPER_THRESHOLD_LOW_PHASE; |
| 91 | + end |
| 92 | + UPPER_THRESHOLD_LOW_PHASE: |
| 93 | + begin |
| 94 | + state <= LOWER_THRESHOLD_LOW_PHASE; |
| 95 | + upper_threshold <= 0; |
| 96 | + end |
| 97 | + LOWER_THRESHOLD_LOW_PHASE: |
| 98 | + begin |
| 99 | + lower_threshold <= 0; |
| 100 | + if(clk_counter == LOWER_THRESHOLD_DURATION) |
| 101 | + begin |
| 102 | + total_impulse_counter <= total_impulse_counter + 1; |
| 103 | + if(total_impulse_counter == IMPULSES_PER_CHANNEL) |
| 104 | + state <= FINAL_STATE; |
| 105 | + else state <= INITIAL_STATE; |
| 106 | + end |
| 107 | + end |
| 108 | + FINAL_STATE: |
| 109 | + begin |
| 110 | + end |
| 111 | + default: |
| 112 | + begin |
| 113 | + end |
| 114 | + endcase |
| 115 | + end |
| 116 | + else |
| 117 | + begin |
| 118 | + impulse_selected <= 0; |
| 119 | + total_impulse_counter <= 0; |
| 120 | + impulse_selected <= 0; |
| 121 | + end |
| 122 | + end |
| 123 | + end |
| 124 | + |
| 125 | + always @(posedge channel) |
| 126 | + begin |
| 127 | + if(~areset_n) |
| 128 | + enable = 0; |
| 129 | + enable = ~enable; |
| 130 | + end |
| 131 | + |
| 132 | + endmodule |
0 commit comments