奇偶校驗及verilog實現
阿新 • • 發佈:2022-05-30
引言
奇偶校驗Parity Check,即判別一組二進位制碼中1的個數為奇數或偶數的校驗方法。奇校驗即1的個數為奇數,偶校驗即1的個數為偶數。傳送方在傳送前需要事先規定好哪種形式的校驗,便於接收方進行解校驗。
接收端接到資料後再次進行校驗,通過判斷1的個數來確定傳輸是否正確。
以一個8bit傳輸為例,並規定奇校驗,傳送方8‘b00001111傳送出去,1的個數為4,因此附加的校驗位為1,這樣1的總數就是5(奇數)了。最後傳送的資料為9‘b000011111(最後一位為校驗位)。
例題
這裡以牛客網的一道例題來解釋
埠為
輸出check為1代表校驗正確(不過題目這裡沒提示,是我猜測的輸出,驗證是正確的)。
首先給出一個複雜的設計方法...
設計一,化簡為繁
1 `timescale 1ns/1ns 2 module odd_sel( 3 input [31:0] bus, 4 input sel, 5 output check 6 ); 7 //*************code***********// 8 reg [5:0] one_num; 9 reg check_r; 10 integer i; 11 12 assign check = check_r; 13 14 always@(*)beginView Code15 one_num = 0; 16 for(i=0;i<=31;i=i+1)begin 17 if(bus[i]==1'b1)begin 18 one_num = one_num+1'b1; 19 end 20 end 21 end 22 23 always@(*)begin 24 if(sel==1'b1)begin 25 check_r = one_num[0]==1'b1 ? 1'b1 : 1'b0; 26 end 27 else if(sel==1'b0) begin 28 check_r = one_num[0]==1'b0 ? 1'b1 : 1'b0; 29 end 30 else begin 31 check_r = check_r; 32 end 33 end 34 35 //*************code***********// 36 endmodule
這裡的思路是首先檢測出輸入資料中1的個數,然後根據計數值最低位為1或0表示1的個數為奇數或是偶數來判斷輸出。思路很簡單,資源很要命!
不過這裡用到了之前一篇文章介紹的辦法用來計算輸入資料中1的個數,算是個小應用吧。
設計二,真正的好辦法
1 `timescale 1ns/1ns 2 module odd_sel( 3 input [31:0] bus, 4 input sel, 5 output check 6 ); 7 //*************code***********// 8 9 wire flag; 10 assign flag = ^bus; 11 12 assign check = sel ? flag : ~flag; 13 14 //*************code***********// 15 endmoduleView Code
這裡的關鍵點是按位異或^bus,可以計算出輸入資料中1是奇數(結果為1)還是偶數(結果為0),非常簡單的描述。
另外按位與&bus可以判別輸入資料中是否含有0,按位或|bus可以判別輸入資料中是否含有1。都是非常有用的描述方式。