Skip to content

Commit 70d480e

Browse files
committed
Emulator of signal from diff discriminator
1 parent 58f5175 commit 70d480e

File tree

1 file changed

+132
-0
lines changed

1 file changed

+132
-0
lines changed
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
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

Comments
 (0)