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. C++快速读入

    使用C++的标准cin进行读入速度比较慢,尤其是在大数据的情况下,所以我们需要使用一种方法,按照字符读入,最后再"组装"成整数.由于字符读入比数字要快,所以这样做可以提高读入速度. ...

  2. disruptor笔记之二:Disruptor类分析

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. Elasticsearch -head 查询报 406错误码

    问题:利用Elasticsearch -head插件不能查看数据或者在Elasticsearch -linux的curl命令操作时总是提示: {"error":"Cont ...

  4. python BeautifulSoup html解析

    * BeautifulSoup 的.find(), .findAll() 函数原型 findAll(tag, attributes, recursive, text, limit, keywords) ...

  5. kibana操作

    一些KIBANA的操作,记录下,免下次重复写 #创建索引名为kb_question的索引,并添加mapping,即各字段属性 PUT kb_question { "mappings" ...

  6. 关于java中BigDecimal的简介

    关于java中BigDecimal的简介 1.BigDecimal属于大数据,精度极高,不属于基本数据类型,属于java对象(引用数据类型), 这是sun提供的一个类,专门用在财务软件中. 2.注意: ...

  7. 鸿蒙内核源码分析(任务管理篇) | 任务池是如何管理的 | 百篇博客分析OpenHarmony源码 | v5.05

    百篇博客系列篇.本篇为: v05.xx 鸿蒙内核源码分析(任务管理篇) | 任务池是如何管理的 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度谁 ...

  8. 关于go mod 的使用和goland 配置 go mod

    一.关于go modules 1.1 go modules 是go1.11 新加的特性 现在已有go 1.13.4 了本人用了就是最新版的 1.2关于modules 官方定义 模块是相关Go包的集合. ...

  9. 国庆出游神器:魔幻黑科技换天造物,让vlog秒变科幻大片!

    摘要:国庆旅游景点人太多,拍出来的照片全是人人人.车车车,该怎么办?不妨试试这个黑科技,让你的出游vlog秒变科幻大片. 本文分享自华为云社区<国庆出游神器,魔幻黑科技换天造物,让vlog秒变科 ...

  10. 你需要知道的MySQL&InnoDB锁都在这里

    目录 一.前言 二.锁的类型 2.1 全局锁 2.2 表级锁 2.2.1 表锁 2.2.2 元数据锁(Meta Data Locks) 2.2.3 自增列锁(AUTO-INC Locks) 2.2.4 ...