1. 關於51系列單片機開發板的選購
吳鑒鷹單片機開發板我用過羨枯,感覺不錯,視頻講解挺好的,售後服務也很好,我的板子是學校團購的,每次有問題都會及時回答,記得一次調試液晶,當時老是出現花屏的現象,找了好久,然後沒辦法,將程序發給他們技術支持,幫忙局宏分析桐派冊,原來是數組定義錯了。
2. 如果單片機故障了會不會燒壞和它連在一起的電腦呢 如果會。有沒有...
如果採用電腦USB供電,單片機故障不會損壞電腦有關介面和部件,只要沒有外部高電壓輸入,5V的信號電腦都能承受,即使單片機開發板短路,USB介面保護電路會起作用,放心地實驗吧,弱電實驗不會對人和設備產生危險,也很少發生損壞器件的現象,我曾把單片機電源正負極搞反,晶元發燙也沒損壞,我作單片機實驗很多,幾乎沒損壞什麼元器件
但我做其它實驗損失就大多了,如開關電源實驗,大功率三極體,十幾元甚至幾十元,不知不覺瞬間就燒了,還損壞很多集成塊也不便宜,那時候工資還很低,很令人心疼
前一段作DC-DC升壓試驗,燒了不少XL6009模塊,最後連充電寶也燒壞了好在現在網購比較快,電子產品也較便宜
3. 學習protel multisim autocad單片機 好的建議統統give me 感謝
EDA不是軟體,是一種技術^^^^
EDA技術的概念
EDA技術是在電子CAD技術基礎上發展起來的計算機軟體系統,是指以計算機為工作平台,融合了應用電子技術、計算機技術、信息處理及智能化技術的最新成果,進行電子產品的自動設計。
利用EDA工具,電子設計師可以從概念、演算法、協議等開始設計電子系統,大量工作可以通過計算機完成,並可以將電子產品從電路設計、性能分析到設計出IC版圖或PCB版圖的整個過程的計算機上自動處理完成。
現在對EDA的概念或范疇用得很寬。包括在機械、電子、通信、航空航天、化工、礦產、生物、醫學、軍事等各個領域,都有EDA的應用。目前EDA技術已在各大公司、企事業單位和科研教學部門廣泛使用。例如在飛機製造過程中,從設計、性能測試及特性分析直到飛行模擬,都可能涉及到EDA技術。本文所指的EDA技術,主要針對電子電路設計、PCB設計和IC設計。
EDA設計可分為系統級、電路級和物理實現級。
2 EDA常用軟體
EDA工具層出不窮,目前進入我國並具有廣泛影響的EDA軟體有:multiSIM7(原EWB的最新版本)、PSPICE、OrCAD、PCAD、Protel、Viewlogic、Mentor、Graphics、Synopsys、LSIIogic、Cadence、MicroSim等等。這些工具都有較強的功能,一般可用於幾個方面,例如很多軟體都可以進行電路設計與模擬,同進還可以進行PCB自動布局布線,可輸出多種網表文件與第三方軟體介面。
(下面是關於EDA的軟體介紹,有興趣的話,舊看看吧^^^)
下面按主要功能或主要應用場合,分為電路設計與模擬工具、PCB設計軟體、IC設計軟體、PLD設計工具及其它EDA軟體,進行簡單介紹。
2.1 電子電路設計與模擬工具
我們大家可能都用過試驗板或者其他的東西製作過一些電子製做來進行實踐。但是有的時候,我們會發現做出來的東西有很多的問題,事先並沒有想到,這樣一來就浪費了我們的很多時間和物資。而且增加了產品的開發周期和延續了產品的上市時間從而使產品失去市場競爭優勢。有沒有能夠不動用電烙鐵試驗板就能知道結果的方法呢?結論是有,這就是電路設計與模擬技術。
說到電子電路設計與模擬工具這項技術,就不能不提到美國,不能不提到他們的飛機設計為什麼有很高的效率。以前我國定型一個中型飛機的設計,從草案到詳細設計到風洞試驗再到最後出圖到實際投產,整個周期大概要10年。而美國是1年。為什麼會有這樣大的差距呢?因為美國在設計時大部分採用的是虛擬模擬技術,把多年積累的各項風洞實驗參數都輸入電腦,然後通過電腦編程編寫出一個虛擬環境的軟體,並且使它能夠自動套用相關公式和調用長期積累後輸入電腦的相關經驗參數。這樣一來,只要把飛機的外形計數據放入這個虛擬的風洞軟體中進行試驗,哪裡不合理有問題就改動那裡,直至最佳效果,效率自然高了,最後只要再在實際環境中測試幾次找找不足就可以定型了,從他們的波音747到F16都是採用的這種方法。空氣動力學方面的數據由資深專家提供,軟體開發商是IBM,飛行器設計工程師只需利用模擬軟體在計算機平台上進行各種模擬調試工作即可。同樣,他們其他的很多東西都是採用了這樣類似的方法,從大到小,從復雜到簡單,甚至包括設計傢具和作曲,只是具體軟體內容不同。其實,他們發明第一代計算機時就是這個目的(當初是為了高效率設計大炮和相關炮彈以及其他計算量大的設計)。
電子電路設計與模擬工具包括SPICE/PSPICE;multiSIM7;Matlab;SystemView;MMICAD LiveWire、Edison、Tina Pro Bright Spark等。下面簡單介紹前三個軟體。
①SPICE(Simulation Program with Integrated Circuit Emphasis):是由美國加州大學推出的電路分析模擬軟體,是20世紀80年代世界上應用最廣的電路設計軟體,1998年被定為美國國家標准。1984年,美國MicroSim公司推出了基於SPICE的微機版PSPICE(Personal-SPICE)。現在用得較多的是PSPICE6.2,可以說在同類產品中,它是功能最為強大的模擬和數字電路混合模擬EDA軟體,在國內普遍使用。最新推出了PSPICE9.1版本。它可以進行各種各樣的電路模擬、激勵建立、溫度與雜訊分析、模擬控制、波形輸出、數據輸出、並在同一窗口內同時顯示模擬與數字的模擬結果。無論對哪種器件哪些電路進行模擬,都可以得到精確的模擬結果,並可以自行建立元器件及元器件庫。
②multiSIM(EWB的最新版本)軟體:是Interactive Image Technologies Ltd在20世紀末推出的電路模擬軟體。其最新版本為multiSIM7,目前普遍使用的是multiSIM2001,相對於其它EDA軟體,它具有更加形象直觀的人機交互界面,特別是其儀器儀表庫中的各儀器儀表與操作真實實驗中的實際儀器儀表完全沒有兩樣,但它對模數電路的混合模擬功能卻毫不遜色,幾乎能夠100%地模擬出真實電路的結果,並且它在儀器儀表庫中還提供了萬用表、信號發生器、瓦特表、雙蹤示波器(對於multiSIM7還具有四蹤示波器)、波特儀(相當實際中的掃頻儀)、字信號發生器、邏輯分析儀、邏輯轉換儀、失真度分析儀、頻譜分析儀、網路分析儀和電壓表及電流表等儀器儀表。還提供了我們日常常見的各種建模精確的元器件,比如電阻、電容、電感、三極體、二極體、繼電器、可控硅、數碼管等等。模擬集成電路方面有各種運算放大器、其他常用集成電路。數字電路方面有74系列集成電路、4000系列集成電路、等等還支持自製元器件。MultiSIM7還具有I-V分析儀(相當於真實環境中的晶體管特性圖示儀)和Agilent信號發生器、Agilent萬用表、Agilent示波器和動態邏輯平筆等。同時它還能進行VHDL模擬和Verilog HDL模擬。
③MATLAB產品族:它們的一大特性是有眾多的面向具體應用的工具箱和模擬塊,包含了完整的函數集用來對圖像信號處理、控制系統設計、神經網路等特殊應用進行分析和設計。它具有數據採集、報告生成和MATLAB語言編程產生獨立C/C++代碼等功能。MATLAB產品族具有下列功能:數據分析;數值和符號計算、工程與科學繪圖;控制系統設計;數字圖像信號處理;財務工程;建模、模擬、原型開發;應用開發;圖形用戶界面設計等。MATLAB產品族被廣泛應用於信號與圖像處理、控制系統設計、通訊系統模擬等諸多領域。開放式的結構使MATLAB產品族很容易針對特定的需求進行擴充,從而在不斷深化對問題的認識同時,提高自身的競爭力。
2.2 PCB設計軟體
PCB(Printed-Circuit Board)設計軟體種類很多,如Protel、OrCAD、Viewlogic、PowerPCB、Cadence PSD、MentorGraphices的Expedition PCB、Zuken CadStart、Winboard/Windraft/Ivex-SPICE、PCB Studio、TANGO、PCBWizard(與LiveWire配套的PCB製作軟體包)、ultiBOARD7(與multiSIM2001配套的PCB製作軟體包)等等。
目前在我國用得最多當屬Protel,下面僅對此軟體作一介紹。
Protel是PROTEL(現為Altium)公司在20世紀80年代末推出的CAD工具,是PCB設計者的首選軟體。它較早在國內使用,普及率最高,在很多的大、中專院校的電路專業還專門開設Protel課程,幾乎所在的電路公司都要用到它。早期的Protel主要作為印刷板自動布線工具使用,其最新版本為Protel DXP,現在普遍使用的是Protel99SE,它是個完整的全方位電路設計系統,包含了電原理圖繪制、模擬電路與數字電路混合信號模擬、多層印刷電路板設計(包含印刷電路板自動布局布線),可編程邏輯器件設計、圖表生成、電路表格生成、支持宏操作等功能,並具有Client/Server(客戶/服務體系結構), 同時還兼容一些其它設計軟體的文件格式,如ORCAD、PSPICE、EXCEL等。使用多層印製線路板的自動布線,可實現高密度PCB的100%布通率。Protel軟體功能強大(同時具有電路模擬功能和PLD開發功能)、界面友好、使用方便,但它最具代表性的是電路設計和PCB設計。
2.3 IC設計軟體
IC設計工具很多,其中按市場所佔份額排行為Cadence、Mentor Graphics和Synopsys。這三家都是ASIC設計領域相當有名的軟體供應商。其它公司的軟體相對來說使用者較少。中國華大公司也提供ASIC設計軟體(熊貓2000);另外近來出名的Avanti公司,是原來在Cadence的幾個華人工程師創立的,他們的設計工具可以全面和Cadence公司的工具相抗衡,非常適用於深亞微米的IC設計。下面按用途對IC設計軟體作一些介紹。
①設計輸入工具
這是任何一種EDA軟體必須具備的基本功能。像Cadence的composer,viewlogic的viewdraw,硬體描述語言VHDL、Verilog HDL是主要設計語言,許多設計輸入工具都支持HDL(比如說multiSIM等)。另外像Active-HDL和其它的設計輸入方法,包括原理和狀態機輸入方法,設計FPGA/CPLD的工具大都可作為IC設計的輸入手段,如Xilinx、Altera等公司提供的開發工具Modelsim FPGA等。
②設計模擬工作
我們使用EDA工具的一個最大好處是可以驗證設計是否正確,幾乎每個公司的EDA產品都有模擬工具。Verilog-XL、NC-verilog用於Verilog模擬,Leapfrog用於VHDL模擬,Analog Artist用於模擬電路模擬。Viewlogic的模擬器有:viewsim門級電路模擬器,speedwaveVHDL模擬器,VCS-verilog模擬器。Mentor Graphics有其子公司Model Tech出品的VHDL和Verilog雙模擬器:Model Sim。Cadence、Synopsys用的是VSS(VHDL模擬器)。現在的趨勢是各大EDA公司都逐漸用HDL模擬器作為電路驗證的工具。
③綜合工具
綜合工具可以把HDL變成門級網表。這方面Synopsys工具佔有較大的優勢,它的Design Compile是作為一個綜合的工業標准,它還有另外一個產品叫Behavior Compiler,可以提供更高級的綜合。
另外最近美國又出了一個軟體叫Ambit,據說比Synopsys的軟體更有效,可以綜合50萬門的電路,速度更快。今年初Ambit被Cadence公司收購,為此Cadence放棄了它原來的綜合軟體Synergy。隨著FPGA設計的規模越來越大,各EDA公司又開發了用於FPGA設計的綜合軟體,比較有名的有:Synopsys的FPGA Express, Cadence的Synplity, Mentor的Leonardo,這三家的FPGA綜合軟體佔了市場的絕大部分。
④布局和布線
在IC設計的布局布線工具中,Cadence軟體是比較強的,它有很多產品,用於標准單元、門陣列已可實現交互布線。最有名的是Cadence spectra,它原來是用於PCB布線的,後來Cadence把它用來作IC的布線。其主要工具有:Cell3,Silicon Ensemble-標准單元布線器;Gate Ensemble-門陣列布線器;Design Planner-布局工具。其它各EDA軟體開發公司也提供各自的布局布線工具。
⑤物理驗證工具
物理驗證工具包括版圖設計工具、版圖驗證工具、版圖提取工具等等。這方面Cadence也是很強的,其Dracula、Virtuso、Vampire等物理工具有很多的使用者。
⑥模擬電路模擬器
前面講的模擬器主要是針對數字電路的,對於模擬電路的模擬工具,普遍使用SPICE,這是唯一的選擇。只不過是選擇不同公司的SPICE,像MiceoSim的PSPICE、Meta Soft的HSPICE等等。HSPICE現在被Avanti公司收購了。在眾多的SPICE中,HSPICE作為IC設計,其模型多,模擬的精度也高。
2.4 PLD設計工具
PLD(Programmable Logic Device)是一種由用戶根據需要而自行構造邏輯功能的數字集成電路。目前主要有兩大類型:CPLD(Complex PLD)和FPGA(Field Programmable Gate Array)。它們的基本設計方法是藉助於EDA軟體,用原理圖、狀態機、布爾表達式、硬體描述語言等方法,生成相應的目標文件,最後用編程器或下載電纜,由目標器件實現。生產PLD的廠家很多,但最有代表性的PLD廠家為Altera、Xilinx和Lattice公司。
PLD的開發工具一般由器件生產廠家提供,但隨著器件規模的不斷增加,軟體的復雜性也隨之提高,目前由專門的軟體公司與器件生產廠家使用,推出功能強大的設計軟體。下面介紹主要器件生產廠家和開發工具。
①ALTERA:20世紀90年代以後發展很快。主要產品有:MAX3000/7000、FELX6K/10K、APEX20K、ACEX1K、Stratix等。其開發工具-MAX+PLUS II是較成功的PLD開發平台,最新又推出了Quartus II開發軟體。Altera公司提供較多形式的設計輸入手段,綁定第三方VHDL綜合工具,如:綜合軟體FPGA Express、Leonard Spectrum,模擬軟體ModelSim。
②ILINX:FPGA的發明者。產品種類較全,主要有:XC9500/4000、Coolrunner(XPLA3)、Spartan、Vertex等系列,其最大的Vertex-II Pro器件已達到800萬門。開發軟體為Foundation和ISE。通常來說,在歐洲用Xilinx的人多,在日本和亞太地區用ALTERA的人多,在美國則是平分秋色。全球PLD/FPGA產品60%以上是由Altera和Xilinx提供的。可以講Altera和Xilinx共同決定了PLD技術的發展方向。
③Lattice-Vantis:Lattice是ISP(In-System Programmability)技術的發明者。ISP技術極大地促進了PLD產品的發展,與ALTERA和XILINX相比,其開發工具比Altera和Xilinx略遜一籌。中小規模PLD比較有特色,大規模PLD的競爭力還不夠強(Lattice沒有基於查找表技術的大規模FPGA),1999年推出可編程模擬器件,1999年收購Vantis(原AMD子公司),成為第三大可編程邏輯器件供應商。2001年12月收購Agere公司(原Lucent微電子部)的FPGA部門。主要產品有ispLSI2000/5000/8000,MACH4/5。
④ACTEL:反熔絲(一次性燒寫)PLD的領導者。由於反熔絲PLD抗輻射、耐高低溫、功耗低、速度快,所以在軍品和宇航級上有較大優勢。ALTERA和XILINX則一般不涉足軍品和宇航級市場。
⑤Quicklogic:專業PLD/FPGA公司,以一次性反熔絲工藝為主,在中國地區銷售量不大。
⑥Lucent:主要特點是有不少用於通訊領域的專用IP核,但PLD/FPGA不是Lucent的主要業務,在中國地區使用的人很少。
⑦ATMEL:中小規模PLD做得不錯。ATMEL也做了一些與Altera和Xilinx兼容的片子,但在品質上與原廠家還是有一些差距,在高可靠性產品中使用較少,多用在低端產品上。
⑧Clear Logic:生產與一些著名PLD/FPGA大公司兼容的晶元,這種晶元可將用戶的設計一次性固化,不可編程,批量生產時的成本較低。
⑨WSI:生產PSD(單片機可編程外圍晶元)產品。這是一種特殊的PLD,如最新的PSD8xx、PSD9xx集成了PLD、EPROM、Flash,並支持ISP(在線編程),集成度高,主要用於配合單片機工作。
順便提一下:PLD(可編程邏輯器件)是一種可以完全替代74系列及GAL、PLA的新型電路,只要有數字電路基礎,會使用計算機,就可以進行PLD的開發。PLD的在線編程能力和強大的開發軟體,使工程師可以幾天,甚至幾分鍾內就可完成以往幾周才能完成的工作,並可將數百萬門的復雜設計集成在一顆晶元內。PLD技術在發達國家已成為電子工程師必備的技術。
2.5 其它EDA軟體
①VHDL語言:超高速集成電路硬體描述語言(VHSIC Hardware Deseription Languagt,簡稱VHDL),是IEEE的一項標准設計語言。它源於美國國防部提出的超高速集成電路(Very High Speed Integrated Circuit,簡稱VHSIC)計劃,是ASIC設計和PLD設計的一種主要輸入工具。
②Veriolg HDL:是Verilog公司推出的硬體描述語言,在ASIC設計方面與VHDL語言平分秋色。
③其它EDA軟體如專門用於微波電路設計和電力載波工具、PCB製作和工藝流程式控制制等領域的工具,在此就不作介紹了。
3 EDA的應用
EDA在教學、科研、產品設計與製造等各方面都發揮著巨大的作用。在教學方面,幾乎所有理工科(特別是電子信息)類的高校都開設了EDA課程。主要是讓學生了解EDA的基本概念和基本原理、掌握用HDL語言編寫規范、掌握邏輯綜合的理論和演算法、使用EDA工具進行電子電路課程的實驗驗證並從事簡單系統的設計。一般學習電路模擬工具(如multiSIM、PSPICE)和PLD開發工具(如Altera/Xilinx的器件結構及開發系統),為今後工作打下基礎。
科研方面主要利用電路模擬工具(multiSIM或PSPICE)進行電路設計與模擬;利用虛擬儀器進行產品測試;將CPLD/FPGA器件實際應用到儀器設備中;從事PCB設計和ASIC設計等。
在產品設計與製造方面,包括計算機模擬,產品開發中的EDA工具應用、系統級模擬及測試環境的模擬,生產流水線的EDA技術應用、產品測試等各個環節。如PCB的製作、電子設備的研製與生產、電路板的焊接、ASIC的製作過程等。
從應用領域來看,EDA技術已經滲透到各行各業,如上文所說,包括在機械、電子、通信、航空航航天、化工、礦產、生物、醫學、軍事等各個領域,都有EDA應用。另外,EDA軟體的功能日益強大,原來功能比較單一的軟體,現在增加了很多新用途。如AutoCAD軟體可用於機械及建築設計,也擴展到建築裝璜及各類效果圖、汽車和飛機的模型、電影特技等領域。
4 EDA技術的發展趨勢
從目前的EDA技術來看,其發展趨勢是政府重視、使用普及、應用廣泛、工具多樣、軟體功能強大。
中國EDA市場已漸趨成熟,不過大部分設計工程師面向的是PCB制板和小型ASIC領域,僅有小部分(約11%)的設計人員開發復雜的片上系統器件。為了與台灣和美國的設計工程師形成更有力的競爭,中國的設計隊伍有必要引進和學習一些最新的EDA技術。
在信息通信領域,要優先發展高速寬頻信息網、深亞微米集成電路、新型元器件、計算機及軟體技術、第三代移動通信技術、信息管理、信息安全技術,積極開拓以數字技術、網路技術為基礎的新一代信息產品,發展新興產業,培育新的經濟增長點。要大力推進製造業信息化,積極開展計算機輔助設計(CAD)、計算機輔助工程(CAE)、計算機輔助工藝(CAPP)、計算機機輔助製造(CAM)、產品數據管理(PDM)、製造資源計劃(MRPII)及企業資源管理(ERP)等。有條件的企業可開展「網路製造」,便於合作設計、合作製造,參與國內和國際競爭。開展「數控化」工程和「數字化」工程。自動化儀表的技術發展趨勢的測試技術、控制技術與計算機技術、通信技術進一步融合,形成測量、控制、通信與計算機(M3C)結構。在ASIC和PLD設計方面,向超高速、高密度、低功耗、低電壓方面發展。
外設技術與EDA工程相結合的市場前景看好,如組合超大屏幕的相關連接,多屏幕技術也有所發展。
中國自1995年以來加速開發半導體產業,先後建立了幾所設計中心,推動系列設計活動以應對亞太地區其它EDA市場的競爭。
在EDA軟體開發方面,目前主要集中在美國。但各國也正在努力開發相應的工具。日本、韓國都有ASIC設計工具,但不對外開放。中國華大集成電路設計中心,也提供IC設計軟體,但性能不是很強。相信在不久的將來會有更多更好的設計工具在各地開花並結果。據最新統計顯示,中國和印度正在成為電子設計自動化領域發展最快的兩個市場,年夏合增長率分別達到了50%和30%。
EDA技術發展迅猛,完全可以用日新月異來描述。EDA技術的應用廣泛,現在已涉及到各行各業。EDA水平不斷提高,設計工具趨於完美的地步。EDA市場日趨成熟,但我國的研發水平仍很有限,尚需迎頭趕上。
4. [請教高手]單片機怎麼實現產生隨機數
給你一個超強例子:
歡迎到卡卡空間:http://hi..com/woodking
主 題: 線性疊加偽隨機數函數
; 關 鍵 詞: 隨機數,8位單片機,random,8 bit mcu
; 參考資料: 1.<<Linear Congruential Pseudo-Random Number Generator Routines>>
; by Bruce Clark, 7 Jun 2004
; 2.<<The Art Of Computer Programming, Volume 2>>
; by Donald Knuth
;
8位單片機很多地方需要隨機數,比如游戲的洗牌,可在timer中取數,但是隨機數質
量不高。隨機數是一個既簡單又復雜的問題,這里的例子使用了眾所周知的線性疊加法,沒
有完美的方法產生隨機數,不過線性疊加法是一個合適的方法,徹底解決8位機隨機數的問
題。
偽隨機數函數總是返回可預知的數字,像拋骰子,如果拋足夠多次,那麼我們得到了一
個足夠長的數字序列,
3,1,5,1,4,6,5,4,6,5,4,5,6,1,3,2,1,6,4,6,5,4,3,2,1,3,2,1,4,2,3,1,3......
如果從序列中一個接一個的取出數字,那麼數字就看似隨機。
問題的關鍵是從這序列的哪個點(數字)開始取數?這個開始的點(數字)叫做種子。
注意,如果從相同的點(種子)開始,將會得到相同的數字,這是因為我們是從固定的序
列中取數字(所以叫偽隨機)。但這卻是一個有用的特性,我們可以每次從不同的點取數,即
改變種子!
在6502上,8位或16位隨機數是最常用的,函數返回一個32位的數字,范圍0~2^32。名
詞"線性疊加"聽起來容易范暈, 其實只涉及二個內容:乘法和加法。三個步驟:
1. 為了取得新的種子(也就是從序列開始的那個點的數字),舊的種子和一個常數A相乘,
2. 所得結果然後和第二個常數c相加。
3. 新的種子是結果的低32位(記住,這個函數返回32位數字)。保留低32位很重要,用來獲
得下一個種子。
計算公式:
種子 = A * 種子 + C
此公式在幾何圖中表示一條直線,而且新種子由舊種子反復相加得來,所以叫線性疊加。
隨機數函數的關鍵在於選擇優秀的"常數A"(也叫乘數A),其實也就是選擇了一個固定
的數字序列。"常數c",不像乘數A那樣重要,但是它一定是個奇數。事實上, c可選1,而
且這是常式所使用的,因為它會簡化計算。
注意,奇數(舊的種子)乘奇數(乘數A)是奇數,再加奇數(常數c)將會是一個偶數;偶數
(舊的種子)乘奇數(乘數A),加奇數(常數c)將會是一個奇數。如此種子將會在奇數和偶數之
間轉變。因為種子的變化足夠隨機,所以新種子的值可以作為8位或16位隨機數。
子程序F_RandomSeed,計算 "種子 = 乘數 * 種子+1" (記得,c=1)。有三個版本:
(1) 快速版本, 速度快,但佔用Rom多。
(2) 兼顧版本,速度和佔用Rom適中,空間和速度是在另外二個版本之間。
兼顧版B, 使用了另一個神奇的數字66066(10進制).
(3) 最小版本,速度慢,但佔用Rom小。
三個版本中使用的乘數1664525(10進制)=19660D(16進制),是從<<計算機程序的藝術,
第2冊>>一書中選出,這是一個神奇的數字,經過論證和測試,這個數字對產生隨機數至
關重要。想進一步研究的朋友可以閱讀原著(參考資料2),書中以特別專業的數學方法討論
了隨機數問題。這里只是應用了其中的兩個常數1664525(10進制)和69069(10進制),這里不
作討論,因為篇幅問題是借口,其實自己沒弄懂。
;==============================================================================
; 快速版本
;==============================================================================
豐收先要選好種子,育種很重要,同樣,獲得隨機種子是重要的一步。
種子變數設定在零頁RAM可以提高速度。
程序F_RandomSeed計算 1664525*種子,需要5個位元組(R_Seed0~R_Seed3,R_Temp)。
F_GeneratTables預先計算1664525*X(x=0~255),生成四個256位元組的列表T3,T2,T1,T0.
T3,X = 表T3的第X位元組 = 1664525 * X的第31~24位(X = 0 to 255)
T2,X = 表T2的第X位元組 = 1664525 * X的第23~16位(X = 0 to 255)
T1,X = 表T1的第X位元組 = 1664525 * X的第15~ 8位(X = 0 to 255)
T0,X = 表T0的第X位元組 = 1664525 * X的第 7~ 0位(X = 0 to 255)
對於單片機來說 使用1K RAM很誇張,也可以不用F_GeneratTables,直接把隨機數表存
在ROM中。
;==============================================================================
; 偽隨機數函數的線性疊加
; 計算 Seed = 1664525 * Seed + 1
;------------------------------------------------------------------------------
; 輸入:
; R_Seed0 <--- 種子0
; R_Seed1 <--- 種子1
; R_Seed2 <--- 種子2
; R_Seed3 <--- 種子3
; 回返:
; 種子0 ---> R_Seed0
; 種子1 ---> R_Seed1
; 種子2 ---> R_Seed2
; 種子3 ---> R_Seed3
; 重寫
; R_Temp
;------------------------------------------------------------------------------
; 為提高速度R_Seed0,R_Seed1,R_Seed2,R_Seed3,R_Temp選零頁Ram
; 每張列表從Rom地址 xx00h 處開始 或在Rom中
;------------------------------------------------------------------------------
; 空間: 程序58個位元組
; 列表1024個位元組
; 速度: 調用F_RandomSeed需要94個周期
;==============================================================================
F_RandomSeed:
CLC ; 計算低32位:
LDX R_Seed0 ; 1664525*($100* R_Seed1+ R_Seed0)+1
LDY R_Seed1
LDA T0,X
ADC #1
STA R_Seed0
LDA T1,X
ADC T0,Y
STA R_Seed1
LDA T2,X
ADC T1,Y
STA R_Temp
LDA T3,X
ADC T2,Y
TAY ; 把位元組3留在Y中
CLC ; 加低32位:
LDX R_Seed2 ; 1664525*($10000* R_Seed2)
LDA R_Temp
ADC T0,X
STA R_Seed2
TYA
ADC T1,X
CLC
LDX R_Seed3 ; 加低32位:
ADC T0,X ; 1664525*($1000000* R_Seed3)
STA R_Seed3
rts
;==============================================================================
; 產生T0,T1,T2和T3列表,使用F_GeneratTables,列表在ram中
;==============================================================================
F_GeneratTables:
LDX #0 ;1664525*0=0
STX T0
STX T1
STX T2
STX T3
INX
CLC
L_GT1:
LDA T0-1,X ;把1664525加入
ADC #$0D ;位元組0
STA T0,X
LDA T1-1,X
ADC #$66 ;位元組1
STA T1,X
LDA T2-1,X
ADC #$19 ;位元組2
STA T2,X
LDA T3-1,X
ADC #$00 ;位元組3
STA T3,X
INX ;進位C=0退出
BNE L_GT1
RTS
;------------------------------------------------------------------------------
; 生成的列表,如果不要F_GeneratTables,可以直接將此表放在Rom中
;------------------------------------------------------------------------------
;1664525 * X的第31~24位(X = 0 to 255)
T3:
.DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$01,$01,$01,$01,$01
.DB $01,$01,$01,$01,$01,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$03
.DB $03,$03,$03,$03,$03,$03,$03,$03,$03,$04,$04,$04,$04,$04,$04,$04
.DB $04,$04,$04,$05,$05,$05,$05,$05,$05,$05,$05,$05,$05,$06,$06,$06
.DB $06,$06,$06,$06,$06,$06,$06,$07,$07,$07,$07,$07,$07,$07,$07,$07
.DB $07,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$09,$09,$09,$09,$09
.DB $09,$09,$09,$09,$09,$0A,$0A,$0A,$0A,$0A,$0A,$0A,$0A,$0A,$0A,$0B
.DB $0B,$0B,$0B,$0B,$0B,$0B,$0B,$0B,$0B,$0C,$0C,$0C,$0C,$0C,$0C,$0C
.DB $0C,$0C,$0C,$0C,$0D,$0D,$0D,$0D,$0D,$0D,$0D,$0D,$0D,$0D,$0E,$0E
.DB $0E,$0E,$0E,$0E,$0E,$0E,$0E,$0E,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F
.DB $0F,$0F,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$11,$11,$11,$11
.DB $11,$11,$11,$11,$11,$11,$12,$12,$12,$12,$12,$12,$12,$12,$12,$12
.DB $13,$13,$13,$13,$13,$13,$13,$13,$13,$13,$14,$14,$14,$14,$14,$14
.DB $14,$14,$14,$14,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$16,$16
.DB $16,$16,$16,$16,$16,$16,$16,$16,$17,$17,$17,$17,$17,$17,$17,$17
.DB $17,$17,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$19,$19,$19,$19
;1664525 * X的第23~16位(X = 0 to 255)
T2:
.DB $00,$19,$32,$4C,$65,$7E,$98,$B1,$CB,$E4,$FD,$17,$30,$4A,$63,$7C
.DB $96,$AF,$C9,$E2,$FB,$15,$2E,$48,$61,$7A,$94,$AD,$C7,$E0,$F9,$13
.DB $2C,$46,$5F,$78,$92,$AB,$C5,$DE,$F7,$11,$2A,$44,$5D,$76,$90,$A9
.DB $C3,$DC,$F5,$0F,$28,$42,$5B,$74,$8E,$A7,$C1,$DA,$F3,$0D,$26,$40
.DB $59,$72,$8C,$A5,$BF,$D8,$F1,$0B,$24,$3E,$57,$70,$8A,$A3,$BD,$D6
.DB $EF,$09,$22,$3C,$55,$6E,$88,$A1,$BB,$D4,$ED,$07,$20,$3A,$53,$6C
.DB $86,$9F,$B9,$D2,$EB,$05,$1E,$38,$51,$6A,$84,$9D,$B7,$D0,$E9,$03
.DB $1C,$36,$4F,$68,$82,$9B,$B5,$CE,$E7,$01,$1A,$34,$4D,$66,$80,$99
.DB $B3,$CC,$E5,$FF,$18,$32,$4B,$64,$7E,$97,$B1,$CA,$E3,$FD,$16,$30
.DB $49,$62,$7C,$95,$AE,$C8,$E1,$FB,$14,$2D,$47,$60,$7A,$93,$AC,$C6
.DB $DF,$F9,$12,$2B,$45,$5E,$78,$91,$AA,$C4,$DD,$F7,$10,$29,$43,$5C
.DB $76,$8F,$A8,$C2,$DB,$F5,$0E,$27,$41,$5A,$74,$8D,$A6,$C0,$D9,$F3
.DB $0C,$25,$3F,$58,$72,$8B,$A4,$BE,$D7,$F1,$0A,$23,$3D,$56,$70,$89
.DB $A2,$BC,$D5,$EF,$08,$21,$3B,$54,$6E,$87,$A0,$BA,$D3,$ED,$06,$1F
.DB $39,$52,$6C,$85,$9E,$B8,$D1,$EB,$04,$1D,$37,$50,$6A,$83,$9C,$B6
.DB $CF,$E9,$02,$1B,$35,$4E,$68,$81,$9A,$B4,$CD,$E7,$00,$19,$33,$4C
;1664525 * X的第15~ 8位(X = 0 to 255)
T1:
.DB $00,$66,$CC,$32,$98,$FE,$64,$CA,$30,$96,$FC,$62,$C8,$2E,$94,$FA
.DB $60,$C6,$2C,$92,$F9,$5F,$C5,$2B,$91,$F7,$5D,$C3,$29,$8F,$F5,$5B
.DB $C1,$27,$8D,$F3,$59,$BF,$25,$8B,$F2,$58,$BE,$24,$8A,$F0,$56,$BC
.DB $22,$88,$EE,$54,$BA,$20,$86,$EC,$52,$B8,$1E,$84,$EB,$51,$B7,$1D
.DB $83,$E9,$4F,$B5,$1B,$81,$E7,$4D,$B3,$19,$7F,$E5,$4B,$B1,$17,$7E
.DB $E4,$4A,$B0,$16,$7C,$E2,$48,$AE,$14,$7A,$E0,$46,$AC,$12,$78,$DE
.DB $44,$AA,$10,$77,$DD,$43,$A9,$0F,$75,$DB,$41,$A7,$0D,$73,$D9,$3F
.DB $A5,$0B,$71,$D7,$3D,$A3,$09,$70,$D6,$3C,$A2,$08,$6E,$D4,$3A,$A0
.DB $06,$6C,$D2,$38,$9E,$04,$6A,$D0,$36,$9C,$03,$69,$CF,$35,$9B,$01
.DB $67,$CD,$33,$99,$FF,$65,$CB,$31,$97,$FD,$63,$C9,$2F,$95,$FC,$62
.DB $C8,$2E,$94,$FA,$60,$C6,$2C,$92,$F8,$5E,$C4,$2A,$90,$F6,$5C,$C2
.DB $28,$8E,$F5,$5B,$C1,$27,$8D,$F3,$59,$BF,$25,$8B,$F1,$57,$BD,$23
.DB $89,$EF,$55,$BB,$21,$88,$EE,$54,$BA,$20,$86,$EC,$52,$B8,$1E,$84
.DB $EA,$50,$B6,$1C,$82,$E8,$4E,$B4,$1A,$81,$E7,$4D,$B3,$19,$7F,$E5
.DB $4B,$B1,$17,$7D,$E3,$49,$AF,$15,$7B,$E1,$47,$AD,$13,$7A,$E0,$46
.DB $AC,$12,$78,$DE,$44,$AA,$10,$76,$DC,$42,$A8,$0E,$74,$DA,$40,$A6
;1664525 * X的第 7~ 0位(X = 0 to 255)
T0:
.DB $00,$0D,$1A,$27,$34,$41,$4E,$5B,$68,$75,$82,$8F,$9C,$A9,$B6,$C3
.DB $D0,$DD,$EA,$F7,$04,$11,$1E,$2B,$38,$45,$52,$5F,$6C,$79,$86,$93
.DB $A0,$AD,$BA,$C7,$D4,$E1,$EE,$FB,$08,$15,$22,$2F,$3C,$49,$56,$63
.DB $70,$7D,$8A,$97,$A4,$B1,$BE,$CB,$D8,$E5,$F2,$FF,$0C,$19,$26,$33
.DB $40,$4D,$5A,$67,$74,$81,$8E,$9B,$A8,$B5,$C2,$CF,$DC,$E9,$F6,$03
.DB $10,$1D,$2A,$37,$44,$51,$5E,$6B,$78,$85,$92,$9F,$AC,$B9,$C6,$D3
.DB $E0,$ED,$FA,$07,$14,$21,$2E,$3B,$48,$55,$62,$6F,$7C,$89,$96,$A3
.DB $B0,$BD,$CA,$D7,$E4,$F1,$FE,$0B,$18,$25,$32,$3F,$4C,$59,$66,$73
.DB $80,$8D,$9A,$A7,$B4,$C1,$CE,$DB,$E8,$F5,$02,$0F,$1C,$29,$36,$43
.DB $50,$5D,$6A,$77,$84,$91,$9E,$AB,$B8,$C5,$D2,$DF,$EC,$F9,$06,$13
.DB $20,$2D,$3A,$47,$54,$61,$6E,$7B,$88,$95,$A2,$AF,$BC,$C9,$D6,$E3
.DB $F0,$FD,$0A,$17,$24,$31,$3E,$4B,$58,$65,$72,$7F,$8C,$99,$A6,$B3
.DB $C0,$CD,$DA,$E7,$F4,$01,$0E,$1B,$28,$35,$42,$4F,$5C,$69,$76,$83
.DB $90,$9D,$AA,$B7,$C4,$D1,$DE,$EB,$F8,$05,$12,$1F,$2C,$39,$46,$53
.DB $60,$6D,$7A,$87,$94,$A1,$AE,$BB,$C8,$D5,$E2,$EF,$FC,$09,$16,$23
.DB $30,$3D,$4A,$57,$64,$71,$7E,$8B,$98,$A5,$B2,$BF,$CC,$D9,$E6,$F3
;==============================================================================
; 最小版本
;==============================================================================
對於單片機來說,使用1K RAM或rom來完成一個隨機數,是很浪費的,以下是最小版本,
但是程序執行周期長。程序每次計算所需要的列表值。
;==============================================================================
; 線性疊加偽隨機數函數
; 計算 R_Seed=1664525 * R_Seed + 1
;------------------------------------------------------------------------------
; 輸入:
; R_Seed0 <--- 種子0
; R_Seed1 <--- 種子1
; R_Seed2 <--- 種子2
; R_Seed3 <--- 種子3
; 回返:
; 種子0 ---> R_Seed0
; 種子1 ---> R_Seed1
; 種子2 ---> R_Seed2
; 種子3 ---> R_Seed3
; 重寫
; R_Temp,R_Temp+1,R_Temp+2,R_Temp+3
; 注意
; R_Temp~R_Temp+3 和 L_Rand6 是高位元組在前,低位元組在後
;------------------------------------------------------------------------------
; 空間: 53個位元組
; 速度: 調用F_RandomSeed平均2744個周期
; 1624+70* N(N=種子數) = 1624~3864個周期
;==============================================================================
F_RandomSeed:
LDA #1 ; R_Temp=1,需要給定初始值
LDX #3
L_Rand1 STA R_Temp,X
LSR
DEX
BPL L_Rand1
LDY #$20 ; 計算種子 = 種子 * L_Rand4+ R_Temp
BNE L_Rand5 ; 總是分支
L_Rand2 BCC L_Rand4 ; 如果零被移位,分支
CLC ; 把乘數加入乘積
LDX #3
L_Rand3 LDA R_Temp,X
ADC T_Rand6,X ;源碼有誤,已改正
STA R_Temp,X
DEX
BPL L_Rand3
L_Rand4 ROR R_Temp ; 右移結果
ROR R_Temp+1
ROR R_Temp+2
ROR R_Temp+3
L_Rand5 ROR R_Seed3 ; 右移種子
ROR R_Seed2
ROR R_Seed1
ROR R_Seed0
DEY
BPL L_Rand2
RTS
T_Rand6 .DB $00,$19,$66,$0D ;乘數(高位元組在前)
;==============================================================================
; 兼顧版本 乘數1664525(10進制)
;==============================================================================
兼顧版本 是不用上面的循環加來做乘法,而是在必要的時候加上 種子,$100* 種子,
$10000* 種子,來獲得數字序列,這樣能夠提高速度,又不增加太多代碼。
分解公式表
b7 b6 b5 b4 b3 b2 b1 b0
$0D = 0 0 0 0 1 1 0 1 b ---> +種子
$66 = 0 1 1 0 0 1 1 0 b ---> *$100h
$19 = 0 0 0 1 1 0 0 1 b ---> *$10000h
$00 = 0 0 0 0 0 0 0 0 b --->
| | | | | | | |
| | | | | | | |
V V V V V V V V
左 左 左 左 左 左
移 移 移 移 移 移
6 5 4 3 2 1
位 位 位 位 位 位
那麼 種子*bit0 時,種子*$10000+種子
種子*bit1 時,種子*$100, 左移1位
種子*bit2 時,種子*$100+種子, 左移2位
種子*bit3 時,種子*$10000+種子,左移3位
種子*bit4 時,種子*$10000, 左移4位
種子*bit5 時,種子*$100, 左移5位
種子*bit6 時,種子*$100, 左移6位
;==============================================================================
; 偽隨機數函數的線性疊加
; 計算 R_Seed=1664525 * R_Seed + 1
;------------------------------------------------------------------------------
; 輸入:
; R_Seed0 <--- 種子0
; R_Seed1 <--- 種子1
; R_Seed2 <--- 種子2
; R_Seed3 <--- 種子3
; 回返:
; 種子0 ---> R_Seed0
; 種子1 ---> R_Seed1
; 種子2 ---> R_Seed2
; 種子3 ---> R_Seed3
; 重寫
; R_Temp,R_Temp+1,R_Temp+2,R_Temp+3
;-------------------------------------------------------------------------------
; 空間: 106個位元組
; 速度: F_RandomSeed 517個周期
;===============================================================================
F_RandomSeed:
CLC ; 復制種子進入R_Temp
LDA R_Seed0 ; 計算 種子 = 種子 *$10000+ 種子 +1
STA R_Temp
ADC #1
STA R_Seed0
LDA R_Seed1
STA R_Temp+1
ADC #0
STA R_Seed1
LDA R_Seed2
STA R_Temp+2
ADC R_Temp
STA R_Seed2
LDA R_Seed3
STA R_Temp+3
ADC R_Temp+1
STA R_Seed3
;-------------------------------------------------
;因為$0019660D 的Bit7=0,所以只需6次移位
;-------------------------------------------------
LDY #5
L_Rand1 ASL R_Temp ; 左移舊的種子
ROL R_Temp+1
ROL R_Temp+2
ROL R_Temp+3
;-------------------------------------------------
; 從 L_Rand4 列表取得 X, 4個索引值對應4種情況,數值選的巧妙!
; X=$00, 種子 = 種子 +$10000* R_Temp
; X=$01, 種子 = 種子 +$100 * R_Temp
; X=$FE, 種子 = 種子 +$10000* R_Temp+ R_Temp
; X=$FF, 種子 = 種子 +$100 * R_Temp+ R_Temp
;-------------------------------------------------
LDX L_Rand4,Y
BPL L_Rand2 ; 分支如果 X=$00 或 X=$01
CLC ; 種子 = 種子 +R_Temp
LDA R_Seed0
ADC R_Temp
STA R_Seed0
LDA R_Seed1
ADC R_Temp+1
STA R_Seed1
LDA R_Seed2
ADC R_Temp+2
STA R_Seed2
LDA R_Seed3
ADC R_Temp+3
STA R_Seed3
INX ; $ FE->$00,$ FF->$01
INX
L_Rand2 CLC
BEQ L_Rand3 ; 如果 X=$00, 種子 =種子 + R_Temp*$10000
LDA R_Seed1 ; 種子 = 種子 + R_Temp*$100
ADC R_Temp
STA R_Seed1
L_Rand3 LDA R_Seed2
ADC R_Temp,X
STA R_Seed2
LDA R_Seed3
ADC R_Temp+1,X
STA R_Seed3
DEY
BPL L_Rand1
RTS
L_Rand4 .DB $01,$01,$00,$FE,$FF,$01
;==============================================================================
; 改進的 兼顧版本B 選擇新的 乘數=69069(10進制)
;==============================================================================
兼顧版本B中, 用69069(10進制)替換1664525(10進制)作乘數,也就是說,選擇了另外一
個數字序列,這個乘數也是<<計算機程序的藝術,第2冊>>一書中選出,經過論證和測試,
這個數字雖不及1664525做乘數好,但也是個神奇的數字,而且可以進一步減小程序時間。
;===============================================================================
; 偽隨機數函數的線性疊加
; 計算種子 = 種子 * 69069 + 1
;-------------------------------------------------------------------------------
; 輸入:
; R_Seed0 <--- 種子0
; R_Seed1 <--- 種子1
; R_Seed2 <--- 種子2
; R_Seed3 <--- 種子3
; 回返:
; 種子0 ---> R_Seed0
; 種子1 ---> R_Seed1
; 種子2 ---> R_Seed2
; 種子3 ---> R_Seed3
; 重寫
; R_Temp,R_Temp+1,R_Temp+2,R_Temp+3
;--------------------------------------------------------------------------------
; 空間: 173個位元組
; 速度: F_RandomSeed 326個周期
;================================================================================
F_RandomSeed:
LDA R_Seed0 ; R_Temp= 種子 *2
ASL
STA R_Temp
LDA R_Seed1
ROL
STA R_Temp+1
LDA R_Seed2
ROL
STA R_Temp+2
LDA R_Seed3
ROL
STA R_Temp+3
CLC ; R_Temp= R_Temp+ 種子 (= 種子 *3)
LDA R_Seed0
ADC R_Temp
STA R_Temp
LDA R_Seed1
ADC R_Temp+1
STA R_Temp+1
LDA R_Seed2
ADC R_Temp+2
STA R_Temp+2
LDA R_Seed3
ADC R_Temp+3
STA R_Temp+3
CLC ; 種子 = 種子 +$10000* 種子
LDA R_Seed2
ADC R_Seed0
TAX ; 把位元組2保存在X中(利於提高速度)
LDA R_Seed3
ADC R_Seed1
TAY ; 把位元組3保存在Y中
CLC ; 種子 = 種子 +$100* 種子
LDA R_Seed1
ADC R_Seed0
PHA ; 壓入堆棧位元組1
TXA
ADC R_Seed1
TAX
TYA
ADC R_Seed2
TAY
LDA R_Temp ; R_Temp= R_Temp*4(= 舊種子 *$0C)
ASL
ROL R_Temp+1
ROL R_Temp+2
ROL R_Temp+3
ASL
ROL R_Temp+1
ROL R_Temp+2
ROL R_Temp+3
STA R_Temp
CLC ; 種子 = 種子 +R_Temp
ADC R_Seed0
STA R_Seed0
PLA ; 彈出堆棧的位元組1
ADC R_Temp+1
STA R_Seed1
TXA
ADC R_Temp+2
TAX
TYA
ADC R_Temp+3
TAY
CLC
LDA R_Temp ; 種子 = 種子 + R_Temp*$100
ADC R_Seed1
STA R_Seed1