# Camera OV7670 第03段 parity check ```javascript= // Pixel byte parity check:像素字節奇偶校驗 // Pixel Byte H: odd number of bits under H_BYTE_PARITY_CHECK and H_BYTE_PARITY_INVERT // Pixel Byte L: even number of bits under L_BYTE_PARITY_CHECK and L_BYTE_PARITY_INVERT // H:RRRRRGGG const uint8_t H_BYTE_PARITY_CHECK = 0b00100000; const uint8_t H_BYTE_PARITY_INVERT = 0b00001000; // L:GGGBBBBB const uint8_t L_BYTE_PARITY_CHECK = 0b00001000; const uint8_t L_BYTE_PARITY_INVERT = 0b00100000; // Since the parity for L byte can be zero we must ensure that the total byte value is above zero. //由於 L 字節的奇偶校驗可以為零,必須確保總字節值大於零。 // Increasing the lowest bit of blue color is OK for that. //增加藍色的最低位是可以的。 const uint8_t L_BYTE_PREVENT_ZERO = 0b00000001; const uint16_t COLOR_GREEN = 0x07E0; //2進位0b00000111 const uint16_t COLOR_RED = 0xF800; //2進位0b11111000 ``` ## 什麼是 奇偶校驗parity check ### 解釋1 - 在很多情況下,尤其是在傳輸中,一定量的錯誤檢查信息是非常重要的。這樣能保證錯誤信息能夠被辨別、忽略,重新發送新的信息。奇偶校驗(Parity)是最簡單的校驗方法之一,可分為奇校驗(Odd Parity)和偶校驗(Even Parity)。奇偶校驗能夠檢查每個字節信息的組成,判斷它是正確或錯誤的。 - 在1個字節(Byte)中,有8個二進位位(bit)。其中7個位是需要傳輸/存儲的數據,剩下1個位是校驗信息。校驗信息位的值隨其餘7個位的值而變化,使各位之和總是奇數,或總是偶數。校驗位在傳輸/存儲之前被確定,添加到字節當中。如果接收或者讀取的字節的奇偶性與規定不同,則判斷信息是錯誤的,反之則說明信息正確。 - 由於奇偶校驗只是將位和的奇偶作為檢驗標準,這種方法能檢驗出錯誤,卻不能保證通過奇偶校驗的數據都是正確的。比如,1個字節中有2位或4位發生了錯誤,那麼奇偶性依然保持不變,被視為正確。 - 若每一位上發生錯誤的機率是P,則在一個字節中發生2位錯誤的機率是{\displaystyle C_{8}^{2}P^{2}(1-P)^{6}}{\displaystyle C_{8}^{2}P^{2}(1-P)^{6}}。在數字電子設備中,P小於百分之一,那麼產生2位錯誤的機率至多不到千分之三。產生4、6、8位錯誤的機率則指數遞減。 - 計算機率可以知道,在錯誤率很低的情況下,發生2位錯誤的機率小於1%,屬於小機率事件。因此在一定程度上,奇偶校驗能夠避免絕大多數錯誤。但對於高精密設備,依舊無法滿足苛刻的要求,需要更高級的校驗方法。 參考網站(https://zh.wikibooks.org/zh-tw/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%B3%BB%E7%BB%9F/%E5%A5%87%E5%81%B6%E6%A0%A1%E9%AA%8C) ### 解釋2 - 奇偶校驗是一種數據校驗機制,用於判斷數據在存儲過程中是否發生了比特位錯誤。常用於存儲結構中,如RAM。存儲結構的最小單元爲“字節”,即Byte。每個字節含有8bit,另外增加1bit作爲校驗位。如下圖(1)所示,校驗位爲所以bit位異或產生,即當8bit有奇數個1時,校驗位爲1,當有偶數個1時校驗位爲0。 - 存儲數據時,會對8比特數據進行異或運算得到校驗位y0,並且隨8bit數據一塊存到RAM中。 - 當讀取存儲數據時,會對讀出的8bit數據進行異或運算得到新的校驗位y1,並與校驗位y0進行對比,如果y1和y0不一致,則表示數據存取不一致,出現錯誤。 校驗位: y=x0 ^ x1 ^ x2 ^ x3 ^ x4 ^ x5 ^ x6 ^ x7 parity優點: 結構簡單,只需異或計算就可以實現,數據量小時(8比特)實現代價小。 parity缺點: 1、不能修正錯誤:只知道8bit中有部分bit發生錯誤,無法判斷哪幾個比特發送錯誤。 2、有偶數個bit時,無法判斷出錯。如下圖所示,x5和x2均發生變化時,校驗位仍未1,無法檢測出錯誤。 3、數據位寬較大時實現代價大:如1024bit數據,需要256bit的校驗位。 | X~7~ | X~6~ | X~5~ | X~4~ | X~3~ | X~2~ | X~1~ | X~0~ | Y | |:---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | --- | | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | ::: spoiler 延伸閱讀 ECC 1、 什麼是ECC 通過上面的分析我們知道Parity機制是通過在原來數據位的基礎上增加一個數據位來檢查當前8位數據的正確性。 隨着數據位每增加8比特,檢驗位需要增加1bit。當數據量爲256字節時,需要256個bit,並且出錯的數據無法恢復。 由此,一種存儲檢錯糾錯機制出現了,這就是ECC。ECC同樣通過增加校驗位來進行錯誤判斷,但是能夠進行錯誤糾正。 2、ECC有什麼特點: 優點: 1):大量數據位實現代價低:8比特數據需要5個校驗位,256字節(256*8比特)的數據值需要5個列校驗位和11行校驗位 2)能夠糾正錯誤:在內存中ECC能夠容許錯誤,並可以將錯誤更正,使系統得以持續正常的操作,不致因錯誤而中斷 缺點: 1):只能修復1比特錯誤 當數據只有單比特錯誤時,ECC能夠進行錯誤修復;超過2比特的數據錯誤,將無法修復,ECC只能輸出多比特錯誤信號。 2):不保證能檢測超過2比特的錯誤 超過2比特的錯誤不一定能檢測出來 ### Parity與ECC的應用場景 在IC設計中RAM模塊輸出信號有Parity信號和ECC信號。 parity 信號表示RAM中寫入的數據data_in跟讀出的數據是否一致。 ECC負責糾錯,能夠修正1bit的數據。 Parity是同一個data所有比特的異或,在data_in寫入的時候進行異或計算得到parity_in,同時寫入到RAM中,讀出data的得到data_out,對data_out進行異或計算得到parity_out,若parity_out與parity_in不相等,則表示數據有錯誤 :::