草庐IT

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

柠檬叶子C 2023-07-12 原文

写在前面: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:

`timescale 1ns / 1ps

module parity_bit_generator(
    input a, b, c, d,
    output e
    );
    
    assign e = a ^ b ^ c ^ d;

endmodule

💬 Testbench:

`timescale 1ns / 1ps

module parity_bit_generator_tb;
reg aa, bb, cc, dd;
wire e;

parity_bit_generator u_parity_bit_generator(
   .a(aa),
   .b(bb),
   .c(cc),
   .d(dd),
   .e(e)
   );

initial aa = 1'b0;
initial bb = 1'b0;
initial cc = 1'b0;
initial dd = 1'b0;
       
always aa = #100 ~aa;
always bb = #200 ~bb;
always cc = #400 ~cc;
always dd = #800 ~dd;
       
initial begin
  #1000
  $finish;
end

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:

`timescale 1ns / 1ps

module parity_bit_checker(
    input a,b,c,d,p,
    output e
    );
    
    assign e = a^b^c^d^p;
    
endmodule

💬 Testbench:

`timescale 1ns / 1ps

module parity_bit_checker_tb;
reg aa, bb, cc, dd, pp;
wire e;

parity_bit_checker u_parity_bit_checker(
    .a(aa),
    .b(bb),
    .c(cc),
    .d(dd),
    .p(pp),
    .e(e)
    );

initial aa = 1'b0;
initial bb = 1'b0;
initial cc = 1'b0;
initial dd = 1'b0;
initial pp = 1'b0;
         
always aa = #100 ~aa;
always bb = #200 ~bb;
always cc = #400 ~cc;
always dd = #800 ~dd;
always pp = #1600 ~pp;
        
initial begin
   #2000
   $finish;
end

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:

`timescale 1ns / 1ps

module two_bit_binary_comparator(
    input a, b, c, d,
    output f1, f2, f3
    );
    
    assign f1 = (a & ~c) | (b & ~c & ~d) | (a & b & ~d);
    assign f2 = ~(a ^ c) & ~(b ^ d);
    assign f3 = (~a & c) | (~a & ~b & d) | (~b & c & d);
    
endmodule

💬 Testbench:

`timescale 1ns / 1ps

module two_bit_binary_comparator_tb;
 reg aa, bb, cc, dd;
 wire f1, f2, f3;

two_bit_binary_comparator u_two_bit_binary_comparator(
    .a(aa),
    .b(bb),
    .c(cc),
    .d(dd),
    .f1(f1),
    .f2(f2),
    .f3(f3)
    );
    
initial aa = 1'b0;
initial bb = 1'b0;
initial cc = 1'b0;
initial dd = 1'b0;
    
always aa = #100 ~aa;
always bb = #200 ~bb;
always cc = #400 ~cc;
always dd = #800 ~dd;
    
initial begin
   #1000
   $finish;
end

endmodule

🚩 运行结果如下:

 

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

📜 参考资料 

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

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

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

