CPU與lpm_ROM連接)
1. 項目概述這不是一次普通實驗而是理解計算機底層運行邏輯的“開光儀式”西電計組實驗一 存儲器實驗這個名字聽起來平平無奇但對西安電子科技大學(xué)計算機學(xué)院的學(xué)生來說它幾乎是整個《計算機組成原理》課程的“第一道門檻”。我?guī)н^三屆計科和軟工專業(yè)的實驗課每年開學(xué)第一周實驗室里最常聽到的不是“老師這個波形不對”而是“老師ROM地址線接反了CPU怎么就跑飛了”——這恰恰說明這個實驗遠不止是“把lpm_ROM模塊例化一下、連幾根線”那么簡單。它本質(zhì)上是一次微型的硬件系統(tǒng)構(gòu)建實踐核心是存儲器與CPU的連接而載體是FPGA開發(fā)板通常是Altera/Intel Cyclone系列比如DE2-115或類似平臺。實驗中用到的lpm_ROM是Quartus II或新版Intel Quartus Prime提供的參數(shù)化宏功能模塊它不是一塊物理芯片而是一個可配置的、固化數(shù)據(jù)的邏輯單元其行為完全由你寫入的.mifMemory Initialization File文件決定。這意味著你寫的每一行匯編指令、每一個數(shù)據(jù)字節(jié)都會直接映射到FPGA內(nèi)部的查找表LUT資源上最終變成可被CPU取指、讀數(shù)的“真實”存儲空間。所以這個實驗解決的不是“能不能點亮LED”的問題而是“指令如何從存儲器流向控制器、數(shù)據(jù)如何在總線上傳輸、時序如何保證不沖突”這一整套底層機制。它適合所有剛接觸硬件描述語言Verilog/VHDL和數(shù)字電路設(shè)計的本科生尤其適合那些在課堂上聽懂了“MAR、MDR、PC、IR”卻始終無法在腦中構(gòu)建出它們之間物理連接的同學(xué)。如果你正為西電計組課設(shè)發(fā)愁或者想搞懂“以存儲器為中心的雙總線結(jié)構(gòu)CPU能不能通過系統(tǒng)總線和內(nèi)存直接交換數(shù)據(jù)”這類問題那么這個實驗就是你親手拆解CPU工作流程的第一把螺絲刀。2. 整體設(shè)計思路與方案選型為什么必須用FPGA而不是仿真軟件2.1 為什么選擇FPGA作為實驗平臺很多人會疑惑既然只是做存儲器實驗用ModelSim仿真不就完事了何必折騰FPGA答案藏在“真實感”三個字里。仿真軟件如ModelSim能完美驗證你的Verilog代碼邏輯是否正確但它永遠無法模擬出信號在真實PCB走線上產(chǎn)生的延時、驅(qū)動能力不足導(dǎo)致的波形畸變、電源噪聲對靜態(tài)時序的影響。舉個最典型的例子在仿真里你給ROM的地址線賦值addr 4b0001下一個時鐘沿數(shù)據(jù)線q就立刻輸出對應(yīng)值。但在FPGA上如果地址線布線過長、扇出過大或者你沒加適當?shù)腎O約束實際到達ROM模塊輸入端的addr信號可能比時鐘晚幾個納秒這就導(dǎo)致“讀取錯地址”的硬傷。而這個錯誤在仿真里根本不會出現(xiàn)。西電計組實驗強調(diào)“硬件思維”就是要你直面這些物理世界的限制。FPGA開發(fā)環(huán)境Quartus DE2-115板卡提供了完整的“設(shè)計—綜合—布局布線—下載—調(diào)試”閉環(huán)讓你第一次體會到代碼寫得再漂亮如果時序不滿足Timing Violation板子就是不工作。這正是工業(yè)界硬件工程師每天面對的真實戰(zhàn)場。所以這個實驗的設(shè)計起點就是放棄“純邏輯正確”的幻想擁抱“物理可實現(xiàn)”的現(xiàn)實。2.2 為什么選用lpm_ROM而非自建ROMlpm_ROM是Intel FPGA工具鏈提供的一個高度優(yōu)化的IP核。它的優(yōu)勢在于“開箱即用”和“資源可控”。你不需要從零開始用寄存器堆Register File或分布式RAMDistributed RAM去搭建一個ROM只需在Quartus中調(diào)用lpm_ROM宏設(shè)置好數(shù)據(jù)位寬data_width、地址位寬address_width和初始化文件.mif工具就會自動為你生成最優(yōu)的硬件實現(xiàn)——小容量用LUT實現(xiàn)大容量則自動映射到片上Block RAM。更重要的是lpm_ROM的接口極其簡潔只有address、q輸出數(shù)據(jù)和clk可選同步使能三根關(guān)鍵信號。這極大地降低了初學(xué)者的入門門檻讓你能把全部精力聚焦在“CPU如何訪問它”這個核心問題上而不是被復(fù)雜的存儲器控制邏輯如WE#寫使能、OE#輸出使能所淹沒。當然它的局限性也很明顯內(nèi)容是只讀的、不可在線修改。但這恰恰符合“程序存儲器”的本質(zhì)——指令一旦燒錄就不該被運行時篡改。如果你后續(xù)要做西電計組課設(shè)基本模型機你會發(fā)現(xiàn)所有指令都固化在lpm_ROM里CPU的PC程序計數(shù)器就像一個指針在這個ROM空間里順序跳轉(zhuǎn)這才是馮·諾依曼體系最本真的模樣。2.3 整體架構(gòu)一個極簡但完整的“CPU-存儲器”系統(tǒng)整個實驗的頂層框圖可以濃縮為三個核心模塊CPU控制器、lpm_ROM存儲器和總線互連網(wǎng)絡(luò)。這里的“CPU控制器”并非一個完整的CPU而是一個精簡版的有限狀態(tài)機FSM它負責(zé)產(chǎn)生讀取存儲器所需的全部控制信號MEMR存儲器讀、ADDR地址總線、DATA_IN數(shù)據(jù)輸入總線用于接收ROM返回的數(shù)據(jù)。lpm_ROM則扮演“被動響應(yīng)者”的角色它只認address和clk當address有效且穩(wěn)定后在下一個時鐘沿將對應(yīng)地址的數(shù)據(jù)送到q輸出端。而“總線互連網(wǎng)絡(luò)”則是整個系統(tǒng)的血脈它由三組并行總線構(gòu)成地址總線Address Bus、數(shù)據(jù)總線Data Bus和控制總線Control Bus。地址總線寬度決定了你能訪問多大的存儲空間例如8位地址線256字節(jié)數(shù)據(jù)總線寬度決定了每次能讀/寫多少位數(shù)據(jù)通常為8位或16位控制總線則傳遞MEMR等關(guān)鍵命令。這個架構(gòu)看似簡單但它已經(jīng)完整復(fù)現(xiàn)了“以存儲器為中心的雙總線結(jié)構(gòu)CPU”的雛形CPU通過地址總線發(fā)出請求通過控制總線發(fā)出讀命令存儲器通過數(shù)據(jù)總線返回結(jié)果。所有信號都在嚴格的時序約束下協(xié)同工作任何一根線接錯、任何一個時序參數(shù)設(shè)錯整個系統(tǒng)就會癱瘓。這正是西電計組實驗的精髓所在——它用最小的硬件代價逼你建立起對“時序”和“接口協(xié)議”的敬畏之心。3. 核心細節(jié)解析與實操要點從.mif文件到引腳約束每一步都是坑3.1 .mif文件存儲器的“靈魂”格式與內(nèi)容必須零容錯.mifMemory Initialization File文件是lpm_ROM的“食譜”它定義了ROM里每個地址存放什么數(shù)據(jù)。它的語法非常嚴格稍有不慎Quartus就會報錯而且錯誤提示往往晦澀難懂。一個標準的.mif文件包含四個關(guān)鍵部分DEPTH深度即地址數(shù)量、WIDTH寬度即數(shù)據(jù)位寬、ADDRESS_RADIX地址進制和DATA_RADIX數(shù)據(jù)進制最后是CONTENT BEGIN ... END塊。例如一個8位寬、16個地址的ROM其.mif文件開頭必須是DEPTH 16; WIDTH 8; ADDRESS_RADIX HEX; DATA_RADIX HEX; CONTENT BEGIN 00 : 0A; -- 地址0x00存放數(shù)據(jù)0x0A 01 : 1B; -- 地址0x01存放數(shù)據(jù)0x1B ... END;提示ADDRESS_RADIX和DATA_RADIX必須明確指定不能省略。很多同學(xué)習(xí)慣用十進制寫地址但Quartus默認是HEX如果不聲明會導(dǎo)致地址映射完全錯亂。更隱蔽的坑是空格和分號00 : 0A后面必須有分號CONTENT BEGIN和END必須頂格寫前面不能有任何空格或Tab。我見過太多人因為復(fù)制粘貼時帶入了不可見的Unicode字符如全角空格導(dǎo)致綜合失敗查了兩小時才發(fā)現(xiàn)問題出在編輯器的編碼格式上。3.2 lpm_ROM模塊例化參數(shù)配置是成敗的關(guān)鍵在Verilog中例化lpm_ROM絕不是簡單地復(fù)制粘貼一個模板。最關(guān)鍵的參數(shù)是.lpm_widthad()地址位寬和.lpm_width()數(shù)據(jù)位寬它們必須與你的.mif文件中的DEPTH和WIDTH嚴格一致。計算公式是lpm_widthad log2(DEPTH)。例如DEPTH16則lpm_widthad4DEPTH256則lpm_widthad8。如果這里填錯比如把lpm_widthad4寫成lpm_widthad3那么ROM只會識別低3位地址高1位被忽略導(dǎo)致所有地址0x00-0x07和0x08-0x0F讀取到相同的數(shù)據(jù)整個存儲空間就“折疊”了。另一個易錯點是.lpm_file()參數(shù)它指向.mif文件的路徑。這個路徑必須是相對于當前工程文件.qpf的相對路徑且不能包含中文或空格。最佳實踐是把.mif文件放在工程根目錄下然后寫成.lpm_file(rom_init.mif)。此外q輸出數(shù)據(jù)信號的位寬必須與.lpm_width()完全匹配否則在頂層模塊連接時會報“位寬不匹配”的錯誤而這個錯誤有時會被綜合器靜默忽略導(dǎo)致功能異常。3.3 引腳約束Pin Assignment讓FPGA“認識”你的物理按鍵和LED這是FPGA開發(fā)中最容易被忽視卻最致命的一環(huán)。Quartus綜合出來的邏輯只是一個抽象的網(wǎng)表它不知道哪個KEY[0]信號對應(yīng)板子上的SW0撥碼開關(guān)也不知道哪個LED[7:0]對應(yīng)D8-D1這排LED。這一切都靠引腳約束文件.qsf來告訴工具。西電常用的DE2-115板卡其用戶手冊User Manual里有一張詳盡的“Pin Table”列出了每個物理引腳對應(yīng)的信號名如KEY[0]對應(yīng)PIN_W15。你必須在.qsf文件中用set_location_assignment命令將你的Verilog信號名精確地綁定到這些物理引腳上。例如set_location_assignment PIN_W15 -to KEY[0] set_location_assignment PIN_V16 -to LED[0]注意-to后面跟的是你在Verilog里定義的信號名不是端口名。如果你在頂層模塊里把按鍵信號命名為sw_in那么這里就必須寫-to sw_in。一個常見的錯誤是把KEY[0]直接當成信號名寫進約束而忽略了自己代碼里的命名。此外IO標準IO Standard也必須設(shè)置正確比如3.3-V LVTTL否則即使引腳連對了電平也不匹配LED就是不亮。我建議新手先用板卡自帶的“Hello World”例程如按鍵控制LED成功跑通后再移植自己的存儲器邏輯這樣可以排除引腳約束本身的干擾。4. 實操過程與核心環(huán)節(jié)實現(xiàn)手把手帶你完成從零到點亮的全過程4.1 環(huán)境準備與工程創(chuàng)建避開Quartus版本陷阱西電實驗室普遍使用Quartus II 13.0 SP1或更新的Quartus Prime Lite Edition。這里有個關(guān)鍵提醒不要用最新版Quartus Prime去打開老版本的工程文件.qpf。新版本工具會對舊工程進行“升級”這個過程不可逆且升級后的工程在老版本Quartus上無法打開。如果你從學(xué)長那里拿到一個基于Quartus II 13.0的工程務(wù)必用同版本軟件打開。創(chuàng)建新工程的步驟如下1File → New Project Wizard2選擇工程路徑強烈建議路徑全英文、無空格、無中文3在“Device Family”中選擇Cyclone IV E對應(yīng)DE2-1154在“Available Devices”中選擇具體型號EP4CE115F23C75完成向?qū)А?chuàng)建完成后立即在Project菜單下點擊“Add New File”添加一個Verilog HDL File命名為top.v這就是你的頂層模塊。記住頂層模塊的端口列表必須與你將要使用的開發(fā)板的物理接口完全一致包括KEY、SW、LED、HEX0等一個都不能少哪怕你暫時不用。4.2 頂層模塊設(shè)計總線信號的“翻譯官”頂層模塊top.v的核心任務(wù)是充當CPU控制器和lpm_ROM之間的“翻譯官”。它接收來自CPU控制器的狀態(tài)信號如state根據(jù)當前狀態(tài)生成ROM所需的address和memr信號并將ROM返回的q數(shù)據(jù)打包成CPU能理解的data_out。一個典型的頂層結(jié)構(gòu)如下module top( input clk, input rst_n, input [3:0] state, // CPU狀態(tài)機狀態(tài) output reg [7:0] data_out, // CPU數(shù)據(jù)總線輸出 output reg [3:0] addr_out, // ROM地址總線輸出 output reg memr // ROM讀使能 ); wire [7:0] rom_q; // 實例化lpm_ROM lpm_rom_1 uut_rom ( .address(addr_out), .q(rom_q), .clock(clk) ); // 根據(jù)state生成addr_out和memr always (posedge clk or negedge rst_n) begin if (!rst_n) begin addr_out 4h0; memr 1b0; end else begin case (state) 4b0001: begin // 取指階段 addr_out pc_reg; // PC寄存器值作為地址 memr 1b1; // 發(fā)起讀請求 end 4b0010: begin // 執(zhí)行階段 addr_out 4h0; // 可能讀取數(shù)據(jù)區(qū) memr 1b1; end default: begin addr_out 4h0; memr 1b0; end endcase end end // 將ROM數(shù)據(jù)輸出到CPU總線 assign data_out rom_q; endmodule這段代碼的關(guān)鍵在于always塊里的case語句。它清晰地展示了CPU狀態(tài)機如何驅(qū)動存儲器訪問在“取指”狀態(tài)4b0001addr_out被賦予程序計數(shù)器pc_reg的值同時拉高memr告訴ROM“我要讀指令”在“執(zhí)行”狀態(tài)4b0010addr_out可能切換到數(shù)據(jù)區(qū)地址再次發(fā)起讀操作。data_out則直接連接rom_q完成了數(shù)據(jù)的“搬運”。這個設(shè)計就是“存儲器與cpu的連接”最直觀的體現(xiàn)。4.3 時序約束與Timing Analysis讓系統(tǒng)真正“跑起來”FPGA開發(fā)的終極考驗不是功能正確而是時序收斂。當你點擊“Start Compilation”后Quartus會進行“Timing Analysis”。如果報告里出現(xiàn)紅色的“Critical Warning: Setup Time Violation”那就意味著你的設(shè)計在目標頻率下無法穩(wěn)定工作。對于存儲器實驗最常見的時序問題是address信號到達ROM輸入端的時間晚于clk信號的上升沿。解決方案有兩個1降低系統(tǒng)時鐘頻率。在Assignment → Settings → Device → Clock Settings中將主時鐘如CLOCK_50的頻率從50MHz改為10MHz這能大幅緩解時序壓力2添加IO約束。在.qsf文件中為addr_out信號添加輸出延遲約束set_output_delay -max 2.0 -clock clk [get_ports {addr_out[3:0]}]這條命令告訴工具“addr_out信號的最晚有效時間不能超過clk上升沿后2納秒”。這相當于給信號傳輸預(yù)留了緩沖時間。實測下來對于DE2-115板卡將時鐘降至10MHz并為關(guān)鍵總線添加±1ns的IO約束就能讓絕大多數(shù)存儲器實驗穩(wěn)定運行。記住時序分析不是可選項而是必選項。一個沒有通過Timing Analysis的設(shè)計就像一輛沒有經(jīng)過碰撞測試的汽車外表完好但上路就是風(fēng)險。4.4 下載與調(diào)試用SignalTap II抓取“看不見”的信號代碼編譯通過不代表板子就能工作。此時你需要用SignalTap II Logic Analyzer集成在Quartus中來“看見”FPGA內(nèi)部的信號。它的原理是在FPGA布局布線時悄悄地在你指定的信號路徑上插入一個小型的采樣邏輯單元將信號波形實時捕獲并傳回PC。這對于調(diào)試存儲器實驗至關(guān)重要。例如當你發(fā)現(xiàn)LED不按預(yù)期亮起可以同時抓取addr_out、memr和rom_q三個信號。如果addr_out一直在變化但rom_q始終為0那問題一定出在.mif文件或lpm_ROM例化上如果addr_out和memr都正常但rom_q沒有變化那就要檢查rom_q是否被正確連接到頂層的data_out或者data_out的引腳約束是否正確。SignalTap II的采樣深度有限通常為16K點所以要合理設(shè)置觸發(fā)條件比如設(shè)置memr的上升沿為觸發(fā)這樣就能精準捕獲每一次讀操作的全過程。這是我?guī)W(xué)生時反復(fù)強調(diào)的不要靠猜要用儀器看。一個合格的硬件工程師必須熟練掌握SignalTap II、Chip Planner查看資源分布和TimeQuest深入分析時序路徑這三大神器。5. 常見問題與排查技巧實錄那些年我們踩過的“經(jīng)典”深坑5.1 “ROM讀出來全是0”初始化文件與例化的雙重校驗這個問題堪稱西電計組實驗的“頭號殺手”?,F(xiàn)象是無論addr_out怎么變rom_q輸出永遠是0。排查步驟必須按順序進行1檢查.mif文件用記事本打開確認CONTENT BEGIN塊里確實有非零數(shù)據(jù)且地址范圍覆蓋了你的addr_out最大值2檢查lpm_ROM例化參數(shù)確認.lpm_file()路徑正確.lpm_widthad()和.lpm_width()與.mif文件的DEPTH和WIDTH完全匹配3檢查Quartus Messages窗口在Compilation Report里找到“Analysis Synthesis”部分看是否有“Warning: Cannot find file xxx.mif”之類的提示這說明路徑錯了4終極驗證在Quartus中右鍵點擊lpm_ROM實例 → “Properties” → “Simulation” → “Read MIF File”如果彈出對話框顯示“Successfully read mif file”說明文件被正確加載。我曾經(jīng)幫一個學(xué)生debug發(fā)現(xiàn)他的.mif文件里DATA_RADIX BIN但數(shù)據(jù)卻寫了0A十六進制導(dǎo)致所有數(shù)據(jù)都被解釋為二進制00001010也就是十進制10看起來像0。根源在于進制聲明不一致。5.2 “LED閃爍無規(guī)律”時序沖突與異步復(fù)位的陷阱現(xiàn)象是LED隨機亮滅毫無邏輯。這幾乎100%是異步復(fù)位rst_n未正確同步導(dǎo)致的。FPGA內(nèi)部的寄存器對復(fù)位信號的建立/保持時間Setup/Hold Time有嚴格要求。如果rst_n信號直接來自板載按鍵機械開關(guān)其抖動Bounce會產(chǎn)生多個窄脈沖這些脈沖在不同時鐘域下被采樣就會導(dǎo)致部分寄存器復(fù)位、部分不復(fù)位整個狀態(tài)機陷入混亂。解決方案是在頂層模塊里對rst_n進行兩級同步。代碼如下reg rst_sync0, rst_sync1; always (posedge clk) begin rst_sync0 !KEY[0]; // 按鍵按下為低電平 rst_sync1 rst_sync0; end assign rst_n rst_sync1; // 同步后的復(fù)位信號這段代碼利用了兩個寄存器的級聯(lián)將原始的、毛刺滿滿的按鍵信號變成了一個干凈、穩(wěn)定的、與時鐘邊沿對齊的復(fù)位信號。這是數(shù)字電路設(shè)計的黃金法則也是西電A測中高頻考點。任何涉及外部按鍵、傳感器輸入的設(shè)計都必須做同步處理。5.3 “下載失敗JTAG鏈路錯誤”硬件連接與驅(qū)動的“玄學(xué)”排查現(xiàn)象是Quartus點擊“Programmer”選擇好.sof文件點擊“Start”進度條不動報錯“Cant access JTAG chain”。這通常與硬件有關(guān)。排查清單如下1檢查USB線必須使用帶屏蔽層的數(shù)據(jù)線普通充電線不行2檢查USB端口換一個USB 2.0端口避免USB 3.0端口的兼容性問題3檢查驅(qū)動在設(shè)備管理器里看是否有“USB-Blaster”設(shè)備如果有黃色感嘆號說明驅(qū)動未裝好需重新安裝Quartus自帶的驅(qū)動位于quartus\drivers\usb-blaster4檢查板卡供電DE2-115需要外接12V電源適配器僅靠USB供電是不夠的5檢查JTAG模式跳線板卡背面有一個JTAG/SWD跳線帽必須確保它插在JTAG位置。有一次一個學(xué)生折騰了整整一天最后發(fā)現(xiàn)是跳線帽松動了輕輕一按問題迎刃而解。硬件世界有時候就是這么樸實無華。5.4 “ModelSim仿真波形與板子行為不一致”仿真與綜合的鴻溝這是所有FPGA新手的必經(jīng)之痛。仿真里一切完美下載到板子上就出錯。根本原因在于仿真器ModelSim只模擬邏輯功能而綜合器Quartus會將邏輯映射到真實的硬件資源上并施加嚴格的時序約束。一個典型的例子是“鎖存器Latch推斷”。如果你在Verilog中寫了不完整的if-else語句比如always (a or b) begin if (a) y 1b1; // 缺少 else 分支 endModelSim會忠實地模擬出y在a為0時保持原值的行為即鎖存但Quartus綜合時會推斷出一個鎖存器而鎖存器在FPGA中是資源黑洞且極易引發(fā)時序問題。解決方案是在編寫組合邏輯時永遠確保always塊內(nèi)所有分支都有明確的賦值或者直接使用always (*)并養(yǎng)成else兜底的習(xí)慣。另一個常見原因是未考慮信號傳播延時。仿真里a變b就立刻變但現(xiàn)實中b會滯后幾個納秒。因此在關(guān)鍵路徑上必須加入顯式的#1延遲僅用于仿真并在綜合時用(* syn_encoding none *)等屬性加以區(qū)分。記住仿真只是你的“草稿紙”真正的考場永遠是那塊FPGA開發(fā)板。6. 進階思考與延伸方向從實驗一到西電計組課設(shè)的躍遷路徑完成了存儲器實驗?zāi)阒皇悄玫搅诉M入西電計組世界的“入門券”。接下來的挑戰(zhàn)是如何把這個孤立的ROM模塊嵌入到一個更宏大的“基本模型機”中。這個躍遷需要你主動思考三個維度擴展性、交互性與復(fù)雜性。首先擴展性意味著不能再滿足于一個靜態(tài)的ROM。你需要引入RAM如lpm_RAM_DQ讓它既能讀也能寫從而支持變量存儲和棧操作。這時“存儲器與cpu的連接”就從單向讀取變成了雙向讀寫控制總線必須增加MEMW存儲器寫信號地址總線和數(shù)據(jù)總線也需要支持雙向驅(qū)動。其次交互性意味著不能只靠預(yù)設(shè)的.mif文件啟動。你需要設(shè)計一個簡單的“監(jiān)控程序”Monitor通過串口UART接收PC發(fā)來的指令動態(tài)修改RAM中的數(shù)據(jù)甚至在線修改ROM中的程序雖然物理上不可能但可以通過重載.mif文件并重新綜合來模擬。這會讓你深刻理解“虛擬存儲器管理c語言”背后的操作系統(tǒng)思想。最后復(fù)雜性意味著要打破“以存儲器為中心的雙總線結(jié)構(gòu)CPU”的簡單模型。你可以嘗試設(shè)計一個“哈佛結(jié)構(gòu)”即指令和數(shù)據(jù)分別存放在獨立的ROM和RAM中擁有各自的地址總線和數(shù)據(jù)總線這能極大提升CPU的吞吐率也是現(xiàn)代處理器如ARM Cortex-M的標配。當你能獨立完成這些設(shè)計時西電計組課設(shè)就不再是恐懼的源頭而成了你展示硬件設(shè)計能力的舞臺。我個人在實際指導(dǎo)中發(fā)現(xiàn)那些能在實驗一就主動思考“這個ROM以后怎么和ALU、寄存器堆連在一起”的學(xué)生最終的課設(shè)作品往往能做出一個可運行簡單C語言小程序的微處理器。這才是西電計組實驗想要傳遞的真正價值它不是一個終點而是一把鑰匙開啟你通往計算機硬件世界的大門。