4位全加器的门级建模

Verilog语言的层级

在Verilog硬件描述语言中,我们可以分许多层次对电路进行描述,每一层都有自己的特点。层次分为开关级、门级、数据流级、行为级。我们不能说必须使用哪一种层级来描述某 一个指定的电路,只要在合适的“需求”下,都可以使用。
记住!Verilog只是用于描述电路的一种语言,其中最困难的是电路的结构、功能等问题。可以这样说,就好比自己在写一篇作文,Verilog语言只是让你的作文没有一些低级语法错误;自己电路的理解则是获取高分的亮点。

目标

这次先使用门级建模描述一个4位全加器,主要是认识一个模块的简单组成和其测试代码的编写。所以在这篇文章中会认识到什么是门级建模、模块和测试代码的编写。

门级建模

门级建模是在已知门级电路图的条件下,使用基本门级元器件把电路描述出来。这句话简单直接说明门级建模的应用前提,就是已知电路的门级原理图。

设计过程

设计思路:采用自上而下的设计思想。若设计一个4位全加 器,先设计一个1位全加器。之后,把4个一位全加器级联起 来。这样便设计好一个四位全加器。

1位全加器门级描述过程

1位全加器的设计思路就是“翻译”电路图。电路图如下:

代码

Verilog代码的编写要有两部分:设计代码和测试代码,门级建模中设计代码编写是最简单的,只需要会认电路图中的门是什么,再掌握Verilog编码规则就可以轻松的编写代码。有关测试代码的编写先简单说明一下,测试就是验证设计代码是否满足“预期的结果”。

1位全加器门级描述代码

module   add_1_m (a,b,cin,cout,sum);
input   a,b;
input   cin;
output  cout;
output  sum;
wire    [2:0]   w;
anda1(w[0],a,cin),a2(w[1],a,b),a3(w[2],b,cin);
xor a4(sum,a,b,cin);
or  a5(cout,w[0],w[1],w[2]);
endmodule

1位全加器测试代码

module   add_1_m_tb;
reg a,b;
reg cin;
wire    cout1;
wire    sum1;
add_1_m     u1 (a,b,cin,cout1,sum1);initial
begin
#00 a=0;b=0;cin=0;
#10 a=0;b=1;
#10 a=1;b=0;
#10 a=1;b=1;
#00 a=0;b=0;cin=1;
#10 a=0;b=1;
#10 a=1;b=0;
#10 a=1;b=1;
end
initial
begin$monitor($realtime,"\ta=%d\tb=%d\tcin=%d\t\t\tcout1=%d\tsum1=%d\t",a,b,cin,cout1,sum1);
end
endmodule

有关测试代码的说明基本上没有什么可说的,结果可以看波形也可以直接看transcript里面的结果。如下图:

4位全加器门级描述代码

//use add_1_m connect to add_4
module add_4_m (a,b,cin,cout,sum);
input   [3:0]   a,b;
input       cin;
output      cout;
output  [3:0]   sum;
wire    [3:1]   c;
add_1_m u1  (a[0],b[0],cin,c[1],sum[0]);
add_1_m u2  (a[1],b[1],c[1],c[2],sum[1]);
add_1_m u3  (a[2],b[2],c[2],c[3],sum[2]);
add_1_m u4  (a[3],b[3],c[3],cout,sum[3]);
endmodule

4位全加器测试代码

module add_4_tb;
reg [3:0]   a,b;
reg     cin;
wire        cout1;
wire    [3:0]   sum1;
add_4_m t1 (a,b,cin,cout1,sum1);
integer seed1,seed2,seed3;
initial
beginseed1=1;seed2=2;seed3=3;a=0;b=0;cin=0;repeat(10)begin#10 a=($random(seed1)/16);b=($random(seed2)/16);cin=($random(seed3)/2);end#10    $stop;
endinitial  $monitor($realtime,"\ta=%d\tb=%d\tcin=%d\t\t\tcout1=%d\tsum1=%d",a[3:0],b[3:0],cin,cout1,sum1[3:0]);
endmodule

这个测试代码的编写分格和上一个测试代码的风格有所不同,这两种的区别是什么?以后再说!这两个代码我测试过,没有什么问题的。
运行结果见下图:

总结

这篇文章提供了门级建模的基本方法——翻译电路(仅仅是门级电路)。我以后会使用门级建模设计一个32的超前进位加法器。至于测试模块的编写习惯或者是经验,我会在随后的文章中写一下有用的干货。本篇文章为出入Verilog的新手提供一个简单入门案例。

预告

其实我本来是想先把门级、数据流级和行为级这三种描述电路的方法都试一下。但是,最后我改变主意了,我先完成有关加法器的一些简单的设计。所以下一个文章就是使用数据流级+模块调用设计一个32位的全加器。

感想

这是我第一次在CSDN上上传自己写的代码,我会一直写下去,总结自己的学习内容、经验。如果有什么问题,请指出。若有幸有大佬光临,希望提出指导性意见。感谢大家!

