Verilog设计技巧实例及实现
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 = ∈
assign out_or = |in;
assign out_xor = ^in;
endmodule

图2 结果时序图
3 结果显示
---
参考资料:HDLBits
Verilog设计技巧实例及实现的更多相关文章
- Java中组合 设计技巧 实例
关于组合 和 集成 先放两篇文章:这两篇文章写的太好了. http://blog.csdn.net/u013905744/article/details/51752044 Java的组合(持有对 ...
- .NET框架设计(常被忽视的C#设计技巧)
阅读目录: 1.开篇介绍 2.尽量使用Lambda匿名函数调用代替反射调用(走进声明式设计) 3.被忽视的特性(Attribute)设计方式 4.扩展方法让你的对象如虎添翼(要学会使用扩展方法的设计思 ...
- .NET框架设计(常被忽视的框架设计技巧)
阅读目录: 1.开篇介绍 2.元数据缓存池模式(在运行时构造元数据缓存池) 2.1.元数据设计模式(抽象出对数据的描述数据) 2.2.借助Dynamic来改变IOC.AOP动态绑定的问题 2.3.元数 ...
- objc@interface的设计哲学与设计技巧
blog.sunnyxx.com 我是前言 学习objc时,尤其是先学过其他编程语言再来看objc时,总会对objc的类声明的关键字interface感到有点奇怪,在其它面向对象的语言中通常由clas ...
- .NET框架设计—常被忽视的框架设计技巧
阅读目录: 1.开篇介绍 2.元数据缓存池模式(在运行时构造元数据缓存池) 2.1.元数据设计模式(抽象出对数据的描述数据) 2.2.借助Dynamic来改变IOC.AOP动态绑定的问题 2.3.元数 ...
- .NET框架设计—常被忽视的C#设计技巧
.NET框架设计—常被忽视的C#设计技巧 阅读目录: 1.开篇介绍 2.尽量使用Lambda匿名函数调用代替反射调用(走进声明式设计) 3.被忽视的特性(Attribute)设计方式 4.扩展方法让你 ...
- 【转载】 .NET框架设计—常被忽视的C#设计技巧
阅读目录: 1.开篇介绍 2.尽量使用Lambda匿名函数调用代替反射调用(走进声明式设计) 3.被忽视的特性(Attribute)设计方式 4.扩展方法让你的对象如虎添翼(要学会使用扩展方法的设计思 ...
- 【前端阅读】——《活用PHP、MySQL建构Web世界》摘记之设计技巧
二.设计技巧 Programming的习惯因人而异,这里只提供一些经验,可以参考. 1.利用Include模块化你的程序代码 Include函数基本上说:就像是把另一个文件(HTML或者PHP程序)读 ...
- Testbench代码设计技巧
Testbench代码设计技巧 " There are many ways " to code a test case, it all depens on the creativi ...
随机推荐
- 剑指 Offer 60. n个骰子的点数
剑指 Offer 60. n个骰子的点数 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s.输入n,打印出s的所有可能的值出现的概率. 你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n ...
- JavaScript深拷贝实现方式
1.递归 function deepCope (obj) { // 要拷贝的数据为引用类型属性(数组或对象) if (obj && typeof obj === 'object') { ...
- Java大数操作
Java的Math包中提供了两个类用于对大数进行操作: BigInteger类,用于大整数的操作 BigDecimal类,用于大的小数操作 BigInteger类 Java中的基本类型中,表示整数的有 ...
- Java基础系列(8)- 数据类型
数据类型 强类型语言 要求变量的使用合乎规定,所有的变量都必须先定义才能使用.Java是强类型语言. 弱类型语言 变量定义比较随意,比如"12"+3,可以是int型123,也可以是 ...
- Charles安装https证书
Charles抓取https的包,出现unknow,需要安装https证书.
- P6620-[省选联考2020A卷]组合数问题【组合数学,斯特林数】
正题 题目链接:https://www.luogu.com.cn/problem/P6620 题目大意 给出\(n,x,p,m\)和一个\(m\)次多项式\(f\)求 \[\sum_{k=0}^nf( ...
- YbtOJ#662-交通运输【线段树合并,树状数组】
正题 题目链接:http://www.ybtoj.com.cn/contest/122/problem/2 题目大意 给出\(n\)个点的一棵有根树,对于每个\(x\)求,删除点\(x\)后修改某个点 ...
- P4345-[SHOI2015]超能粒子炮·改【Lucas定理,类欧】
正题 题目链接:https://www.luogu.com.cn/problem/P4345 题目大意 \(T\)组询问,给出\(n,k\)求 \[\sum_{i=0}^{k}\binom{n}{i} ...
- springcloud组件之hystrix服务熔断,降级,限流
hystrix 简介 Hystrix是什么 在分布式环境中,许多服务依赖项中的一些必然会失败.Hystrix是一个库,通过添加延迟容忍和容错逻辑,帮助你控制这些分布式服务之间的交互.Hystrix通过 ...
- 高中最后一刻&大学第一课&为人师的责任
文章不是技术文,只是分享一些感想,作为一只程序猿,不说好好敲代码,跑出来思考人生,不是合格的程序猿,罪过罪过,自我反思3秒钟,我们继续,毕竟程序猿的人生不只是Coding,也希望自己这点感想被更多刚入 ...