小言_互联网的博客

【FPGA】Verilog 实践:奇偶校验生成器 | 奇偶校验检查器 | 2-bit 二进制比较器

459人阅读  评论(0)

写在前面:Parity bit Generator/Checker 和 2bit binary comparator 的了解和确认动作。使用Verilog 进行 Parity bit Generator/Checker、2bit binary,实施 comparator,生成输入信号后确认通过模拟器实现的每个 Gate 操作,通过 FPGA 验证 Verilog 实现的电路的行为。

Ⅰ. 前置知识

0x00 Parity bit 生成器

传输二进制信息时使用 parity bit 来检测error。 

在发送二进制数据时,增加一个称为 parity bit 的 1-bit 作为发送方法,如果 binary 数据的 1bit 的数目是奇数,则 parity bit 为 1,如果 1bit 的数目是偶数,则 parity bit 为 0。因此,总体上总是具有偶数个 1bit 的传输数据形式,从而将其传输到目的地。

0x01 Parity bit 检查器

在接收器中检查奇偶校验的电路称为奇偶校验器。

奇偶校验校验器的输出用奇偶校验()表示,如果1为奇数(如果有错误),则为1;如果1为偶数或0,则  为 0。

0x02  2-bit 二进制比较器

当有 2-bit 二进制数  时,如果  则输出  ;如果 ,则输出 ;如果 ,则输出  为 1,组合逻辑电路。

 

Ⅱ.  练习(Assignment)

0x00 实现 Parity bit 生成器

画出卡诺图完成真值表,编写 Verilog 代码,通过 Simulation 打印出结果(8,4,2,1)

真值表:

In A

In B

In C

In D

Out E

0

0

0

0

0

0

0

0

1

1

0

0

1

0

1

0

0

1

1

0

0

1

0

0

1

0

1

0

1

0

0

1

1

0

0

0

1

1

1

1

1

0

0

0

1

1

0

0

1

0

1

0

1

0

0

1

0

1

1

1

1

1

0

0

0

1

1

0

1

1

1

1

1

0

1

1

1

1

1

0

卡诺图:

ab  cd

00

01

11

10

00

0

1

0

1

01

1

0

1

0

11

0

1

0

1

10

1

0

1

0

💬 Design source:


  
  1. `timescale 1ns / 1 ps
  2. module parity_bit_generator (
  3. input a, b, c, d,
  4. output e
  5. );
  6. assign e = a ^ b ^ c ^ d;
  7. endmodule

💬 Testbench:


  
  1. `timescale 1ns / 1ps
  2. module parity_bit_generator_tb;
  3. reg aa, bb, cc, dd;
  4. wire e;
  5. parity_bit_generator u_parity_bit_generator(
  6. .a(aa),
  7. .b(bb),
  8. .c(cc),
  9. .d(dd),
  10. .e(e)
  11. );
  12. initial aa = 1'b0;
  13. initial bb = 1'b0;
  14. initial cc = 1'b0;
  15. initial dd = 1'b0;
  16. always aa = # 100 ~aa;
  17. always bb = # 200 ~bb;
  18. always cc = # 400 ~cc;
  19. always dd = # 800 ~dd;
  20. initial begin
  21. # 1000
  22. $finish;
  23. end
  24. endmodule

🚩 运行结果如下:

 

0x01 实现 Parity bit 检查器

画出卡诺图完成真值表,编写 Verilog 代码,通过 Simulation 打印出结果(8,4,2,1)

真值表:

In A

In B

In C

In D

Out E

0

0

0

0

0

0

0

0

1

1

0

0

1

0

1

0

0

1

1

0

0

1

0

0

1

0

1

0

1

0

0

1

1

0

0

0

1

1

1

1

1

0

0

0

1

1

0

0

1

0

1

0

1

0

0

1

0

1

1

1

1

1

0

0

0

1

1

0

1

1

1

1

1

0

1

1

1

1

1

0

卡诺图:

ab 

cd

00

01

11

10

00

0

1

0

1

01

1

0

1

0

11

0

1

0

1

10

1

0

1

