Verilog设计技巧实例及实现

1 引言

最近在刷HDLBits的过程中学习了一些Verilog的设计技巧,在这里予以整理。部分操作可能降低代码的可读性和Debug的难度,请大家根据实际情况进行使用。

2 目录

2.1 casez

例:创建八位输入信号的优先编码器。给定一个8位向量,输出向量中第一个为1的位。如果输入向量没有高位,则报告0。例如,输入8'b10010000应该输出3'd4。

这里我们若用case语句来实现,共有256个case,可以用脚本生成,但在这里我们介绍一种基于casez的解决方案,可以将256个case降低为9个item。在casez中,值为z的位将被忽视比较。因此一些输入(例如4'b1111)将匹配多个case item,选择第一个匹配项。同时,也可以用?代表忽视比较的项,意义与z相同。代码如下:

module top_module (
input [7:0] in,
output reg [2:0] pos ); always@(*)begin
casez(in)
8'bzzzzzzz1:begin//z不予比较
pos = 3'd0;
end
8'bzzzzzz10:begin
pos = 3'd1;
end
8'bzzzzz100:begin
pos = 3'd2;
end
8'bzzzz1000:begin
pos = 3'd3;
end
8'bzzz10000:begin
pos = 3'd4;
end
8'bzz100000:begin
pos = 3'd5;
end
8'bz1000000:begin
pos = 3'd6;
end
8'b10000000:begin
pos = 3'd7;
end
default:begin
pos = 3'd0;
end
endcase
end
endmodule

图1 结果时序图

2.2 generate for实例化重复模块

例:已有名为bcd_fadd的一位BCD全加器模块,它将两个BCD数字a[3:0],b[3:0]加起来并产生和sum[3:0]及进位cout。现需实例化100个bcd_fadd以创建100位BCD全加器,实现将两个100位BCD数字a[99:0],b[99:0]以及进位信号cin相加,产生一个100位的和sum[99:0]及进位cout。

在这里我们可以分割为一个以cin为进位的全加器以及99个重复的以cout_inter为进位的全加器模块,因此可以用generatefor生成重复模块。代码如下:

module top_module(
input [399:0] a, b,
input cin,
output cout,
output [399:0] sum ); wire [99:0] cout_inter;//中间进位值cout generate
genvar i;
for(i = 0; i <= 99; i++)begin:adder//adder指的是自定义的模块名
if(i==0)begin
bcd_fadd u_bcd_fadd(
.a (a[3:0]),
.b (b[3:0]),
.cin (cin),
.cout (cout_inter[0]),
.sum (sum[3:0])
);
end
else begin
bcd_fadd ui_bcd_fadd(
.a (a[4*i+3:4*i]),
.b (b[4*i+3:4*i]),
.cin (cout_inter[i-1]),
.cout (cout_inter[i]),
.sum (sum[4*i+3:4*i])
);
end
end
endgenerate assign cout = cout_inter[99]; endmodule

2.3 &、|及^的使用

例:建立一个四输入(in[3:0])的组合电路,有3个输出:4位输入信号的与out_and、4位输入信号的或out_or及4位输入信号的异或out_xor

这里我们可以规约运算符简单实现,代码如下:

module top_module(
input [3:0] in,
output out_and,
output out_or,
output out_xor
);
assign out_and = &in;
assign out_or = |in;
assign out_xor = ^in;
endmodule

图2 结果时序图

3 结果显示

---

参考资料:HDLBits

Verilog设计技巧实例及实现的更多相关文章

  1. Java中组合 设计技巧 实例

    关于组合 和 集成 先放两篇文章:这两篇文章写的太好了. http://blog.csdn.net/u013905744/article/details/51752044    Java的组合(持有对 ...

  2. .NET框架设计(常被忽视的C#设计技巧)

    阅读目录: 1.开篇介绍 2.尽量使用Lambda匿名函数调用代替反射调用(走进声明式设计) 3.被忽视的特性(Attribute)设计方式 4.扩展方法让你的对象如虎添翼(要学会使用扩展方法的设计思 ...

  3. .NET框架设计(常被忽视的框架设计技巧)

    阅读目录: 1.开篇介绍 2.元数据缓存池模式(在运行时构造元数据缓存池) 2.1.元数据设计模式(抽象出对数据的描述数据) 2.2.借助Dynamic来改变IOC.AOP动态绑定的问题 2.3.元数 ...

  4. objc@interface的设计哲学与设计技巧

    blog.sunnyxx.com 我是前言 学习objc时,尤其是先学过其他编程语言再来看objc时,总会对objc的类声明的关键字interface感到有点奇怪,在其它面向对象的语言中通常由clas ...

  5. .NET框架设计—常被忽视的框架设计技巧

    阅读目录: 1.开篇介绍 2.元数据缓存池模式(在运行时构造元数据缓存池) 2.1.元数据设计模式(抽象出对数据的描述数据) 2.2.借助Dynamic来改变IOC.AOP动态绑定的问题 2.3.元数 ...

  6. .NET框架设计—常被忽视的C#设计技巧

    .NET框架设计—常被忽视的C#设计技巧 阅读目录: 1.开篇介绍 2.尽量使用Lambda匿名函数调用代替反射调用(走进声明式设计) 3.被忽视的特性(Attribute)设计方式 4.扩展方法让你 ...

  7. 【转载】 .NET框架设计—常被忽视的C#设计技巧

    阅读目录: 1.开篇介绍 2.尽量使用Lambda匿名函数调用代替反射调用(走进声明式设计) 3.被忽视的特性(Attribute)设计方式 4.扩展方法让你的对象如虎添翼(要学会使用扩展方法的设计思 ...

  8. 【前端阅读】——《活用PHP、MySQL建构Web世界》摘记之设计技巧

    二.设计技巧 Programming的习惯因人而异,这里只提供一些经验,可以参考. 1.利用Include模块化你的程序代码 Include函数基本上说:就像是把另一个文件(HTML或者PHP程序)读 ...

  9. Testbench代码设计技巧

    Testbench代码设计技巧 " There are many ways " to code a test case, it all depens on the creativi ...

随机推荐

  1. GMAP.NET系列学习文档

    http://www.cnblogs.com/enjoyeclipse/archive/2013/01/13/2858392.html http://www.cnblogs.com/luxiaoxun ...

  2. C++ windows 函数讲解(二)鼠标坐标

    获得鼠标坐标: #include<bits/stdc++.h> #include<windows.h> using namespace std; int main() { PO ...

  3. 转mybatis返回自增主键,亲测

    重点是获取对象的主键值而不是insert的返回值 Mybatis获取插入数据的主键时,返回值总是1xml里的写法 第一种方式 <insert id="insertLogin" ...

  4. Shell系列(29)- 单分支if语句格式

    单分支if条件语句 if [ 条件判断 ] ;then 程序 fi 或者 if [ 条件判断 ] then 程序 fi 注意点 if语句使用fi结尾,和一般语言使用大括号结尾不同 [ 条件判断 ]就是 ...

  5. 【原创】linux mint 17.3 kvm 安装windows7虚拟机

    一.安装windows7虚拟机 linux mint 17.3是一个不错的桌面发行版本,我下载了 linux mint 17.3 for xfce 桌面版本,运行速度没得说,而且安装设置都挺简单,非常 ...

  6. 开机延时启动多程序(Dos下Start命令详解)

    前言 在实际开发当中,很多程序需要开机自启,并且对启动顺序有所要求,这里推荐一种最简单的开机延时启动多程序的方法,使用bat脚本来控制程序的启动顺序. Bat脚本实现 Bat比较简单,延时是采用pin ...

  7. Python setattr() 函数 ,Python super() 函数: Python 内置函数 Python 内置函数

    描述 setattr 函数对应函数 getatt(),用于设置属性值,该属性必须存在. 语法 setattr 语法: setattr(object, name, value) 参数 object -- ...

  8. 通过Python收集MySQL MHA 部署及运行状态信息的功能实现

    一. 背景介绍 当集团的MySQL数据库实例数达到2000+.MHA集群规模数百个时,对MHA的及时.高效管理是DBA必须面对的一个挑战.MHA 集群 节点信息 和 运行状态 是管理的基础.本篇幅主要 ...

  9. 使用gitlab runner 进行CI(二):gitlab runner的安装与配置

    参考 https://docs.gitlab.com/runner/install/index.html,可以选择与gitlab相同的版本. gitlab runner可以通过安装binary包或do ...

  10. Java字符串的初始化与比较

    Java字符串的初始化与比较 简单的总结:直接赋值而不是使用new关键字给字符串初始化,在编译时就将String对象放进字符串常量池中:使用new关键字初始化字符串时,是在堆栈区存放变量名和内容:字符 ...