地址生成
鏈路本地地址的產生
每當接口啟動時節點就形成一個鏈路本地地址。一個接口可以在下列任何一個事件之後被啟動:
(1)接口在系統啟動時刻被初始化;
(2)接口在暫時的接口故障或被系統管理暫時禁用之後重新啟動;
(3)接口第一次被連在鏈路上; .
(4)接口被系統管理通過管理手段禁用之後被啟動。
鏈路本地地址是將眾所周知的(適當長度的)鏈路本地前綴FE80::0加在接口標識符前邊形成的。若接口標識符的長度為N比特,則接口標識符取代鏈路本地前綴最右邊的N個“0”比特。若接口標識符長度超過118比特,則自動配置失敗,需要進行手工配置。注意接口標識符一般為64比特長,並且基於EUI.64標識符。
鏈路本地地址具有無限首選並有效的生存期,永遠不會過期失效。
全局和站點本地地址的產生
全局和站點本地地址是通過將接口標識符附加到一個適當長度的前綴之後構成的。前綴是從路由器宣告中包含的前綴信息選項中得到的。全局和站點本地地址的產生以及其他參數的配置應可在本地完成。然而,下文描述的處理必須是預設啟用的。
(1)路由器宣告處理
路由器宣告包含了兩個標識,即“M”比特和“0”比特。“M”比特為“管理地址配置”標記,指明主機是否使用無狀態自動配置以外的管理(有狀態)協定來獲得地址。“0”比特為“其他有狀態配置”標記,標識指明主機是否應該使用被管理的(有狀態)協定來獲得除地址外的其他信息。
主機接收到一個合法的路由器宣告後,將宣告信息的M比特值拷貝到ManagedFlag中,如果ManagedFlag的值由FALSE變為TRUE,而且該主機尚未運行有狀態地址自動配置協定,則應該調用有狀態地址自動配置協定,請求得到地址信息和其他信息。如果ManagedFlag的值由TRUE變為FALSE,主機應繼續運行有狀態地址自動配置,也就是說,ManagedFlag值的改變對主機的運行沒有任何影響。如果該標識位的值沒有改變,則主機不做任何動作。尤其需要說明的是。如果一台主機在先前宣告中已經啟用了有狀態協定,則不需要重新調用有狀態地址配置協定。
路由宣告的0標誌位以類似的方式處理。主叫將0標誌位的值拷貝到OtherConfigFlag中,如果OtherConfigFlag的值由FALSE變為TRUE,主機就應該調用有狀態自動配置協定來請求得到信息(如果ManagedFlag的值為FALSE,則不包括地址信息);如果OtherConfigFlag的值由TRUE變為FALSE,則主機繼續運行有狀態地址自動配寅協定,也就是說,0標誌位對OtherConfigFlag值的改變沒有影響。如果該標誌位的值沒有變化,則不採取任何動作。尤其需要說明的是,如果一台主機在先前宣告中已經啟用了有狀態協定,則不需要重新調用有狀態地址配置。
路由器宣告也包含零個或多個前綴信息選擇項,這些選擇項的內容包括無狀態地址自動配置生成站點本地地址和全局地址所使用的信息。前綴信息選項域中的“自治地址配置”標記指明該前綴信息是否可用於地址的自動配置。如果可以,選項域中還要包括一個子網前綴,同時指明用該前綴生成的地址的生存期。
對於路由宣告中的每個前綴信息選項進行如下處理:
①如果沒有設定“自治地址配置”標記,則忽略前綴信息選項。
②如果前綴是鏈路本地前綴,則忽略前綴信息選項。
③如果推薦生存期大於有效生存期,則忽略前綴信息選項,在這種情況下,節點可能會記錄一個系統管理差錯。
④如果宣告的前綴與地址列表中的前綴不符,並且其有效生存期不是0。則在列表中由這個宣告的前綴和鏈路接口標識符按下列格式創建一個地址。
如果前綴長度與接口標示符長度的和不等於128比特,則必須忽略前綴信息選項。此時應記錄一個系統管理差錯。系統管理器應負責確保路由宣告中包含的前綴長度與該鏈路類型的接口標示符的長度匹配。注意,接口標示符的典型長度是64比特,它是基於“地址結構”中描述的EUI一64標示符的。
如果成功的創建了一個地址,主機將其加入分配給該接口的地址列表中,並在前綴信息選項中初始化其指定的和有效生存期的值。
⑤如果宣告的前綴與該接口相關的地址列表中的自動配置地址(即通過有狀態或無狀態地址自動配置獲得的地址)前綴向匹配,則根據收到的宣告中的有效生存期和前面自動配置的地址的生存期(下文中稱作存儲的生存期)採取動作:
如果收到的生存期大於2小時,或者大於存儲的生存期,則更新相應地址存儲的生存期。
如果存儲的生存期小於或等於2小時,並且收到的生存期小於或等於存儲的生存期,除非獲得該前綴信息選項的路由宣告是已被授權的,否則忽略該前綴。
如果路由宣告一已授權,則存儲的生存期應設定成接收到的選項中的生存期。
如果不是上述兩種情況,則重新設定相關地址中存儲的生存期為2小時。
上述規則防止了帶有非常小有效生存期前綴的偽造宣告的業務攻擊。如果沒有上述規則,僅一個包含具有很短生存期的前綴信息選項的未授權宣告可能會導致所有節點的地址過早失效。上述規則確保合法的宣告(它們是定期傳送的)在真正生效前將生存期短的宣告刪掉。
(2)地址生存期過期
當指定的生存期過期後,一個指定的地址將失效。在當前的通信中,一個失效的地址應該繼續當做一個源地址,但如果有一個可用的替換(沒有失效的)地址並且其範圍足夠時,失效地址不能用於新的通信。既然失效地址仍然是接口的一個合法地址。IP層和更高層(如TCP和UDP)必須繼續接受目標是該失效地址的數據包。在實際操作中可能會避免新的通信使用已失效的地址,但是系統管理必須有能力刪除該設備,並在系統中默認該設備已刪除。
當有效的生存期過期後,一個地址和它相關的接口就變為無效。失效的地址不能當成通信中的源地址,也不能當做接收接口的目標地址。
地址生成模組
地址生成模組負責生成後繼指令的地址。模組工作時會首先根據offset欄位的值生成一個16位的偏移地址,然後根據指令解碼模組和分支處理模組給出的控制信號進行判斷:如果執行分支跳轉,則當前PC值與16位偏移地址相加;如果跳轉不執行或不是分支轉移類指令,則當前PC值加2(指令寬度16位,存儲器按位元組編址);如果當前指令為子程式調用或子程式返回指令,則後繼指令地址取決於ALU的運算結果。地址生成模組計算產生的結果傳送至程式存儲器的地址連線埠,作為下一條指令的地址。實現地址生成模組的Verilog HDL代碼如右圖程式P10-4所示。
地址生成單元
地址生成單元的功能是提供運算元的地址來進行DSP操作。由於很多指令(如乘法指令)在執行時需要多個的運算元,所以地址生成單元要工作得足夠快從而在指令執行時間要求的約束內提供地址。
此外,在DSP實現中,地址生成單元可能需要執行一些自身的計算,從而到達運算元地址。這是因為需要一些不同類型的間接定址方式以及特殊定址方式,如循環定址方式和位倒序定址方式。
為了執行指定定址方式所需的計算,需要在DSP實現中提供一個具有其獨立算術單元的地址生成單元。這樣就消除了主ALU的地址計算負擔,從而使得它能夠更加有效地運行。
地址的產生通常包括下面的某種操作:
(1)從立即運算元、暫存器或記憶體單元獲取新值。
(2)對當前地址遞增或遞減。
(3)當前地址加上或減去一個偏移量。
(4)當前地址加上或減去一個偏移量,將新地址與循環定址方式下的限制相比較,並根據循環定址方式算法產生一個新地址。
通過位倒序定址方式算法從當前地址產生新地址。
執行上述操作的必要硬體包括:ALU;存儲當前值、偏移量以及新值的暫存器;存儲環形緩衝器限制的暫存器;實現循環定址方式的邏輯;實現位倒序定址方式的邏輯。右圖給出了一個典型的定址單元示意圖。
地址生成器
根據控制器的要求,地址生成器需要從0向上計數到16(濾波器階數)。乘法一累加器塊使用地址生成器來訪問係數儲存器和樣點儲存器。
地址信號是unsigned類型,計數範圍在樣點儲存器和係數儲存器範圍內。它的位寬由類屬參數counter-bits控制:
signal address:unsigned(counter_bits-1 downto 0);
地址生成器是一個簡單的計數暫存器,當禁用時,計數暫存器的值保持,當啟用時,向上計數。它有一個同步復位,將地址設定為零:
process
begin
wait until ris ing_edge(clock);
if address-clear = ‘1’ then
address < = (others = > ‘0’ );
elsif address_counting = ‘1’ then
address < = address + 1;
end if;
end process;
這個計數器由兩個控制信號控制,這兩個信號由控制器生成。對於地址計數器,當到達範圍的最大值時,不需要停止計數;完成乘法累加計算後,控制器禁用address_counting,計數停止。