0

 💬 Design source:


  
  1. `timescale 1ns / 1 ps
  2. module parity_bit_checker (
  3. input a,b,c,d,p,
  4. output e
  5. );
  6. assign e = a^b^c^d^p;
  7. endmodule

💬 Testbench:


  
  1. `timescale 1ns / 1ps
  2. module parity_bit_checker_tb;
  3. reg aa, bb, cc, dd, pp;
  4. wire e;
  5. parity_bit_checker u_parity_bit_checker(
  6. .a(aa),
  7. .b(bb),
  8. .c(cc),
  9. .d(dd),
  10. .p(pp),
  11. .e(e)
  12. );
  13. initial aa = 1'b0;
  14. initial bb = 1'b0;
  15. initial cc = 1'b0;
  16. initial dd = 1'b0;
  17. initial pp = 1'b0;
  18. always aa = # 100 ~aa;
  19. always bb = # 200 ~bb;
  20. always cc = # 400 ~cc;
  21. always dd = # 800 ~dd;
  22. always pp = # 1600 ~pp;
  23. initial begin
  24. # 2000
  25. $finish;
  26. end
  27. endmodule

🚩 运行结果如下:

 

0x02 实现 2-bit 二进制比较器

画出卡诺图完成真值表,编写 Verilog 代码,通过 Simulation 打印出结果(8,4,2,1)

真值表:

In A

In B

In C

In D

Out F1

Out F2

Out F3

0

0

0

0

0

1

0

0

0

0

1

0

0

1

0

0

1

0

0

0

1

0

0

1

1

0

0

1

0

1

0

0

1

0

0

0

1

0

1

0

1

0

0

1

1

0

0

0

1

0

1

1

1

0

0

1

1

0

0

0

1

0

0

1

0

0

1

1

0

0

1

0

1

0

0

1

0

1

0

1

1

0

0

1

1

1

0

0

1

0

0

1

1

0

1

1

0

0

1

1

1

0

1

0

0

1

1

1

1

0

1

0

卡诺图:

A>B

ab  cd

00

01

11

10

00

0

0

0

0

01

1

0

0

0

11

1

1

0

1

10

1

1

0

0

A=B

ab  cd

00

01

11

10

00

1

0

0

0

01

0

1

0

0

11

0

0

1

1

10

0

0

0

1

A<B

ab  cd

00

01

11

10

00

0

1

1

1

01

0

0

1

1

11

0

0

0

0

10

0

0

1

0

💬 Design source:


  
  1. `timescale 1ns / 1 ps
  2. module two_bit_binary_comparator (
  3. input a, b, c, d,
  4. output f1, f2, f3
  5. );
  6. assign f1 = (a & ~c) | (b & ~c & ~d) | (a & b & ~d);
  7. assign f2 = ~(a ^ c) & ~(b ^ d);
  8. assign f3 = (~a & c) | (~a & ~b & d) | (~b & c & d);
  9. endmodule

💬 Testbench:


  
  1. `timescale 1ns / 1ps
  2. module two_bit_binary_comparator_tb;
  3. reg aa, bb, cc, dd;
  4. wire f1, f2, f3;
  5. two_bit_binary_comparator u_two_bit_binary_comparator(
  6. .a(aa),
  7. .b(bb),
  8. .c(cc),
  9. .d(dd),
  10. .f1(f1),
  11. .f2(f2),
  12. .f3(f3)
  13. );
  14. initial aa = 1'b0;
  15. initial bb = 1'b0;
  16. initial cc = 1'b0;
  17. initial dd = 1'b0;
  18. always aa = # 100 ~aa;
  19. always bb = # 200 ~bb;
  20. always cc = # 400 ~cc;
  21. always dd = # 800 ~dd;
  22. initial begin
  23. # 1000
  24. $finish;
  25. end
  26. endmodule

🚩 运行结果如下:

 


  
  1. 📌 [ 笔者 ]   王亦优 / akam
  2. 📃 [ 更新 ]    2023.2 .6
  3. ❌ [ 勘误 ]   /* 暂无 */
  4. 📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
  5. 本人也很想知道这些错误,恳望读者批评指正!

📜 参考资料 

Introduction to Logic and Computer Design, Alan Marcovitz, McGrawHill, 2008

Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

百度百科[EB/OL]. []. https://baike.baidu.com/.


转载:https://blog.csdn.net/weixin_50502862/article/details/128899661
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场