在Verilog语言中,使用门级建模设计一个由1位全加器组成的4位全加器相关推荐

  1. 【Verilog HDL】从逻辑电路图到门级建模——人工翻译的方法论

    从左到右,从上到下 先搞定缓冲/非门,再写与/或门 1. 实例解读 先以四选一数据选择器进行说明 对于数字逻辑的部分不再说明,直接进行逻辑电路图到Verilog门级建模的人工翻译过程的描述. 1.1 ...

  2. 三、6【Verilog HDL】基础知识之门级建模

    参考书籍:<Verilog HDL 数字设计与综合>第二版,本文档为第5章的学习笔记.由于本章也讲述的建模方式.该建模方式是通常设计师常用的底层抽象层次.更为低层的为开关级建模. 想了解更 ...

  3. 【 Verilog HDL 】不同抽象级别的Verilog HDL模型之门级结构描述

    本博文参考:<从算法设计到硬件逻辑实现>,仅供学习交流使用. Verilog模型可以是实际电路不同级别的抽象.这些抽象的级别和它们对应的模型类型共有以下五种: 1) 系统级(system) ...

  4. C语言中的hook和bait设计

    在C语言中的hook和bait设计 经常用到在一处需要一个通用接口,调用另一个地方的函数 hook 函数: 实际调用的接口.负责传入参数和运行. bait 函数 : 具体算法的实现接口,hook传入参 ...

  5. verilog case语句_浅谈Design Compiler -- Verilog语言结构到门级的映射

    昨天的文章中,我们了解到Design Compiler(DC)作为Synopsys公司开发的一款用于电路综合的EDA工具,在全球数字电路市场去得了巨大的成功,它的设计初衷是将用Verilog HDL语 ...

  6. 20计算机数电实验四--编译器的门级建模

    一 实验过程 第一步:打开Quartus II新建一个工程文件路径如图(新建一个与项目名称相同的文件) 第二步:点击file 新建,对话框中选择 Verilog HDL File 第三步:输入代码 m ...

  7. verilog语言中的always什么意思

    Verilog语言中的两种过程:always过程和initial过程. 过程可以是包含时序的过程描述,而不包含时序的过程还可以表达组合逻辑.always过程从关键字always开始,可以连续多次运行, ...

  8. 【学习笔记-FPGA】verilog语言中assign的使用

    个人笔记. assign在verilog语言中一般用于连接两个变量,将一个变量的值不断赋值给另一个变量,比如在顶层模块中调用另一模块的变量. 例: ///二级模块 module compile( in ...

  9. 主从D触发器的门级建模

    1.实验代码: module MSDFF (Q,Qbar,D, C); output Q, Qbar; input D, C; wireNotc,NotD,NotY,Y,D1,D2,Ybar,Y1,Y ...

最新文章

  1. ecshop /includes/init.php Arbitrary User Login Vul
  2. 满足 Google Play 目标 API 等级 (targetSdkLevel) 的要求
  3. C#中UDP通信过程中出现:远程主机强迫关闭了一个现有的连接0x80004005】的解决方法
  4. [转载] Java中的final变量、final方法和final类
  5. 中国农业大学营养与健康研究院诚聘博士后
  6. 十、Spring的@Profile注解
  7. 2018数据库流行度12月排行:Oracle续跌至年内低位,PostgreSQL激增创新高
  8. .netcore2.1 使用postgresql数据库,不能实现表的CRUD问题
  9. 远程监控系统集成方案
  10. Bailian4036 计算系数【数学+迭代】
  11. secureCRT连接Linux虚拟机
  12. c语言内存泄露检查工具,检测C++的内存泄漏用哪些工具(1)
  13. oracle节假日,oracle 产生节假日表
  14. 拜师——python基础入门—第3大节课—列表,排序,revered逆序,max,min,sum——day15
  15. webstorm如何自动修复prettier提示的错误
  16. android pppd流程,pppd调试心得.md
  17. Python Keras ValueError: Layer sequential expects 1 input(s), but it received 2 input tensors. 解决方法
  18. 沪江易未来:沪江网校前端架构漫谈
  19. CRS-4544 ORA-09925
  20. 安装QQ的时候显示创建文件夹失败,无法正常安装,请尝试选择新的安装目录的解决办法

热门文章

  1. SQL 为什么历经半个世纪却经久不衰?
  2. 工业相机取图到传输时间计算
  3. OAuth2 -GitHub授权登录超详细教程
  4. 列表转链表+链表合并
  5. java 注释内添加类链接或url链接
  6. 微信账单页面明细格式化价格字符
  7. 吴恩达:AI的下一个发展方向,从大数据转向小数据
  8. 国内外一些开源项目,开源代码网站介绍
  9. Spark sql 读文件的源码分析
  10. 【转】微软早期员工因何机缘加盟微软?