奇偶校驗(yàn)是一種簡(jiǎn)單、實(shí)現(xiàn)代價(jià)小的檢錯(cuò)方式,常用在數(shù)據(jù)傳輸過(guò)程中。對(duì)于一組并行傳輸?shù)臄?shù)據(jù)(通常為8比特),可以計(jì)算岀它們的奇偶校驗(yàn)位并與其一起傳輸。接收端根據(jù)接收的數(shù)據(jù)重新計(jì)算其奇偶校驗(yàn)位并與接收的值進(jìn)行比較,如果二者不匹配,那么可以確定數(shù)據(jù)傳輸過(guò)程中岀現(xiàn)了錯(cuò)誤;如果二者匹配,可以確定傳輸過(guò)程中沒(méi)有出錯(cuò)或者出現(xiàn)了偶數(shù)個(gè)錯(cuò)誤(出現(xiàn)這種情況的概率極低)。
需要指出當(dāng)出現(xiàn)偶數(shù)個(gè)錯(cuò)誤時(shí),奇偶校驗(yàn)是無(wú)法檢測(cè)此時(shí)電路出現(xiàn)傳輸錯(cuò)誤。例如,發(fā)送的數(shù)據(jù)為8’b1010_1011此時(shí)計(jì)算出的偶校驗(yàn)值是1。如果在傳輸中后兩位從11跳變?yōu)?0,那么此時(shí)接收到的數(shù)據(jù)為8’b10100100,接收的偶校驗(yàn)值仍然為1。對(duì)接收的數(shù)據(jù)進(jìn)行偶校驗(yàn)計(jì)算,得到的結(jié)果仍然為1,這與收到的校驗(yàn)值是相同的,接收電路無(wú)法檢測(cè)出接收數(shù)據(jù)中岀現(xiàn)的錯(cuò)誤。
奇偶校驗(yàn)位有兩種類型:偶校驗(yàn)位與奇校驗(yàn)位。
以偶校驗(yàn)位來(lái)說(shuō),如果一組給定數(shù)據(jù)位中1的個(gè)數(shù)是奇數(shù),補(bǔ)一個(gè)bit為1,使得總的1的個(gè)數(shù)是偶數(shù)。例:0000001, 補(bǔ)一個(gè)bit為1, 00000011。
以奇校驗(yàn)位來(lái)說(shuō),如果給定一組數(shù)據(jù)位中1的個(gè)數(shù)是奇數(shù),補(bǔ)一個(gè)bit為0,使得總的1的個(gè)數(shù)是奇數(shù)。例:0000001, 補(bǔ)一個(gè)bit為0, 00000010。
簡(jiǎn)單理解奇偶校驗(yàn):
奇校驗(yàn):原始碼流+校驗(yàn)位 總共有奇數(shù)個(gè)1
偶校驗(yàn):原始碼流+校驗(yàn)位 總共有偶數(shù)個(gè)1
二、XOR法
2.1 XOR法
題目:采用XOR法試寫(xiě)一個(gè)發(fā)送端奇偶校驗(yàn)器,在發(fā)送端會(huì)輸入一段8bit的數(shù)據(jù),可以選擇切換奇數(shù)校驗(yàn)或者偶數(shù)校驗(yàn),并且將校驗(yàn)值附在末位輸出。
2.2 verilog代碼
//使用XOR法設(shè)計(jì)奇偶校驗(yàn)器
module parity_checker01(
input clk,
input rst_n,
input parity_odd,//是否為奇校驗(yàn):奇數(shù)校驗(yàn)為1,偶數(shù)校驗(yàn)位0
input [7:0] data_in,//輸入的八位數(shù)據(jù)
output [8:0] data_out,//輸出的九位數(shù)據(jù)
output reg even_bit,//偶數(shù)校驗(yàn)碼
output reg odd_bit//計(jì)數(shù)校驗(yàn)碼
);
//使用按位異或確定偶數(shù)校驗(yàn)碼和奇數(shù)校驗(yàn)碼
always@(posedge clk or negedge rst_n) begin
if(!rst_n) begin
even_bit <= 1'b0;
odd_bit <= 1'b0;
end
else begin
even_bit <= ^data_in;? ?//偶校驗(yàn)條件下計(jì)算出來(lái)的校驗(yàn)位
odd_bit <= ~(^data_in);//奇校驗(yàn)條件下計(jì)算出來(lái)的校驗(yàn)位
end
end
//組合邏輯完成輸入數(shù)據(jù)與校驗(yàn)碼的拼接
assign data_out = parity_odd ? {data_in[7:0],odd_bit}
: {data_in[7:0],even_bit};
endmodule
2.3 Testbench
`timescale 1ns / 1ps//仿真時(shí)間單位1ns 仿真時(shí)間精度1ps
module parity_checker01_tb();
//信號(hào)申明
regclk;
regrst_n;
reg parity_odd;
reg [7:0] data_in;
wire [8:0] data_out;
wire even_bit;
wire odd_bit;
//模塊實(shí)例化(將申明的信號(hào)連接起來(lái)即可)
parity_checker01 u_parity_checker01(
.clk (clk),
.rst_n (rst_n),
.parity_odd (parity_odd),
.data_in (data_in),
.data_out (data_out),
.even_bit (even_bit),
.odd_bit (odd_bit)
);
//生成時(shí)鐘信號(hào)
always #5 clk = ~clk;
//生成復(fù)位信號(hào)
//為時(shí)鐘信號(hào)和復(fù)位信號(hào)等賦初值
initial begin
clk = 1;
rst_n = 1;
data_in = 0;
parity_odd = 1;
#5 rst_n <= 0;
#5 rst_n <= 1;
data_in = 8'h01;
#20
data_in = 8'hb7;
#20
data_in = 8'h32;
#20
data_in = 8'he9;
#20
data_in = 8'hd3;
end
endmodule
2.4 仿真結(jié)果
三、計(jì)數(shù)器法
3.1 計(jì)數(shù)器法
題目:采用計(jì)數(shù)器法試寫(xiě)一個(gè)發(fā)送端奇偶校驗(yàn)器,在發(fā)送端會(huì)輸入一段8bit的數(shù)據(jù),可以選擇切換奇數(shù)校驗(yàn)或者偶數(shù)校驗(yàn),并且將校驗(yàn)值附在末位輸出。
3.2 verilog代碼
//使用計(jì)數(shù)器法設(shè)計(jì)奇偶校驗(yàn)器
module parity_checker02(
input clk,
input rst_n,
input parity_odd,//是否為奇校驗(yàn):奇數(shù)校驗(yàn)為1,偶數(shù)校驗(yàn)位0
input [7:0] data_in,//輸入的八位數(shù)據(jù)
output [8:0] data_out,//輸出的九位數(shù)據(jù)
output reg even_bit,//偶數(shù)校驗(yàn)碼
output reg odd_bit//奇數(shù)校驗(yàn)碼
);
//定義一個(gè)三位寬的計(jì)數(shù)器
reg[2:0] cnt;
//計(jì)數(shù)器模塊
//輸入數(shù)據(jù)data_in逢1逐位計(jì)數(shù)
integer i;
always @(*) begin
cnt = 3'd0;
for (i=0;i<8;i=i+1) begin
if(data_in[i]==1'b1) begin
cnt = cnt + 1;
end
end
end
//計(jì)數(shù)器校驗(yàn)?zāi)K
//使用時(shí)序邏輯對(duì)計(jì)數(shù)器中的1校驗(yàn)奇數(shù)or偶數(shù)
//計(jì)數(shù)器最低位為奇數(shù),則整體為奇數(shù),反之為偶數(shù)
always@(posedge clk or negedge rst_n) begin
if(!rst_n) begin
even_bit <= 1'b0;
odd_bit <= 1'b0;
end
else if(cnt[0] == 1'b1) begin//通過(guò)計(jì)數(shù)器最低位判斷是否為偶數(shù)
even_bit <= 1'b1;??
odd_bit <= 1'b0;
end
else begin
even_bit <= 1'b0;
odd_bit <= 1'b1;
end
end
//組合邏輯完成輸入數(shù)據(jù)與校驗(yàn)碼的拼接
assign data_out = parity_odd ? {data_in[7:0],odd_bit}
: {data_in[7:0],even_bit};
endmodule
3.3 Testbench
`timescale 1ns / 1ps//仿真時(shí)間單位1ns 仿真時(shí)間精度1ps
module parity_checker02_tb();
//信號(hào)申明
regclk;
regrst_n;
reg parity_odd;
reg [7:0] data_in;
wire [8:0] data_out;
wire even_bit;
wire odd_bit;
//模塊實(shí)例化(將申明的信號(hào)連接起來(lái)即可)
parity_checker02 u_parity_checker02(
.clk (clk),
.rst_n (rst_n),
.parity_odd (parity_odd),
.data_in (data_in),
.data_out (data_out),
.even_bit (even_bit),
.odd_bit (odd_bit)
);
//生成時(shí)鐘信號(hào)
always #5 clk = ~clk;
//生成復(fù)位信號(hào)
//為時(shí)鐘信號(hào)和復(fù)位信號(hào)等賦初值
initial begin
clk = 1;
rst_n = 1;
data_in = 0;
parity_odd = 1;
#5 rst_n <= 0;
#5 rst_n <= 1;
data_in = 8'h01;
#10
data_in = 8'hb7;
#10
data_in = 8'h32;
#10
data_in = 8'he9;
#10
data_in = 8'hd3;
end
endmodule
仿真結(jié)果
四、總結(jié)
奇偶校驗(yàn)器設(shè)計(jì)主要思路是通過(guò)弄清一組數(shù)據(jù)中“1”和“0”的數(shù)目。若是奇校驗(yàn)則原始碼流+校驗(yàn)位總共有奇數(shù)個(gè)“1”;若是偶校驗(yàn)則原始碼流+校驗(yàn)位總共有偶數(shù)個(gè)“1”。設(shè)計(jì)方法主要有XOR法和計(jì)數(shù)器法。XOR法最簡(jiǎn)單,只需要對(duì)數(shù)據(jù)使用按位異或,輸出為“0”代表數(shù)據(jù)中“1”位偶數(shù)個(gè);計(jì)數(shù)器法最直觀,計(jì)數(shù)器中數(shù)值的奇偶性表示對(duì)應(yīng)數(shù)據(jù)中“1”個(gè)數(shù)的奇偶。
Tips:判斷計(jì)數(shù)器是奇數(shù)還是偶數(shù)主要有判斷data_out[0]和取余數(shù)兩種方法,前者綜合后耗損的資源太多不推薦前者。
審核編輯:湯梓紅
-
Verilog
+關(guān)注
關(guān)注
28文章
1343瀏覽量
109925 -
計(jì)數(shù)器
+關(guān)注
關(guān)注
32文章
2253瀏覽量
94283 -
奇偶校驗(yàn)器
+關(guān)注
關(guān)注
0文章
7瀏覽量
7122 -
代碼
+關(guān)注
關(guān)注
30文章
4722瀏覽量
68231
原文標(biāo)題:FPGA基礎(chǔ)-奇偶校驗(yàn)器設(shè)計(jì)
文章出處:【微信號(hào):Hack電子,微信公眾號(hào):Hack電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論