日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Verilgo实现的FPGA奇偶校验

發布時間:2023/12/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 endendmodule

2.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或1endmodule

2.4、仿真結果

仿真結果如下:

假設兩黃線中間剛好傳輸了一次8-bit數據,則傳輸的數據應為1011_1111?(低位在前),那么這組數據的奇校驗位應是:0 ;偶校驗位應是:1?;上圖中藍色字體標注與理論一直,而輸入數據的第九位為1,則可視為一次偶校驗。

通過比對數據碼流上的第九位(校驗位)與輸出的奇偶校驗結果,就可以判斷這次數據接收是否成功。

3、輸出數據的校驗方法

除了對接收數據的正確性做奇偶校驗外,同時也需要對輸出給的外部數據提供一個奇偶校驗結果,方便外部模塊比對數據是否傳輸正常。

3.1、舉例

僅對輸出數據為8-bit的情況做示例,其他位寬原理一致。

欲串行發送數據“11101000”:

? ? ? ? 奇校驗結果應為“1”,實際應傳輸“111010001”:

? ? ? ? 偶校驗結果應為“0”,實際應傳輸“111010000”:

?實現方法:

? ? ? ? 根據異或的定義:相異為1,相同為0。可推出:偶數個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 endendmodule

3.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數據endmodule

3.4、仿真結果

仿真結果如下:

  • 由于使用的時序邏輯,所以校驗位的輸出會落后輸入數據一個時鐘周期
  • 輸入數據“00100100”,奇校驗位應為:1? ?偶校驗位應為:0? ,仿真結果與分析一致。其他數據不分析了,都時滿足要求的

4、總結

  • 奇偶校驗屬于是一種比較簡單的校驗方式,效率比較低(如果傳輸過程中偶數個位同時錯誤,則無法校驗出來),但是對于一般要求不嚴格的場合還是應用的較多,需要熟練掌握
  • 需要工程的同學可以評論留下郵箱

總結

以上是生活随笔為你收集整理的Verilgo实现的FPGA奇偶校验的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。