Verilgo实现的FPGA奇偶校验
1、奇偶校驗
奇偶校驗(Parity Check)是一種校驗代碼傳輸正確性的方法。根據被傳輸的一組二進制數位中“1”的個數是奇數或偶數來進行校驗。采用奇數的稱為奇校驗,反之,稱為偶校驗。采用何種校驗是事先規定好的。通常專門設置一個奇偶校驗位,用它使這組代碼中“1”的個數為奇數或偶數。若用奇校驗,則當接收端收到這組代碼時,校驗“1”的個數是否為奇數,從而確定傳輸代碼的正確性。
舉例,要輸出一組8-bit數據,為“11101000”,該組數據共有4個“1”。若使用奇校驗,則校驗位應為1,傳輸數據實際為8-bit數據+1-bit奇校驗位,即“111010001”;若使用偶校驗,則校驗位應為0,傳輸數據實際為8-bit數據+1-bit偶校驗位,即“111010000”。
2、輸入數據的校驗方法
根據輸入串行數據碼流,“實時”生成所輸入數據的校驗位。
2.1、舉例
欲串行接收數據“11101000”(傳輸低位在前,高位在后),則數據線上的數據應為“0-0-0-1-0-1-1-1”
? ? ? ? 奇校驗應為“x-1-1-1-0-0-1-0-1”(采用時序邏輯輸出,會落后一個時鐘周期)
? ? ? ? 偶校驗應為“x-0-0-0-1-1-0-1-0”(采用時序邏輯輸出,會落后一個時鐘周期)
? ? ? ? 校驗位剛好落后數據一個時鐘周期,方便拼接。
時序圖如下:
??
輸出信號odd根據輸入信號變化,假如輸入數據只輸入4-bit,0001,則奇校驗位0,偶校驗位1,可以看到在輸入信號的下一個周期,odd、even的輸出符合預期,其他數據相同,這里不贅述。
????????奇校驗實現方式:校驗位默認為高電平,每檢測到1,則狀態翻轉
? ? ? ? 偶校驗實現方式:校驗位默認為低電平,每檢測到1,則狀態翻轉
2.2、verilog實現
? ? ? ? 根據上述,編寫如下代碼:
module odd_even1(input clk ,input in , //串行輸入input reset , //同步復位,高電平有效output reg odd , //奇校驗位output reg even //偶校驗位 );always@(posedge clk)beginif(reset)beginodd <= 1'b1;even <= 1'b0;endelse if(in)beginodd <= ~odd;even <= ~even; endelse beginodd <= odd;even <= even;end endendmodule2.3、testbench仿真
編寫仿真對上述模塊進行測試,激勵輸入隨機生成0或1.
`timescale 1ns/1ns //時間單位/精度//------------<模塊及端口聲明>---------------------------------------- module tb_odd_even1();reg clk ; reg in ; reg reset ;wire odd ; wire even ; //------------<例化被測試模塊>---------------------------------------- odd_even1 odd_even1_inst(.clk (clk),.reset (reset),.in (in),.odd (odd),.even (even) );//------------<設置初始測試條件>---------------------------------------- initial beginclk = 1'b1; //初始時鐘為1reset <= 1'b1; //初始復位#20reset <= 1'b0; end //------------<設置時鐘>---------------------------------------------- always #10 clk = ~clk; //系統時鐘周期20nsalways #20 in <= {$random}%2; //每20ns隨機生成0或1endmodule2.4、仿真結果
仿真結果如下:
假設兩黃線中間剛好傳輸了一次8-bit數據,則傳輸的數據應為1011_1111?(低位在前),那么這組數據的奇校驗位應是:0 ;偶校驗位應是:1?;上圖中藍色字體標注與理論一直,而輸入數據的第九位為1,則可視為一次偶校驗。
通過比對數據碼流上的第九位(校驗位)與輸出的奇偶校驗結果,就可以判斷這次數據接收是否成功。
3、輸出數據的校驗方法
除了對接收數據的正確性做奇偶校驗外,同時也需要對輸出給的外部數據提供一個奇偶校驗結果,方便外部模塊比對數據是否傳輸正常。
3.1、舉例
僅對輸出數據為8-bit的情況做示例,其他位寬原理一致。
欲串行發送數據“11101000”:
? ? ? ? 奇校驗結果應為“1”,實際應傳輸“111010001”:
? ? ? ? 偶校驗結果應為“0”,實際應傳輸“111010000”:
?實現方法:
? ? ? ? 根據異或的定義:相異為1,相同為0??赏瞥?#xff1a;偶數個1異或的結果為0,奇數個1異或的結果為1。所以:
? ? ? ? ????????偶校驗:將輸入數據按位異或
? ? ? ? ? ? ? ? 奇校驗:將輸入數據按位異或再取反(與偶校驗相反)
3.2、verilog實現
? ? ? ? 根據上述,編寫如下代碼:
module odd_even2(input clk ,input [7:0] in , //并行輸入input reset , //同步復位,高電平有效output reg odd , //奇校驗位output reg even //偶校驗位 );always@(posedge clk)beginif(reset)beginodd <= 1'b0;even <= 1'b0;endelse beginodd <= ~(^in);even <= ^in;end endendmodule3.3、testbench仿真
編寫仿真對上述模塊進行測試,激勵輸入隨機生成8-bit數據:
`timescale 1ns/1ns //時間單位/精度//------------<模塊及端口聲明>---------------------------------------- module tb_odd_even2();reg clk ; reg [7:0] in ; reg reset ;wire odd ; wire even ; //------------<例化被測試模塊>---------------------------------------- odd_even2 odd_even2_inst(.clk (clk),.reset (reset),.in (in),.odd (odd),.even (even) );//------------<設置初始測試條件>---------------------------------------- initial beginclk = 1'b1; //初始時鐘為0reset <= 1'b1; //初始復位#20reset <= 1'b0; end //------------<設置時鐘>---------------------------------------------- always #10 clk = ~clk; //系統時鐘周期20nsalways #20 in <= {$random}%256; //每20ns隨機生成8-bit數據endmodule3.4、仿真結果
仿真結果如下:
- 由于使用的時序邏輯,所以校驗位的輸出會落后輸入數據一個時鐘周期
- 輸入數據“00100100”,奇校驗位應為:1? ?偶校驗位應為:0? ,仿真結果與分析一致。其他數據不分析了,都時滿足要求的
4、總結
- 奇偶校驗屬于是一種比較簡單的校驗方式,效率比較低(如果傳輸過程中偶數個位同時錯誤,則無法校驗出來),但是對于一般要求不嚴格的場合還是應用的較多,需要熟練掌握
- 需要工程的同學可以評論留下郵箱
總結
以上是生活随笔為你收集整理的Verilgo实现的FPGA奇偶校验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LMD VCL Complete 202
- 下一篇: 虚拟内存概念3