Để ñáp ứng việc ñiều khiển thiết bị ngoại vi ghép PC bằng các thủ tục lập trình
trên các loại vi mạch ña năng, Altera cung cấp bộ công cụ phần cứng có phần mềm
tương thích ñi kèm theo phương pháp tải thông tin và thiết kế mạch ứng dụng với
cấu hình hệ thống gồm:
• Bộ lập trình chuyên nghiệp (Max+PlusII ),
• Bản mạch hỗ trợ giao tiếp các lập trình logic,
• Khối tải dữ liệu Master (khối chủ),
• Các dụng cụ phần cứng tương thích, bổ trợ cho hệ lập trình.
Phương pháp ứng dụng ñòi hỏi cấu hình hệ thống nêu trên ñược hãng Altera
ñặt tên là phương pháp chuyên nghiệp. Phương pháp này ñược ứng dụng ñể tiến
hành thiết kế-chếtạo một sốkhối ñiện tửbằng kỹthuật liên kết các cổng logic trong
FPGA dòng EPM7160E thuộc họMAX7000.
171 trang |
Chia sẻ: aquilety | Lượt xem: 2406 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Luận án Nghiên cứu, xây dựng hệ thiết bị thu nhận và xử lý số liệu dựa trên kỹ thuật DSP qua ứng dụng FPGA phục vụ nghiên cứu vật lý hạt nhân thực nghiệm, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
13-520.
41. F.S. Goulding, Analysis of noise in energy-dispersive spectrometers using time-
domain methods, Nucl. Instr. and Meth. A 485 (2002) 653-660.
42. G.F. Knoll (2000), Radiation Detection and Measurement, JohnWiley & Sons,
Inc.
43. Genie 2000 Customization Tools Manual, Canberra Industries, Inc. (2002).
44. logic development system.
45. devices/AD7899
115
46.
47.
processing.Rev_2.1.pdf.
48. 3He Proportional Counters
49. BF3 Proportional Counters
50. Http:// www.Ortec-online.com/CAMAC ADCs and Memories.
51. T.W.
Crane et al. Neutron Detectors
52. USB FIFO
53. Pham Dinh Khang, Nguyen Nhi Dien, Dang Lanh, Nguyen Xuan Hai, Pham
Ngoc Tuan, Nguyen Duc Hoa, Nguyen An Son, A design configuration of an
FPGA-based coincident spectrometry system, Journal of Analytical Sciences,
Methods and Instrumentation, Vol. 3 (2013), pp. 158-162
54.
55. Gamma Finder (DGF), Model Polaris, Version
3.0E, June 2004.
56. I.H. Lazarus, et al. (2003), The GRT4 VME pulse processing card for segmented
germanium detectors, The UK Engineering and Physical Science Council.
57. I. Tomandl, et al. (1999), A Study of photon strength functions by means of the
two-step cascade measurement, Praha.
58. IAEA-TECDOC-602 (1991), Quality control of nuclear medicine instruments,
Vienna.
59. IAEA-TECDOC-619 (1991), X-ray and gamma ray standards for detector
calibration, Vienna.
60. J. Honzatko, et al., Facility and method for studying two-step γ cascades in
thermal neutron capture, Nucl. Instr. and Meth., NIM A 376 (1996) 434-442.
61. J. Jakubek, et al., Coincidence gamma-gamma spectroscopy system for
instrumental neutron activation analysis, Nucl. Instr. and Meth., NIM A 414 (1998)
261-264.
116
62. J. Stein, et al., X-ray detectors with digitized preamplifiers, Nucl. Instr. Meth. in
Physics Research B 113 (1996) 141-145.
63. J.M. Los Arcos, et al., A new digital pulse height analysis method for radiation
spectroscopy, Nucl. Instr. and Meth. in Physics Reasearch A 339 (1994) 99-101.
64.
65. L.H. Lazarus, D.E. Appelbe, et al. (2003), The GRT4 VME Pulse Processing
Card for Segmented Germanium Detectors, the UK Engineering and Physical
Science Council (EPSRC), England.
66. Luigi Bardelli (2005), PhD thesis, Development of sampling and digital signal
processing techniques with applications to Nuclear Physics detectors, University of
Degli.
67. M. Descovich (2002), PhD thesis, Improving the position resolution of Highly
Segmented HPGe Detectors using Pulse Shape Analysis Methods, University of
Liverpool.
68. M. Kavatsyuk, E. Guliyev, et al. (2010), VHDL implementation of feature-
extraction algorithm for the PANDA electromagnetic calorimeter, University of
Groningen, The Netherlands.
69. M.J. Koskelo, et al., Comparison of analog and digital signal processing
systems using pulse, Nucl. Instr. and Meth., NIM A 422 (1999) 373-378.
70. Marc Richer, Cayetano Santos (2007), TNT2 Digital Pulse Processor,
Funtionalities and TUC control software.
71. Massimo Nespolo (2004), PhD thesis, Pulse shape analysis with germanium
detectors: from MARS to AGATA, University of Degli.
72. Miodrag Bolic, et al., Digital gamma-ray spectroscopy based on FPGA
technology, NIM A 482 (2002) 761-766.
73. Nguyen Nhi Dien, Vuong Huu Tan, Pham Dinh Khang (1996), The gamma-
gamma Coincedence Spectrometer for Research on Nuclear Structure at DNRI,
Proc. of International Symposium on Instrumentation of Small and Medium
Accelerators, Tsukuba, Japan.
117
74. Nguyen Xuan Hai, et al. (2005), Level Density and Radiative Strength Function
in Light Nuclei 60Co as an Example of Method for Determination and Their
Reliability Verification, 13th International Seminar on Interaction of neutron with
Nuclei, Dubna.
75.
multichannel-analyzers/mpa-3rtc.html.
76. Pham Dinh Khang, V.H. Tan, N.X. Hai, N.N. Dien, Gamma-gamma
coincidence spectrometer setup for neutron activation analysis and nuclear
structure studies, Nucl. Instr. and Meth. A 631(2011) 47-51.
77. Pham Ngoc Tuan, Nguyen Nhi Dien, Dang Lanh, Tuong Thi Thu Huong,
Nguyen Van Hung, Nguyen Duc Hoa, Nguyen An Son, DSP-based Spectrometer
for γ-ray measurement and detection, Journal of Nuclear Science and Technology,
No. 2 (2011), pp. 37-43.
78. R. Redus (2009), Digital pulse processors: theory of operation, AN-DPP-001.
79. R. E. Chrien and R. J. Sutter, Noise and pileup suppression by digital signal
processing, Nucl. Instr. and Meth. in Physics Research A249 (1986) 421-425.
80. Steven W. Smith, The Scientist and Engineer’s Guide to Digital Signal
Processing, California Technical Publishing,
81. T. H. Prettyman, Method for mapping charge pulses in semiconductor radiation
detectors, Nucl. Instr. and Meth. in Physics Research A 422 (1999) 232-237.
82. T. Lakatos, et al., Signal processing method for nuclear spectrometers, United
States Patent 5005146, Apr. 2 1991.
83. T. Lakatos (1991), Noise and resolution with digital filtering for nuclear
spectrometry, Institute of Nuclear research of the Hungarian Academy of Sciences,
Hungary.
84. Http:///www.ortec-online.com/download/DSPEC-jr-2.0.pdf.
85. V. Radeka, Trapezoidal Filtering of Signals from Large Germanium Detectors at
High Rates, IEEE Trans. Nuc. Sci. NS-19, No. 1, 412 (1972).
86. V.T. Jordanov and Glenn F. Knoll, Digital Pulse Processor using A moving
average technique, IEEE Trans. On Nucl. Sci., Vol. 40, No. 4 (1993) pp. 764-769.
118
87. V.T. Jordanov and Glenn F. Knoll, Digital synthesis of pulse shapes in real time
for high resolution radiation spectroscopy, Nucl. Instr. and Meth. in Physics
Research A 345 (1994) 337-345.
88. V.T. Jordanov, Deconvolution of pulses from a detector-amplifier configuration,
Nucl. Instr. and Meth. in Physics Research A 351(1994) 592-594.
89. V.T. Jordanov, G.F. Knoll, Digital techniques for real-time pulse shaping in
radiation measurements, Nucl. Instr. and Meth. in Physics Research A353 (1994),
261-264.
90. Vuong Huu Tan, et al. (2006), The Initial Results of Research On Two-Step
Cascades In The Dalat Research Reactor, ISINN-14, Dubna.
91. Vuong Huu Tan, Nguyen Phuoc Xuan, Dang Lanh, The method of total neutron
cross section measurements on the filtered beams at Dalat Nuclear Research
Reactor, pp. 104-109, Tuyển tập báo cáo đề tài cấp Nhà nước KC-09-08 A (1991-
1995).
92. W. Gast, et al., Digital signal processing and algorithms for γ-ray tracking, IEEE
Trans. Nuc. Sci. 48 (2001) 2380-2384.
93. W.K. Warburton, P.M. Grudberg, Current trends in developing digital signal
processing electronics for semiconductor detector, Nucl. Instr. and Meth. in Physics
Research A 568 (2006) 141-145.
94. W. Skulski, Digital Signal Processing Electronics for Nuclear Physics
Applications, GRETINA Electronics Workshop, Argonne, 24-25 July 2004.
95. Warburton, et al., Method and apparatus for analog signal conditioner for high
speed, digital x-ray spectrometer, United States Patent 5870051, Feb. 9, 1999.
96. Warburton, et al., Method and Apparatus for combinatorial logic signal
processor in a digitally based high speed x-ray spectrometer, United States Patent
5873054, Feb. 16, 1999.
97. Warburton et al., Method and apparatus for digitally based high speed x-ray
spectrometer, United States Patent 5,684,850, Nov. 4, 1997.
98. Warburton, et al., Method and apparatus for digitally based high speed x-ray
spectrometer for direct coupled use with continuous discharge preamplifiers, United
119
States Patent 5774522, June 30, 1998.
99. Warburton, et al., Method and apparatus for baseline correction in X-ray and
nuclear spectroscopy systems, US 6609075 B1, 2003.
100. XILINX Web Page,
101. X-ray Instrumentation Associates,
120
PHỤ LỤC A: HAI PHƯƠNG PHÁP LẬP TRÌNH CHO FPGA DÒNG
EPM7160E CỦA HÃNG ALTERA DÙNG MÔI TRƯỜNG Max+Plus II
A.1. Phương pháp tiết kiệm
Hãng Altera luôn cho phép người thiết kế sử dụng một chương trình phần mềm
giới hạn, miễn phí gắn liền với một số loại vi mạch quy định sẵn để phát triển mạch
ứng dụng qua tác vụ tải thông tin từ mạng; và phương pháp đáp ứng cách thiết kế đó
có tên gọi là phương pháp tiết kiệm, gồm hai kiểu: kiểu tải dữ liệu xuống mạch ứng
dụng cần phát triển nhờ cổng nối tiếp và kiểu tải dữ liệu xuống mạch ứng dụng cần
phát triển thông qua cổng song song như được biểu diễn trong hình A.1.
Hình A.1: Minh họa kết nối mạch tải dữ liệu song song.
A.1.1. Kiểu tải dữ liệu song song
Ưu điểm nổi bật của phương pháp tiết kiệm là chi phí thấp, cấu hình của công
cụ phần cứng phục vụ thiết kế mạch đơn giản hơn và hoàn toàn có thể tự lắp đặt,
hiệu chỉnh, phần mềm cho phép lập trình dễ sử dụng. Hạn chế của phương pháp (so
với phương pháp chuyên nghiệp) là dung lượng nội tại của chip thấp hơn, việc nạp
thông tin đã biên dịch vào chip chậm hơn, số cổng vào/ra đáp ứng điều khiển ít hơn,
kéo theo cấp độ thiết kế mạch không được tối ưu. Tuy vậy, nên có cách hình dung
khái quát về phương pháp đó qua vài nét tiêu biểu sau:
Yêu cầu kỹ thuật:
• Giao tiếp với PC và tải dữ liệu qua cổng máy in song song, chế độ xác lập là
EPP dưới Windows, hoặc truyền tải dữ liệu qua cổng USB.
• Dùng cáp liên kết giữa PC với thiết bị ngoại vi theo chuẩn đã chọn tương thích
cổng.
121
Chức năng: Với kiểu kết nối được chọn trước, dữ liệu sẽ được tải, mô phỏng,
biên dịch và nạp vào các loại chip thích hợp. Nội dung mạch thiết kế ứng dụng có
thể thay đổi được và dễ hoàn thiện. Quy trình tải dữ liệu vào vi mạch theo trình tự:
thiết kế dự án, biên dịch dự án, kết nối công cụ giao tiếp, chọn thực đơn điều khiển,
và cuối cùng là nạp nội dung đã biên dịch để được sản phẩm thực hiện.
A.1.2. Kiểu tải dữ liệu nối tiếp
Tương tự kiểu tải song song, điểm khác biệt là tốc độ truyền dữ liệu đến ngoại
vi chậm hơn khi dùng cổng RS-232, hoặc nhanh hơn nếu dùng cổng USB.
A.2. Phương pháp chuyên nghiệp
Để đáp ứng việc điều khiển thiết bị ngoại vi ghép PC bằng các thủ tục lập trình
trên các loại vi mạch đa năng, Altera cung cấp bộ công cụ phần cứng có phần mềm
tương thích đi kèm theo phương pháp tải thông tin và thiết kế mạch ứng dụng với
cấu hình hệ thống gồm:
• Bộ lập trình chuyên nghiệp (Max+PlusII ),
• Bản mạch hỗ trợ giao tiếp các lập trình logic,
• Khối tải dữ liệu Master (khối chủ),
• Các dụng cụ phần cứng tương thích, bổ trợ cho hệ lập trình.
Phương pháp ứng dụng đòi hỏi cấu hình hệ thống nêu trên được hãng Altera
đặt tên là phương pháp chuyên nghiệp. Phương pháp này được ứng dụng để tiến
hành thiết kế-chế tạo một số khối điện tử bằng kỹ thuật liên kết các cổng logic trong
FPGA dòng EPM7160E thuộc họ MAX7000.
122
PHỤ LỤC B: THUẬT TOÁN Genie-2000 ĐỂ ĐỊNH CHUẨN HIỆU
SUẤT VÀ DIỆN TÍCH ĐỈNH HẤP THỤ TRONG PHỔ GAMMA
B.1. Định chuẩn hiệu suất
B.1.1. Tính toán hiệu suất đỉnh
Hiệu suất phát hiện đỉnh ở năng lượng cho trước được định nghĩa là
1
( )
w f
SE
T yAK U
ε = (B.1)
ở đó ε(E) là hiệu suất ở năng lượng E, S là diện tích đỉnh, T1 là thời gian sống của
phép đo, y là tỷ số phân nhánh của hạt nhân định chuẩn tại năng lượng này, A là
hoạt độ nguồn ở thời điểm xác nhận, Uf là hệ số biến đổi hoạt độ A từ các đơn vị
hoạt độ khác sang đơn vị Bq, và Kw là hệ số hiệu chỉnh phân rã:
1 2
ln(2) wt
T
w
K e
−
=
(B.2)
với tw là thời gian phân rã của nguồn định chuẩn (tức thời gian trôi qua giữa lúc
khởi phát thu nhận và thời điểm báo cáo hoạt độ nguồn định chuẩn, và T1/2 là chu kỳ
bán rã của hạt nhân định chuẩn.
Hiệu suất đỉnh phải được tính cho tập các đỉnh đơn bằng cách dùng nguồn
chuẩn có cùng bố trí hình học và tốc độ đếm cho các mẫu thực tế. Ngoài ra, các
đỉnh phải phủ toàn dải năng lượng quan tâm.
B.1.2. Tính đường cong hiệu suất (theo) kinh nghiệm (the Empirical efficiency)
Trong chế độ phân tích phổ gamma, hiệu suất phát hiện đỉnh là hàm của năng
lượng:
( )
0
ln ln
i
n
a
i
i
c
c
E
ε
=
= ⋅
∑ (B.3)
ở đó ci là hệ số phải xác định bằng tính toán; ε là hiệu suất đỉnh hấp thụ toàn phần ở
năng lượng E, E là năng lượng đỉnh toàn phần, hệ số ca = (E2 + E1)/2, E2 là năng
lượng định chuẩn lớn nhất và E1 là năng lượng định chuẩn nhỏ nhất.
Sau khi hiệu suất phát hiện đỉnh được xác định cho mỗi đỉnh định chuẩn, phép
khớp bình phương tối thiểu gán trọng số được thực hiện cho đẳng thức đa cực biểu
diễn trong pt. (B.3). Bậc đa cực, n, phụ thuộc vào số điểm định chuẩn như sau: n = 5
123
đối với mười điểm định chuẩn hoặc nhiều hơn, n = 4 đối với tám hoặc chín điểm
định chuẩn, n = 3 đối với sáu hoặc bảy điểm định chuẩn, n = 2 đối với bốn hoặc năm
điểm định chuẩn.
Bậc của đường cong có thể được thay đổi lên tới n = 5. Bậc lớn nhất là N – 1
(lên tới 5), ở đó N là số điểm định chuẩn trong vùng năng lượng được sử dụng. Do
vậy, có ít nhất ba điểm định chuẩn được đòi hỏi. Các tham số định chuẩn cho đường
cong định chuẩn hiệu suất được xác định khi dùng phương pháp bình phương tối
thiểu tuyến tính từ phương trình:
M c V⋅ = (B.4)
ở đó
1 1
ln ln
j k
a a
jk i
i i i
c cM w
E E
− −
= ⋅ ⋅
∑ (B.5)
và
( )
1
ln ln
k
a
k i i
i i
cV w
E
ε
−
= ⋅ ⋅
∑ (B.6)
với wi là trọng số của điểm định chuẩn thứ i. Trọng số đó là nghịch đảo phương sai
của ln(ε), hình thành từ hai thành phần:
1. Độ bất định trong diện tích đỉnh dùng để xác định hiệu suất ε,
2. Độ bất định trong hoạt độ nguồn định chuẩn.
Phương sai trong hiệu suất, ký hiệu bằng 2εσ (ở đó εσ là độ lệch chuẩn của ε), thu
được từ phương trình:
2 2
2 2 S A
S Aε
σ σ
σ ε
= ⋅ +
(B.7)
với S là diện tích đỉnh của đỉnh định chuẩn cần tìm, σs là độ lệch chuẩn của diện tích
đỉnh; A là hoạt độ biết trước của hạt nhân định chuẩn và Aσ là độ lệch chuẩn của
hoạt độ nguồn bao gồm độ bất định của tỷ số rẽ nhánh.
Phương sai của ln(ε) được cho bởi:
2
2 2
ln( )
1
ε εσ σε
= ⋅
(B.8)
và vì vậy trọng số wi là
124
2
iw
ε
ε
σ
=
(B.9)
Phương trình ma trận được giải trực tiếp cho các hệ số c bằng cách đảo ma trận
M. Trong mô hình này, các số hạng hiệp phương sai không được thiết lập đối với
phép truyền sai số (error propagation). Thay vào đó, sai lệch giữa hiệu suất đo đạc
với hiệu suất tính toán (từ đường cong khớp) và độ bất định của điểm định chuẩn
(kết hợp của sai số hoạt độ nguồn và sai số diện tích đỉnh) được cộng cùng nhau
trong độ nhạy căn bậc hai trung bình để hình thành sai số nội suy. Các giá trị sai số
nội suy này được lưu vào các kết quả định chuẩn hiệu suất cho mỗi năng lượng định
chuẩn để sử dụng.
B.2. Tính diện tích đỉnh hấp thụ toàn phần và độ bất định
Trong chế độ phân tích phổ gamma, các diện tích đỉnh được xác định bằng
phương pháp tính diện tích đỉnh và hàm phông (còn gọi là nền liên tục). Các thuật
toán tính diện tích và hàm phông được dùng để định lượng một số đại lượng vật lý
liên quan đến phổ.
B.2.1. Tính diện tích đỉnh hấp thụ toàn phần
Diện tích đỉnh đối với đỉnh đơn được tính như sau:
S G B= − (B.10)
ở đó S là diện tích đỉnh; G là tổng số đếm trong vùng ROI của đỉnh; và B là phông.
Có hai trường hợp là phông tuyến tính và phông (dạng) bậc.
Phông tuyến tính, B, minh họa trong hình B.1, được tính theo phương trình:
( )1 2 ,2
NB B B
n
= +
(B.11)
ở đó N là số kênh trong vùng ROI của đỉnh, n là số kênh phông trên mỗi phía (hai
bên như nhau), B1 là tổng số đếm trong vùng phông ở phía trái đỉnh và B2 là tổng số
đếm trong vùng phông ở phía phải đỉnh.
Nền phông bậc, B, minh họa trong hình B.2, được tính toán từ phổ mẫu khi dùng
phương trình:
125
( )2 11
1 1
,
N i
j
i j
B BBB y
n nG= =
−
= +
∑ ∑ (B.12)
ở đó yi là số đếm/kênh trong kênh i, G là tổng số đếm trong vùng ROI của đỉnh, N
là số kênh trong vùng ROI của đỉnh, n là số kênh phông trên mỗi phía (hai phía như
nhau), B1 là tổng số đếm trong vùng phông ở phía trái đỉnh, B2 là tổng số đếm trong
vùng phông ở phía phải đỉnh.
Hình B.1: Các tham số dùng trong tính Hình B.2: Các tham số dùng trong tính
toán phông tuyến tính. phông bậc.
Pt. (B.12) cũng có thể được viết lại như sau:
( )2 1
1
1 1
,
N i
i
i j
B BNB B y
n nG = =
−
= + ∑∑ (B.13)
hoặc ngắn gọn hơn khi dùng ký hiệu các tổng riêng phần Pi:
( )2 1
1
1
,
N
i
i
B BNB B P
n nG =
−
= + ∑ (B.14)
ở đó
1
.
i
i i
j
P y
=
= ∑ (B.15)
B.2.2. Độ bất định diện tích đối với các đỉnh đơn
Độ lệch chuẩn của diện tích đỉnh được tính từ phương trình:
2 2
.S G Bσ σ σ= + (B.16)
Để thiết lập ,Bσ xét hàm F có đối số là các số đếm trong nhiều kênh:
( )1 2, ,..., ,nF f y y y= (B.17)
126
ở đó 1 2 3, , ,..., ny y y y là các số đếm trong n kênh.
Ước đoán phương sai của F được cho bởi:
1 2
22 2
2 2 2 2
1 2
.
nF y y y
n
f f fK
y y y
σ σ σ σ
∂ ∂ ∂
= ⋅ + ⋅ + + ⋅ ∂ ∂ ∂
(B.18)
Sử dụng quan hệ này, phương sai của phông tuyến tính trở nên:
1 2
2 2
2 2 2
,
2 2B B B
N N
n n
σ σ σ
= ⋅ + ⋅
(B.19)
ở đó
1
2
Bσ là phương sai của B1, và 2
2
Bσ là phương sai của B2.
Áp dụng các tính chất của các đại lượng có phân bố Poission và kết hợp các số
hạng, pt. (B.19) được viết lại:
( )
2
2
1 22B
N B B
n
σ
= +
(B.20)
Vì G cũng có phân bố Poisson, độ bất định đối với diện tích đỉnh (có phông
tuyến tính) viết được như sau:
( )
2
1 2 .2S
NG B B
n
σ
= + +
(B.21)
Cùng cách tiếp cận, phương sai của phông bậc trở thành:
1 2
22 2 2
2 2 2 2 2
11 2
,
i
N
B B B G P
i i
B B B B
B B G P
σ σ σ σ σ
=
∂ ∂ ∂ ∂
= + + + ∂ ∂ ∂ ∂
∑ (B.22)
Có thể rút gọn lại:
( ) ( ) ( ) ( ) ( )
2 2 222
1 2 2 12
1 1 1
.B i i i
i
NG P B P B B B P
G PnG
σ
= − + + − +
∑ ∑ ∑
∑
(B.23)
Từ đó, độ bất định đối với diện tích đỉnh (có phông bậc) được viết:
( ) ( ) ( ) ( ) ( )
2 2 222
1 2 2 12
1 1 1
.B i i i
i
G NG P B P B B B P
G PnG
σ
= + − + + − +
∑ ∑ ∑
∑
(B.24)
B.3. Khớp bình phương tối thiểu phi tuyến
Đối với mỗi định chuẩn, chương trình tính toán bốn (hay ba) tham số dạng tự
do dùng phương pháp khớp bình phương tối thiểu (LSQ). Giả định rằng vùng diện
127
tích đỉnh có tập các điểm dữ liệu (xi, yi), ở đó xi là số kênh và yi là số đếm trên kênh
ở xi. Tiến hành khớp mô hình toán học thông qua các điểm dữ liệu này với hàm:
( )1 2, , , , ,i m iF x K yα α α = (B.25)
ở đó α là các tham số tự do của mô hình phải xác định từ phép khớp tốt nhất thông
qua tập dữ liệu. Để xác định các tham số tự do, phương pháp LSQ đòi hỏi:
( ) 22 ,i i i
i
w y F xχ α= ⋅ − ∑ (B.26)
với wi là trọng số liên kết điểm dữ liệu thứ i, phải nhỏ nhất.
Trong cơ chế này, nếu độ bất định của các điểm dữ liệu là khác nhau, mỗi
điểm được gán trọng số 21 ,iσ với iσ là độ lệch chuẩn của điểm dữ liệu thứ i. Trong
phổ gamma, phông được trừ khỏi các điểm dữ liệu trước khi khớp nên 2 .i iyσ ≠
Trong trường hợp trừ phông tuyến tính, nội dung kênh đã hiệu đính phải được
viết:
( )
( )
2 1
1
1
1i i
i B B
y y B
n n N
⋅ −
′ = − ⋅ −
⋅ +
(B.27)
và trọng số:
( )
( )
2 2
1 2
2
1
1
1
i
i
w
B N i B i
y
n N
′ =
⋅ + − +
+
+
(B.28)
với: N là số kênh trong vùng ROI của đỉnh; n là số kênh phông ở mỗi phía (thường
giống nhau cả hai phía đỉnh); B1 là tổng số đếm trong vùng phông ở phía trái đỉnh
và B2 là tổng số đếm trong vùng phông ở phía phải đỉnh.
Trong trường hợp trừ phông bậc, nội dung kênh đã hiệu đính được viết:
( )2 1
1
1
1 i
i i j
j
B B
y y B y
n nG =
−
′ = − ⋅ − ∑ (B.29)
và trọng số:
( ) ( )
( )
2 22
1 2 2 1
2
1
i
i i
i
w
B G P B P B B P
y
nG
′ =
⋅ − + + − ⋅
+
(B.30)
128
ở đó G là tổng số đếm (gross) trong vùng ROI đỉnh; N là số kênh trong vùng ROI
đỉnh; n là số kênh phông ở mỗi phía (giống nhau cả hai phía đỉnh); B1 là tổng số
đếm trong vùng phông ở phía trái đỉnh và B2 là tổng số đếm trong vùng phông ở
phía phải đỉnh.
Một giải pháp tốt hơn là sử dụng trọng số dựa trên trung bình số đếm trong các
kênh liền kề. Vì vậy, yi trong các pt. (B.28) và (B.29) được thay bởi
1 12
, 100.
4
i i i
i i
y y yy y− ++ += ∀ < (B.31)
Đại lượng 2χ định nghĩa trong pt. (B.26) đạt cực tiểu với mọi jα khi
2
0.
j
χ
α
∂
=
∂
(B.32)
Yêu cầu cực tiểu hóa này sinh ra tập các phương trình đồng thời có thể giải
được đối với mọi α để hàm F(xi, α) là tuyến tính với các α đó. Nếu hàm này không
tuyến tính với các α, có thể tuyến tính hóa bằng khai triển chuỗi Taylor:
2
0 0
0
1
1( , )
2
m
j j k
j j kj j k
F FF X F Kα δα δα δα
α α α=
∂ ∂
= + + + ∂ ∂ ∂
∑ ∑∑ (B.33)
Thay chuỗi Taylor mở rộng trong pt. (B.33) vào pt. (B.26) và chỉ giữ lại các số hạng
bậc nhất, phương trình đối với 2χ trở nên:
2
2
0i i j
i j j
F
w y Fχ δα
α
∂
= − − ∂
∑ ∑ (B.34)
và lúc này là tuyến tính trong các số hạngδα , có thể cực tiểu hóa theo biến số mới:
( )
2
0 0
02 0i i j
i jk k j
F F
w y Fχ δαδα α α
∂ ∂∂
= − − − = ∂ ∂ ∂
∑ ∑ (B.35)
Trong ký hiệu ma trận, một hệ thống phương trình ma trận biểu thị như sau:
( )b M δα= ⋅ (B.36)
ở đó
0 0
jk i
i j k
F FM w
α α
∂ ∂
= ⋅ ⋅
∂ ∂∑
(B.37)
129
và
( ) 00k i i
i k
Fb w y F
α
∂
= ⋅ − ⋅
∂∑
(B.38)
Thủ tục này lặp đi lặp lại nhiều lần, thường được coi như phương pháp bình
phương tối thiểu phi tuyến. Phương pháp lặp này nâng cao quá trình hội tụ và giảm
xác suất phân kỳ bằng thủ tục nhảy. Thuật toán gồm các bước như sau:
1. λ = 0.5
k = 0.9, hằng số nhảy
n = 0, bộ đếm lặp
nmax = 10, số lần lặp không nhảy lớn nhất
nmaxd = 15, số lần lặp tuyệt đối lớn nhất
ở đó λ là hệ số nhân; thay vì giải quyết phương trình ma trận dạng ban đầu, λ có
mặt trong thuật toán tìm nghiệm của phương trình:
( )b M δα′= ⋅ (B.39)
ở đó
( )1 ,
, .
jk
jk
jk
M j k
M
M j k
λ + =
′ = ≠
(B.40)
2. Tính các hệ số δα từ
( ) ( ) 1M bδα −′= ⋅ (B.41)
Thoát với sai số thích hợp, nếu ma trận M’ là đơn.
3. Tăng số lần lặp: n = n +1
4. Đặt ( ) 11 nni i in kα α δα −−= +
5. Tính bình phương của phần dư, ( )2 nχ α
6. Nếu bất kỳ số hạng inα vượt ngoài giới hạn cho phép:
a. Đặt các giá trị α tới các giá trị giới hạn.
b. Nếu n > nmax, thoát với sai số thích hợp.
c. Đặt nmax = nmax +2; nếu nmax > nmaxd, đặt nmax = nmaxd.
d. Đặt 5 ;λ λ= nếu 100,λ > đặt 100;λ = nếu 0.1,λ < đặt 0.1.λ =
130
e. Đặt k = 0.7k; nếu k < 0.2, đặt k = 0.2.
f. Trở về bước 2.
7. Nếu n < 2, nhảy đến bước 12.
8. Nếu n < 3, nhảy đến bước 11.
9. Kiểm tra điều kiện hội tụ thỏa mãn chưa.
10. Nếu n > nmax, thoát với sai số.
11. Nếu ( ) ( )2 2 1 ,n nχ α χ α ε+> + ở đó ε = 10-3 liên tục; trái lại vòng lặp chấm dứt.
12. Đặt λ = 0.1λ, k = 1; trở về bước 1.
Vòng lặp được giả định là hội tụ nếu tất cả điều kiện sau được thỏa mãn:
1. Thay đổi trong vị trí đỉnh nhỏ hơn 0.01 kênh,
2. Thay đổi trong tham số độ rộng đỉnh, W, nhỏ hơn 0.005W,
3. Thay đổi trong tham số chiều cao là:
a. nhỏ hơn hai số đếm, hoặc
b. nhỏ hơn một nửa độ lệch chuẩn trong chiều cao đỉnh, và
4. Thay đổi trong tham số đuôi (nếu được tính) nhỏ hơn 0.5W.
Nếu bốn tiêu chí hội tụ này không được thỏa mãn, vòng lặp không chấm dứt;
nếu sau bốn hay nhiều lần lặp:
( ) ( )
( )
2 1 2
3
2 10
n n
n
χ α χ α
χ α
−
−
−
< (B.42)
Kiểm tra này chỉ ra rằng mặc dù các tham số riêng có thể còn thay đổi, song
phép khớp toàn cục vẫn không cải thiện hơn và quá trình đó có thể được xác định
rồi. Để tránh hội tụ sai, cần chọn các giá trị k > 0.7 và λ < 0.05.
131
PHỤ LỤC C: CHƯƠNG TRÌNH MÃ NGUỒN VHDL ĐỂ PHÁT TRIỂN
HỆ PHỔ KẾ ĐA KÊNH DSP-BASED MCA 8K
----------------------------------------------------------------------------------
-- Create Date: 15:13:22 11/19/2010
-- Module Name: DSPMCA8 - Behavioral
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity DSPMCA8_D_V5A is
port(
CLK48M : IN STD_LOGIC;
ADC_IN: IN STD_LOGIC_VECTOR(11 downto 0);
ADC_OVFS: IN STD_LOGIC; ADCCLK : OUT STD_LOGIC;
addr_bus: IN STD_LOGIC_VECTOR(15 downto 0);
data_bus: INOUT STD_LOGIC_VECTOR(7 downto 0);
wr_by_CPU: IN STD_LOGIC; rd_by_CPU: IN STD_LOGIC;
BLCOLLECT: IN STD_LOGIC; RESET_M : IN STD_LOGIC;
MCA_EN : IN STD_LOGIC; bit_test: OUT STD_LOGIC;
OUT_1SEC: OUT STD_LOGIC );
end DSPMCA8_D_V5A;
architecture Behavioral of DSPMCA8_D_V5A is
component HPDeconvolver_logic_combine is
port
(clk: in std_logic; res: in std_logic;
RTSET: in std_logic_vector(6 downto 0);--M
ADCIn: in std_logic_vector(11 downto 0);
Prod: out std_logic_vector(12 downto 0));
end component;
component LowPassFilter_logic_SC is
port( clk : in std_logic; reset: in std_logic;
L_WIDTH: in std_logic_vector (7 downto 0);
G_WIDTH: in std_logic_vector (7 downto 0);--Flattop width
DI : in std_logic_vector (12 downto 0);-- data input
TRAP_SCP: OUT std_logic_vector(12 downto 0));
end component;
component LowPassFilter_logic_FC is
port( clk : in std_logic; reset: in std_logic;
L_WIDTH: in std_logic_vector (3 downto 0);
DI : in std_logic_vector (12 downto 0);
TRAP_SCP: OUT std_logic_vector(12 downto 0));
end component;
component event_detect is
port
(
CLK : in std_logic;
PC : in std_logic_vector(7 downto 0);
PD : in std_logic_vector(3 downto 0);
FF : in std_logic_vector(11 downto 0);
RFP : out std_logic;
SFP : out std_logic
);
end component;
component pile_up_checker is
Port (
132
reset : in std_logic;
CLK : in STD_LOGIC;
RFP : in STD_LOGIC;
SFP : in STD_LOGIC;
BLCOL : in STD_LOGIC;
PE : in STD_LOGIC_VECTOR (7 downto 0);
PF : in STD_LOGIC_VECTOR (7 downto 0);
PG : in STD_LOGIC_VECTOR (7 downto 0);
PH : in STD_LOGIC_VECTOR (7 downto 0);
ADC_IO: in STD_LOGIC_VECTOR (11 downto 0);
FF : in STD_LOGIC_VECTOR (11 downto 2);
SF : in STD_LOGIC_VECTOR (11 downto 0);
PFOUND : out STD_LOGIC;
PEAK_DATA : out STD_LOGIC_VECTOR (11 downto 0);
BASE_DATA : out STD_LOGIC_VECTOR (11 downto 0);
UNFILT_DATA : out STD_LOGIC_VECTOR (11 downto 0);
BLFLG : out STD_LOGIC
);
end component;
component peak_detect_bin_MCASPECT is
Port (
CLK : in STD_LOGIC;
mcaLLD : in STD_LOGIC_VECTOR (11 downto 0);
mcaULD : in STD_LOGIC_VECTOR (11 downto 0););
end component;
component MCA_HISTOGRAM_MEM is
port ( addra: IN std_logic_VECTOR(14 downto 0);
addrb: IN std_logic_VECTOR(12 downto 0) );
end component;
component MCA_SETUP_REGISTERS_FILE is
port(
clk : in std_logic; REG_EN: in std_logic; WR_EN: in std_logic;
Addr : in std_logic_vector(3 downto 0);
data_in : in std_logic_vector(7 downto 0);
data_out : out std_logic_vector(7 downto 0) );
end component;
--Interfacing block : FPGA Micro-controller
component MCA_CPU_interface is
PORT(
wr:IN STD_LOGIC; --Write signal, active:=0; output from controller
rd:IN STD_LOGIC; --Read signal, active:=0; output from controllerAddr_Bus:IN
STD_LOGIC_VECTOR(15 DOWNTO 0);--16 bits address bus; output from controller
Addr_O_Bus: OUT STD_LOGIC_VECTOR(14 DOWNTO 0);--select one among 32Kb memory
data_bus: INOUT STD_LOGIC_VECTOR(7 DOWNTO 0);--connect to EZUSB uC data bus
REGISTERS_SEL: OUT STD_LOGIC;--selected registers block for access
);
end component;
component Pulse_Generator_1Hz is
port( clk : in std_logic; rst : in std_logic; ENABLE : in std_logic;
Pulse : out std_logic );
end component;
component DCM_CLK_CLKD2 is
PORT(
CLKIN : IN std_logic; RSTIN : IN std_logic;
CLKDVOUT : OUT std_logic;--input frequency is divided by 2.5
CLK_IBUFG_OUT : OUT std_logic; CLK0OUT : OUT std_logic;
LOCKEDOUT : OUT std_logic);
end component;
component ADC_conditioner is
133
port
(Ena: in std_logic; adc_Overf: in std_logic;
ADCIn: in std_logic_vector(11 downto 0);
FLV_CUT: in std_logic_vector(11 downto 0);
ADCOUT: out std_logic_vector(11 downto 0));
end component;
component decimator_sample_interval is
port
(CLK : in std_logic; DATAIN: in std_logic_vector(15 downto 0);
DATAOUT: out std_logic_vector(15 downto 0); DECLK: out std_logic);
end component;
signal CLKM: std_logic;
signal ResAll: std_logic;--reset delayline, acc, multiplier, divider etc.
signal ResACOLLECTION: std_logic; signal HPD_PROD: std_logic_vector(12 downto 0);
signal DECI_IN: std_logic_vector(15 downto 0); signal DECI_OUT: std_logic_vector(15 downto 0);
signal CLK_DO: std_logic;
begin
create_main_clock:DCM_CLK_CLKD2
PORT MAP
(CLK48M, '0', CLK_DIV25,
open);
port map
(CLK_DIV25, RESET_M, MCA_EN, OUT_1SEC);
FFC_DISRI <= FFC_HB(3 downto 0) & FFC_LB;
ADC_CONDITIONAL: ADC_conditioner
port map
(MCA_EN, --MCA system Enable,
ADC_OVFS, ADC_IN, FFC_DISRI,
ADC_OUT);
ResAll <= RESET_M OR ResACOLLECTION;
create_HPD_circuit: HPDeconvolver_logic_combine
port map
(CLKM, ResAll, M_Factor(6 downto 0),
ADC_OUT, HPD_PROD);
create_filter_for_fast_channel: LowPassFilter_logic_FC
port map
(CLK_DO, ResAll, "1011",
HPD_PROD, LPF_FC_PROD);
create_filter_for_slow_channel: LowPassFilter_logic_SC
port map
( CLK_DO, ResAll, Ls_SET,
Gs_SET, DECI_OUT (12 downto 0), LPF_SC_PROD);
bit_test <= NOPILEUP; detect_new_Event: event_detect
port map
(CLK_DO, FFC_LB, "0011", --MIN_WIDTH: constant =3
LPF_FC_PROD(11 downto 0), --data output from fast filter
RFP_Pulse, SFP_Pulse);
Pileup_Inspect_Captured_Peak: pile_up_checker
UPTHRESHOLD <= ULV_HB(3 downto 0) & ULV_LB;
LLV_THRES <= LLV_HB(3 downto 0) & LLV_LB;
peakdetectect_make_MCASPECT: peak_detect_bin_MCASPECT
Port map(
CLK_DO, UPTHRESHOLD, LPF_SC_PROD, '1', ADDRMEM_PB,
WE_PB, ResACOLLECTION );
mcaData2 <= mcaData1 +1;
create_spectroscopy_Mem: MCA_HISTOGRAM_MEM
port map
(ADDRMEM_PA, ADDRMEM_PB, x"00",
mcaData2, DATAMEM_PA_Out, mcaData1, SEL_PA, WE_PA, WE_PB);
134
SETUP_REGISTER_FILE: MCA_SETUP_REGISTERS_FILE
port map
( CLK48_O, SEL_REG, WRE_REG, addr_bus(3 downto 0),
DATA_IN_REG, DATA_OUT_REG);
Access_REGISTER_MEM: MCA_CPU_interface
PORT MAP
( wr_by_CPU, rd_by_CPU, Addr_Bus, ADDRMEM_PA, data_bus );
DECI_IN <= "000" & HPD_PROD;
create_decimator: decimator_sample_interval
port map
(CLKM, ResAll, D_Factor(4 downto 0),
DECI_IN, DECI_OUT, CLK_DO);
end Behavioral;
----------------------------------------------------------------------------------
-- Module Name: DCM_CLK_CLKD2 - Behavioral
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity DCM_CLK_CLKD2 is
PORT( CLKIN : IN std_logic;
RSTIN : IN std_logic;
CLKDVOUT : OUT std_logic;--input frequency is divided by 2.5);
end DCM_CLK_CLKD2;
architecture Behavioral of DCM_CLK_CLKD2 is
COMPONENT DCM_DIV2 -- divide 2.5; Fout=48/2.5=19.6Mhz
PORT( CLKIN_IN : IN std_logic; RST_IN : IN std_logic;
CLKDV_OUT : OUT std_logic;);
END COMPONENT;
begin
use_DCM_DIV2: DCM_DIV2
PORT MAP
(CLKIN_IN => CLKIN, RST_IN => RSTIN,
CLKDV_OUT => CLKDVOUT, CLKIN_IBUFG_OUT => CLK_IBUFG_OUT,
CLK0_OUT => CLK0OUT, LOCKED_OUT => LOCKEDOUT );
end Behavioral;
-----------------------------------------------------------------------------
-- Filename: Pulse_Generator.vhd
-----------------------------------------------------------------------------
library IEEE;
USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; USE ieee.std_logic_arith.all;
entity Pulse_Generator_1Hz is
port( clk : in std_logic; rst : in std_logic; ENABLE : in std_logic;
Pulse : out std_logic );
end entity;
architecture a of Pulse_Generator_1Hz is
CONSTANT Period_G : std_logic_vector (31 downto 0) := x"0124F800";
CONSTANT Pulse_Width : std_logic_vector (31 downto 0) := x"00000028";
COMPONENT counter_1sec is
END COMPONENT;
signal Period_Count : std_logic_vector(31 downto 0);
signal Width_Count : std_logic_vector(31 downto 0);
signal Period_cmp : std_logic_vector(31 downto 0);
signal Width_cmp : std_logic_vector(31 downto 0);
signal LD_width : std_logic; signal E_width : std_logic;
begin
Period_cmp(31 downto 1) '0'); Period_cmp(0) <= '1';
Width_cmp '0');
135
U1 : counter_1sec
PORT MAP(
clk => clk, rst => rst, LOAD => LD_Period,
CE => ENABLE, D => Period_G, Q => Period_Count);
LD_Period <= trigger or (not ENABLE);
trigger Period_G) else
'1' when (Period_Count = Period_cmp) else '0';
U2 : counter_1sec
PORT MAP(
clk => clk, rst => rst, LOAD => LD_width,
CE => E_width, D => Pulse_Width, Q => Width_Count);
LD_width <= trigger;
E_width <= '0' when (Width_Count = Width_cmp) else '1'; Pulse <= E_width;
end;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity HPDeconvolver_logic_combine is
port
(clk: in std_logic;--synchronous latch buffer
res: in std_logic;--reset buffer
RTSET: in std_logic_vector(6 downto 0);--M
ADCIn: in std_logic_vector(11 downto 0);
Prod: out std_logic_vector(12 downto 0) );
end HPDeconvolver_logic_combine;
architecture Behavioral of HPDeconvolver_logic_combine is
component acc_deconvolver is
PORT( CLK : IN STD_LOGIC; rst : IN STD_LOGIC := '0';
CE : IN STD_LOGIC := '1';
D : IN STD_LOGIC_VECTOR(17 DOWNTO 0);
Q : OUT STD_LOGIC_VECTOR(17 DOWNTO 0));
end component;
component adder_deconvolver is
end component;
signal ProdQ: std_logic_vector(19 downto 0);
begin
create_multiply_M: Multiplier_deconvolve
port map
(clk, res, ADCIn, RTSET,
MUL_O );
ADCtemp <= "000000" & ADCIn;
create_Accumulator_of_data_Input: acc_deconvolver
PORT MAP
(clk, res, '1', ADCtemp, Acc_Out);
create_adder: adder_deconvolver
port map
(MUL_O, Acc_OutX2,
Product );
Prod <= ProdQ(12 downto 0);
end Behavioral;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity LowPassFilter_logic_FC is
port(
clk : in std_logic;
reset: in std_logic;
L_WIDTH: in std_logic_vector (3 downto 0);-- RiseTime width
136
DI : in std_logic_vector (12 downto 0);-- data input
TRAP_SCP: OUT std_logic_vector(12 downto 0)
);
end LowPassFilter_logic_FC;
architecture Behavioral of LowPassFilter_logic_FC is
component Rect_trapz_shape_logic1 is
PORT( clk: IN std_logic;
ACLR: IN std_logic; TRAP_SCP: OUT std_logic_vector(15 downto 0));
end component;
port map( clk, reset, Ls_WIDTH1, DI, DO_New, DO_L, DO_LG, DO_2LG);
create_trapezoidal: Rect_trapz_shape_logic1
get_product: DIV164
port map ( clk, reset, TRAP_SCPB, L_WIDTH, Quot_data, open);
end Behavioral;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity LowPassFilter_logic_SC is
port( clk : in std_logic;
reset: in std_logic;
L_WIDTH: in std_logic_vector (7 downto 0);-- RiseTime width; =8,16,32,64
G_WIDTH: in std_logic_vector (7 downto 0);--Flattop width;=8,16
DI : in std_logic_vector (12 downto 0);
TRAP_SCP: OUT std_logic_vector(12 downto 0)
);
end LowPassFilter_logic_SC;
architecture Behavioral of LowPassFilter_logic_SC is
component delayline_slow_filter is
port(
clk : in std_logic;
reset: in std_logic;);
end component;
component Rect_trapz_shape_logic is
PORT( clk: IN std_logic; ACLR: IN std_logic;
x1: IN std_logic_vector(12 downto 0);
x2: IN std_logic_vector(12 downto 0);
x3: IN std_logic_vector(12 downto 0);
x4: IN std_logic_vector(12 downto 0);
TRAP_SCP: OUT std_logic_vector(18 downto 0));
end component;
component DIV1 is
port ( end component;
signal DO_New: std_logic_vector (12 downto 0);
signal DO_L: std_logic_vector (12 downto 0);
signal DO_LG: std_logic_vector (12 downto 0);
signal DO_2LG: std_logic_vector (12 downto 0);
port map(clk, reset, L_WIDTH1,
G_WIDTH1, );
create_trapezoidal: Rect_trapz_shape_logic
PORT MAP( clk, reset,
DO_New, DO_L, DO_LG, DO_2LG, TRAP_SCPB);
get_product: DIV1
port map(clk, reset,
open);
end Behavioral;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
137
architecture Behavioral of pile_up_checker is
component peak_center_finder is
Port ( CLK : in STD_LOGIC; SFP_I : in STD_LOGIC; RFP_I : in STD_LOGIC;
FF_I : in STD_LOGIC_VECTOR (11 downto 2); FTOP_O : out STD_LOGIC);
end component;
component Maximum_fast_peak_width_inspector is
Port ( CLK : in STD_LOGIC; RFP_I : in STD_LOGIC;
PE_I : in STD_LOGIC_VECTOR (7 downto 0);--V20
MWID_O : out STD_LOGIC -- ='1'if pileup in fast filter channel);
end component;
component peak_capture_counter is
Port ( res : in STD_LOGIC; CLK : in STD_LOGIC; L12_I : in STD_LOGIC;
PG_I : in STD_LOGIC_VECTOR (7 downto 0);PEAK_FOUND : out STD_LOGIC;
PSAMP : out STD_LOGIC );
end component;
component Peak_baseline_value_latch is
port
(reset: in std_logic; CLK: in std_logic; sel: in std_logic; latch_ena: in std_logic;
dataIn: in std_logic_vector(11 downto 0);
peak_value: out std_logic_vector(11 downto 0);
base_value: out std_logic_vector(11 downto 0) );
end component;
signal FTOP_BUF : std_logic; signal MWID_BUF : std_logic; signal L12_BUF : std_logic;
signal PSAMP_L : std_logic; signal BLFLGA : std_logic;
begin
BLFLG <= BLFLGA;
peak_center_finder_implement: peak_center_finder
Port map
( CLK, SFP, RFP, FF, FTOP_BUF );
port map
( reset, CLK, BLFLGA, PSAMP_L, SF, PEAK_DATA );
end Behavioral;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity MCA_HISTOGRAM_MEM is
port (
addra: IN std_logic_VECTOR(14 downto 0);
addrb: IN std_logic_VECTOR(12 downto 0);
clka: IN std_logic;
clkb: IN std_logic;
dina: IN std_logic_VECTOR(7 downto 0);
dinb: IN std_logic_VECTOR(31 downto 0);
douta: OUT std_logic_VECTOR(7 downto 0);
doutb: OUT std_logic_VECTOR(31 downto 0);
ena: IN std_logic;
wea: IN std_logic;
web: IN std_logic);
end MCA_HISTOGRAM_MEM;
architecture Behavioral of MCA_HISTOGRAM_MEM is
component mem
port (
addra: IN std_logic_VECTOR(14 downto 0);
addrb: IN std_logic_VECTOR(12 downto 0);
clka: IN std_logic;
clkb: IN std_logic;
dina: IN std_logic_VECTOR(7 downto 0);
dinb: IN std_logic_VECTOR(31 downto 0);
138
douta: OUT std_logic_VECTOR(7 downto 0);
doutb: OUT std_logic_VECTOR(31 downto 0);
ena: IN std_logic;
wea: IN std_logic;
web: IN std_logic);
end component;
attribute box_type: string;
attribute box_type of mem: component is "black_box";
begin
U0 : mem
port map (
addra => addra, addrb => addrb, clka => clka, clkb => clkb,
dina => dina, dinb => dinb, douta => douta, doutb => doutb,
ena => ena, wea => wea, web => web);
end Behavioral;
----------------------------------------------------------------------------------
-- Module Name: access_dpram_byEZUSB - Behavioral
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity MCA_CPU_interface is
PORT(
wr:IN STD_LOGIC; --Write signal, active:=0; output from controller
rd:IN STD_LOGIC; --Read signal, active:=0; output from controller
Addr_Bus:IN STD_LOGIC_VECTOR(15 DOWNTO 0);--16 bits address bus;
Addr_O_Bus: OUT STD_LOGIC_VECTOR(14 DOWNTO 0);--select one among 32Kb memory
data_bus: INOUT STD_LOGIC_VECTOR(7 DOWNTO 0);--connect to EZUSB uC data bus
REGISTERS_SEL: OUT STD_LOGIC;--selected registers block for access
);
end MCA_CPU_interface;
architecture Behavioral of MCA_CPU_interface is
component reg_addr_ctrl_bus is
PORT(
wr:IN STD_LOGIC; rd:IN STD_LOGIC; addrI15:IN STD_LOGIC;
cs_EN: OUT STD_LOGIC;--enable registers to access
wr_EN: OUT STD_LOGIC--enable to write registers with data on "data_wr_MEM" port );
end component;
component dpram_addr_ctrl_bus is
PORT(
wr:IN STD_LOGIC; rd:IN STD_LOGIC; addr_I:IN STD_LOGIC_VECTOR(15 DOWNTO 0);
Maddr_O: OUT STD_LOGIC_VECTOR(14 DOWNTO 0);
Mwr_EN: OUT STD_LOGIC--enable to write DPRAM );
end component;
signal Rsel: std_logic;
BEGIN
REGISTERS_SEL <= Rsel; RW_REG <= RwrEn; MEM_SEL <= Msel;
RW_MEM <= MwrEn; UAREG: reg_addr_ctrl_bus
PORT MAP( wr, rd, Addr_Bus(15), Rsel, RwrEn );
UAMEM: dpram_addr_ctrl_bus
PORT MAP( wr, rd, Addr_Bus, Addr_O_Bus, Msel, MwrEn);
end Behavioral;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity decimator_sample_interval is
port
(CLK : in std_logic; DATAIN: in std_logic_vector(15 downto 0);
DATAOUT: out std_logic_vector(15 downto 0); DECLK: out std_logic);
139
end decimator_sample_interval;
architecture Behavioral of decimator_sample_interval is
component mux7 IS
PORT ( min1, min2, min4, min8,min16, allothers: IN STD_LOGIC;
mux_sel: IN STD_LOGIC_VECTOR (4 DOWNTO 0);
mux_out_A: OUT STD_LOGIC);
END component;
PORT MAP( CLK, DECLK2, DECLK4, DECLK8,
DECLK16, '0', DF, DECLK_OUT);
PORT MAP
(CLK, ARES_ACC, '1', DATAIN, QACC_B);
latch_data_output: process (ARes,LBUF_LOAD_ACC,QACC_B)
begin
DATAOUT_D <= QACC_B; end if;
end process;
select_Follow_DFactor: process (DF,DATAIN,CLK,DATAOUT_D,DECLK_OUT)
begin
if (DF = 1) then
DATAOUT <= DATAIN; DECLK <= CLK;
else
DATAOUT <= DATAOUT_D; DECLK <= DECLK_OUT;
end if;
end process;
end Behavioral;
140
PHỤ LỤC D: MÃ NGUỒN CHƯƠNG TRÌNH MCA
PHÁT TRIỂN BẰNG VC++
// MCANRIView.cpp : implementation of the CMCANRIView class
#include "stdafx.h"
#include "MCANRI.h"
#include "InforDlg.h"
#include "MsgDlg.h"
#include "PeakInfo.h"
#include "Calibration.h"
#include "MCANRIDoc.h"
#include
#include
#include
#include
#include "math.h"
#include
#include
#include
#include
#include "MCANRIView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_DYNCREATE(CMCANRIView, CFormView)
BEGIN_MESSAGE_MAP(CMCANRIView, CFormView)
//{{AFX_MSG_MAP(CMCANRIView)
ON_COMMAND(ID_START, OnStart)
ON_COMMAND(ID_STOP, OnStop)
ON_WM_TIMER()
ON_COMMAND(ID_JUMP_RIGHT, OnJumpRight)
ON_COMMAND(ID_JUMP_LEFT, OnJumpLeft)
ON_COMMAND(ID_REALTIME, OnRealtime)
ON_COMMAND(ID_LIVETIME, OnLivetime)
ON_COMMAND(ID_AUTO, OnAuto)
ON_COMMAND(ID_LINEAR, OnLinear)
ON_COMMAND(ID_LOG, OnLog)
ON_WM_KEYDOWN()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_COMMAND(ID_CAL_ENERGY, OnCalEnergy)
ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)
END_MESSAGE_MAP()
CMCANRIView::CMCANRIView()
: CFormView(CMCANRIView::IDD)
{
BOOL CMCANRIView::OnPreparePrinting(CPrintInfo* pInfo)
{
return DoPreparePrinting(pInfo);
}
void CMCANRIView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
141
}
void CMCANRIView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
}
void CMCANRIView::OnPrint(CDC* pDC, CPrintInfo* /*pInfo*/)
{
}
#ifdef _DEBUG
void CMCANRIView::AssertValid() const
void CMCANRIView::OnDraw(CDC* pDC)
{
CMCANRIDoc *pDoc = GetDocument();
ASSERT_VALID(pDoc);
CClientDC dc(this);
POINT p;
pDC->SetMapMode(MM_HIENGLISH);
CRect rcClient;//(0,0,4000,1000);
CRect rect;
GetClientRect(&rcClient);
m_InfoDlg.SetWindowPos(&wndBottom,rcClient.Width()*2.98/4,0,rcClient.Width()/4,rcClient.Hei
ght(),SWP_SHOWWINDOW);
pDC->DPtoLP(&rcClient);
pDC->SetBkMode(TRANSPARENT);
rect=CRect(xo,yo,mx+xo,my);
pDC->FillSolidRect(rect,RGB(0,0,128));
for(int i= Low; i<= High; i++){
Tally[i]=pDoc->data[i];
p.x=(i-Low)*spacex+xo;
p.y=(int)((Vscale-Tally[i])*spacey);
pDC->SetPixel(p,RGB(255,255,0));
}
CPen lpen(PS_SOLID, 1, RGB(255,0,128));
CPen* pOldPen = pDC->SelectObject(&lpen);
pDC->MoveTo((Cursor.x-Low)*spacex+xo,(Vscale-Tally[Cursor.x])*spacey+30);
pDC->LineTo((Cursor.x-Low)*spacex+xo,(Vscale-(Tally[Cursor.x]))*spacey+300);
CurentCursor = Cursor;
pDC->SelectObject(pOldPen);
void CMCANRIView::Draw(CDC *pDC)
{
CMCANRIDoc *pDoc = GetDocument();
ASSERT_VALID(pDoc);
POINT p;
pDC->DPtoLP(&rcClient);
for(int k=0; k<=16383;k++)
{
if((pDoc->data[k]>=Vscale)&&(m_InfoDlg.m_Option==0))
{
Vscale=Vscale*2;
OnDraw(pDC);
}
}
int yo=(int)(-20);
int xo=(int)(50);
long my=ym+yo;//(long)(spacey*Vscale);
long mx=xm-xo;// (long)(spacex*Hscale+xo);
float spacex = (mx)/(float)Hscale;
float spacey = my/(float)Vscale;
for(int i=Low; i<=High;i++)
{
142
if(pDoc->data[i]>Tally[i])
{
p.x=(i-Low)*spacex+xo;
p.y=(int)((Vscale-Tally[i])*spacey);
pDC->SetPixel(p,RGB(0,0,128));
Tally[i]=pDoc->data[i];
p.y=(int)((Vscale-Tally[i])*spacey);
pDC->SetPixel(p,RGB(255,255,0));
}
}
Cursor.y=(pDoc->data[Cursor.x]);
pDC->SelectObject(pOldPen);
}
}
void CMCANRIView::OnStart()
{
OffControl=TRUE;
OnControl=FALSE;
GetSystemTime(&STime);
for(int j=0;j<=16383;j++)
{
hb[j]=0; mb_old[j]=0; hb1[j]=0;
}
for(int i=32768;i<=65536;i++)
{
hb_add=int(i/256); lb_add=i%256; _outp(0x378,lb_add);
}
SetTimer(ID_CLOCK_TIMER,10, NULL);
}
void CMCANRIView::OnJumpRight()
{
CClientDC dc(this);
if(Cursor.x<High)
{
Cursor.x = Cursor.x +1; OnDraw(&dc); Viewdata();
}
}
void CMCANRIView::Viewdata()
{
CMCANRIDoc *pDoc = GetDocument();
ASSERT_VALID(pDoc);
m_InfoDlg.m_count.Format("%d",pDoc->data[Cursor.x]);
m_InfoDlg.m_channel.Format("%d",Cursor.x);
if(Vscale>=1000)
{
m_InfoDlg.m_vs.Format("%d K", Vscale/1000);
}else
m_InfoDlg.m_vs.Format("%d", Vscale);
void CMCANRIView::OnRealtime()
{
CClientDC dc(this);
if(m_MsgDlg.DoModal()==IDOK)
OnDraw(&dc);
}
void CMCANRIView::OnLivetime()
{
CClientDC dc(this);
if(m_MsgDlg.DoModal()==IDOK)
{
143
m_InfoDlg.m_preset.Format("live_time %d", m_MsgDlg.m_Preset_time);
m_InfoDlg.UpdateData(FALSE);
}
OnDraw(&dc);
}
void CMCANRIView::OnLButtonDown(UINT nFlags, CPoint point)
{
Cursor.x = CursorPosition; Cursor.y =pDoc->data[Cursor.x];
OnDraw(&dc); Viewdata();
}
void CMCANRIView::OnUnexpand()
{
int HscaleNew = Hscale+1;
if(HscaleNew*2<=16384)
{
int HighOld, LowOld; HighOld = High; LowOld = Low;
HscaleNew *= 2; CursorOffset /=2;
if((Cursor.x + HscaleNew/2) >= 16384)
{
High = 16383; Hscale = HscaleNew -1; Low = High-Hscale;
}else
{
if((Cursor.x - HscaleNew/2)<=0)
{
Low = 0; Hscale = HscaleNew-1;
High = Low+Hscale;
}else
{
High = Cursor.x + HscaleNew/2; Hscale = HscaleNew-1; Low = Cursor.x-HscaleNew/2; }
}}
CClientDC dc(this);
OnDraw(&dc);
Viewdata(); }
void CMCANRIView::OnMouseMove(UINT nFlags, CPoint point)
{
CMCANRIDoc *pDoc = GetDocument();
ASSERT_VALID(pDoc); CRect rcClient;//(0,0,4000,1000);
GetClientRect(&rcClient); CClientDC dc(this);
CPoint P; int N=0; int PreN=0;
if((nFlags &MK_LBUTTON)== MK_LBUTTON)
CFormView::OnMouseMove(nFlags, point);
}
void CMCANRIView::OnLButtonUp(UINT nFlags, CPoint point)
{
if(GetCapture() == this)
ReleaseCapture(); CMCANRIDoc *pDoc = GetDocument(); ASSERT_VALID(pDoc);
if(MousePosition>0)
{
int Count=0; int Center=Cursor.x; int Left=0; int Right=0; int LeftCount, RightCount;
int i,j; int FWHM_Count; float FWHM_L, FWHM_R;
RoiInfo[RoiIndex].Net=0; RoiInfo[RoiIndex].Gross=0; Left= Cursor.x;
Right=Cursor.x+MousePosition;
For (j=Left-4;jdata[j];
RoiInfo[RoiIndex].Net=Count;
FWHM_Count=(pDoc->data[Center]-(abs(pDoc->data[RightCount]-pDoc-
>data[LeftCount])/2))/2;
for(i=Left; i<=Center; i++)
{
if((pDoc->data[i]data[i+1]>=FWHM_Count))
144
{
FWHM_L=float(i)+(1.0/abs(pDoc->data[i+1]-pDoc-
>data[i]))*(FWHM_Count-pDoc->data[i]);
}
}
for(i=Right; i>=Center; i--)
FWHM_R=(m_En_Calibrate.FitPara[0]+FWHM_R*m_En_Calibrate.FitPara[1]+m_En_Calibrate.F
itPara[2]*FWHM_R*FWHM_R);
FWHM_L=(m_En_Calibrate.FitPara[0]+FWHM_L*m_En_Calibrate.FitPara[1]+m_En_Calibrate.Fi
tPara[2]*FWHM_L*FWHM_L);
RoiInfo[RoiIndex].FWHM=FWHM_R-FWHM_L;
RoiIndex++;
}
MaxMouseMove=0; MousePosition=0;
CFormView::OnLButtonUp(nFlags, point);
}
void CMCANRIView::OnCalEnergy()
{
if(m_En_Calibrate.DoModal()==IDOK)
{
EnCalibControl=TRUE;
}
}
145
PHỤ LỤC E: HÌNH ẢNH THIẾT BỊ ĐÃ CHẾ TẠO
Hình E1: Bản mạch FPGA-MCD8K.
146
Hình E2: Khối FPGA-ADC8K.
147
Hình E3: Khối DSP-MCA8K.
Hình F4: Ảnh chụp mặt trước và sau của bản mạch XC3S400-TB dùng để chế tạo
khối DSP-MCA8K.
148
Hình E5: Bản mạch DSP-Spartan-3E, Xilinx dùng để chế tạo khối
DSP-MCA1K.
149
Hình E6: Hệ đếm nơtron ghép PC dùng vi điều khiển dòng PIC.
150
Hình E7: Hệ đếm nơtron ghép PC qua EZ-USB.
Các file đính kèm theo tài liệu này:
- luanan_danglanh_22jan2014_3626.pdf