---
# System prepended metadata

title: Camera OV7670 第03段 parity check

---

# 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不相等，則表示數據有錯誤
 :::