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

Để ñá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.

pdf171 trang | Chia sẻ: aquilety | Lượt xem: 2390 | Lượt tải: 0download
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:

  • pdfluanan_danglanh_22jan2014_3626.pdf
Luận văn liên quan