有关【FPGA】Verilog 实践:奇偶校验生成器 | 奇偶校验检查器 | 2-bit 二进制比较器的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby-on-rails - 如何在 Rails 3 中创建自定义脚手架生成器? - 2

    有这些railscast。http://railscasts.com/episodes/218-making-generators-in-rails-3有了这个,你就会知道如何创建样式表和脚手架生成器。http://railscasts.com/episodes/216-generators-in-rails-3通过这个,您可以了解如何添加一些文件来修改脚手架View。我想把两者结合起来。我想创建一个生成器,它也可以创建脚手架View。有点像RyanBates漂亮的生成器或web_app_themegem(https://github.com/pilu/web-app-theme)。我

  3. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  4. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  5. Ruby - 如何将消息长度表示为 2 个二进制字节 - 2

    我正在使用Ruby,我正在与一个网络端点通信,该端点在发送消息本身之前需要格式化“header”。header中的第一个字段必须是消息长度,它被定义为网络字节顺序中的2二进制字节消息长度。比如我的消息长度是1024。如何将1024表示为二进制双字节? 最佳答案 Ruby(以及Perl和Python等)中字节整理的标准工具是pack和unpack。ruby的packisinArray.您的长度应该是两个字节长,并且按网络字节顺序排列,这听起来像是n格式说明符的工作:n|Integer|16-bitunsigned,network(bi

  6. ruby - rbenv 安装 ruby​​ 校验和不匹配 osx - 2

    我已经在mountainlion上成功安装了rbenv和ruby​​build。运行rbenvinstall1.9.3-p392结束于:校验和不匹配:ruby-1.9.3-p392.tar.gz(文件已损坏)预期f689a7b61379f83cbbed3c7077d83859,得到1cfc2ff433dbe80f8ff1a9dba2fd5636它正在下载的文件看起来没问题,如果我使用curl手动下载文件,我会得到同样不正确的校验和。有没有人遇到过这个?他们是如何解决的? 最佳答案 tl:博士;使用浏览器从http://ftp.rub

  7. ruby-on-rails - Rails 中同一个类的多个关联的最佳实践? - 2

    我认为我的问题最好用一个例子来描述。假设我有一个名为“Thing”的简单模型,它有一些简单数据类型的属性。像...Thing-foo:string-goo:string-bar:int这并不难。数据库表将包含具有这三个属性的三列,我可以使用@thing.foo或@thing.bar之类的东西访问它们。但我要解决的问题是当“foo”或“goo”不再包含在简单数据类型中时会发生什么?假设foo和goo代表相同类型的对象。也就是说,它们都是“Whazit”的实例,只是数据不同。所以现在事情可能看起来像这样......Thing-bar:int但是现在有一个新的模型叫做“Whazit”,看起来

  8. ruby-on-rails - 向 Rails 3 添加 Ruby 扩展方法的最佳实践? - 2

    我有一个要在我的Rails3项目中使用的数组扩展方法。它应该住在哪里?我有一个应用程序/类,我最初把它放在(array_extensions.rb)中,在我的config/application.rb中我加载路径:config.autoload_paths+=%W(#{Rails.root}/应用程序/类)。但是,当我转到railsconsole时,未加载扩展。是否有一个预定义的位置可以放置我的Rails3扩展方法?或者,一种预先定义的方式来添加它们?我知道Rails有自己的数组扩展方法。我应该将我的添加到active_support/core_ext/array/conversion

  9. ruby - 如何在 Ruby 中将负整数转换为二进制 - 2

    问题1:我无法通过以下方式找到将负整数转换为二进制的方法。我应该像这样转换它。-3=>"11111111111111111111111111111101"我在下面试过:sprintf('%b',-3)=>"..101"#..appearsanddoesnotshow111111bit.-3.to_s(2)=>"-11"#Thisjustadds-tothebinaryofthepositiveinteger3.问题2:有趣的是,如果我使用在线转换器,它告诉我-3的二进制是“0010110100110011”。"11111111111111111111111111111101"和"001

  10. python - 帮我找到合适的 ruby​​/python 解析器生成器 - 2

    我使用的第一个解析器生成器是Parse::RecDescent,它的指南/教程很棒,但它最有用的功能是它的调试工具,特别是tracing功能(通过将$RD_TRACE设置为1来激活)。我正在寻找可以帮助您调试其规则的解析器生成器。问题是,它必须用python或ruby​​编写,并且具有详细模式/跟踪模式或非常有用的调试技术。有人知道这样的解析器生成器吗?编辑:当我说调试时,我并不是指调试python或ruby​​。我指的是调试解析器生成器,查看它在每一步都在做什么,查看它正在读取的每个字符,它试图匹配的规则。希望你明白这一点。赏金编辑:要赢得赏金,请展示一个解析器生成器框架,并说明它的

随机推荐