没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
1 需要培养的能力需要培养的能力
对于使用硬件描述语言(HDL)来设计集成电路逻辑而言,一个有经验的集成电路逻辑设计人员会拥有以下的能力
来完成设计。
设计功能的需求分析:把需要完成的电路功能明确下来,定义出电路的顶层信号端口以及各个端口的时序。
设计的模块分割:把顶层的模块切分成为若干个小型的模块,同样,定义出各个小型模块的端口和时序,这一
步骤是比较考验水平的,因为:
1. 好的模块划分可以做到非常好的“设计正交性”以及各个模块之间的“去耦”。
2. 例如当某一个子模块的内部设计出现错误时,如果模块划分做的好(这体现在各个子模块的接口和时序
定义上)只需要修改出错的子模块内部即可,不需要改动接口定义和其它的子模块。
3. 或者,当需要对整个电路进行功能升级的时候,只需要改动有关系的子模块即可
4. 记住“牵一发而动全身”的设计是很麻烦的,尽量不要做这样的东西出来。
实现各个子模块:
1. 对于已经分割出来并且定义好功能和接口的子模块,其设计复杂度已经不是很高,对于有经验的人员可
以非常熟练的编写其代码
2. 之所以能够做到这一点是由于设计者事先掌握了一系列的有代表性的“积木块”的代码编写方法
3. 在不同的设计项目中,这些“积木块”的功能尽管不是完全一样,但是却会非常的相似
4. 作者编写本教程的目的就是在于让初学者掌握一批有意义的“积木块”的编写方法,然后在其它的项目中
熟练的使用这些“积木块”的改装版本。
祝各位学习实践愉快
2 本教程的用途本教程的用途
通过学习本教程提供的各种RTL小型电路模块的代码并且观察电路的RTL结构和波形仿真的时序,可以快速的
了解如何设计基本的电路组件。
建议首先阅读本教程中的描述性文字和图片,然后完成每个电路模块的学生实验,并且进行相应的思考。
在以后的设计实践的过程中,尽量能够把复杂的设计拆分为这些小的“积木块”,能够熟练的写出这些积木的
代码,熟悉这些积木块的时序动作,以及知道可能会有哪些功能上的变化。通常这些变化是可以通过修改代码
来实现的。
本教程由中国传媒大学 广播电视数字化工程中心 杜伟韬 整理维护,欢迎批评指正,如有问题请写电子邮件
至 duweitao AT cuc.edu.cn
3 想清楚想清楚 RTL 结构结构
目前成熟的EDA工具都是将RTL(寄存器传输级)层次的硬件描述语言转换为实际的电路。所谓RTL的含义就是D触
发器之间穿插着组合逻辑。对于组合逻辑,我们只需描述它输入和输出的关系表达式(用if-else和case语句)
不必深究到底用怎样的逻辑门来实现,而对于D触发器,则是一定要做到心中有数,就是哪些变量会生成D触发
器。
边沿捕获电路的RTL结构
EDA工具提取出的边沿捕获电路RTL结构
Verilog RTL代码新手上路教程 2012-12-7
举例来说,一个在CLK时钟驱动下,对输入信号IN进行上跳沿捕获的电路,其电路RTL结构如左图所示,它的
Verilog代码如下所示,另外,EDA工具进行编译之后,会提取出RTL结构如右图所示,我们可以观察EDA工具解
析出的RTL是否和我们预想的一致,这是一种重要的验证手段。对于对于 Quartus工具,工具, Tools -> Netlist
Viewer -> RTL Viewer
// module top, 边沿捕获器代码,
module top(
CLK , // input clock
IN , // input
OUT ); // output
input CLK; input IN; output OUT;
reg d1R, d2R; // 电路中的D触发器输出端
reg OUT; // 组合逻辑输出信号,作为输出端口
// 生成移位寄存的D触发器,我们要明确,下面代码的写法会生成d1R和d2R两个D触发器。
// 并且d1R和d2R级联构成IN信号的移位寄存器。这是EDA工具不会篡改的事实。
always @ (posedge CLK) begin
d1R <= IN ;
d2R <= d1R ;
end
// 判断上跳沿的组合逻辑,我们要明确,下面的代码是一个以d1R、d2R信号作为输入,
// 以OUT信号作为输出的组合逻辑,并且代码中指出了OUT信号与d1R、d2R信号的逻辑
// 关系(好比是真值表),但是究竟用怎样的逻辑门实现(好比是卡诺图的画圈)
// 那是EDA工具要关心的事情。
always @ (d1R or d2R) begin
if((d2R == 0)&&(d1R == 1)) // 新值为1,旧值为0,跳变发生
OUT = 1'b1;
else
OUT = 1'b0;
end
endmodule
// endmodule top
4 具体内容具体内容
4.1 多路选择器
电路描述电路描述
1. 纯组合逻辑
2. 根据控制信号的值,把输入信号之一连接到输出信号上。
可能的变化
1. 数据信号的宽度
2. 选通逻辑的变化,控制信号为0或1时选通哪个通道
代码代码
// module top, 选择器(mux)的代码,
module top(
IN0 , // input 1
IN1 , // input 2
SEL , // select
OUT ); // out data
parameter WL = 16; // 输入输出数据信号位宽
input [WL-1:0] IN0, IN1;// 选择器的两个输入数据信号
input SEL; // 通道选通的控制信号
output[WL-1:0] OUT; // 选择器的输入数据信号
reg [WL-1:0] OUT;
// 生成组合逻辑的代码
always @ (IN0 or IN1 or SEL) begin
if(SEL) // SEL为1 选择输入1
OUT = IN1;
Verilog RTL代码新手上路教程 2012-12-7
else // SEL为0 选择输入0
OUT = IN0;
end
endmodule
// endmodule top
学生实验学生实验
1. 做一个4选1的mux,并且进行波形仿真
2. 和2选1的mux对比,观察资源消耗的变化
返回顶部
4.2 交叉开关
电路描述电路描述
1. 实际上是MUX的组合体
2. 通常用在复杂一些的信号选通的场合。
3. 每一个输出端都有对应的选通信号
4. 用选通信号控制输出端选通到哪个输入端。
5. 当输入和输出的端口增加时,该电路会消耗非常多的电路资源
电路的变化
1. 数据信号的宽度
2. 选通逻辑的变化,选择信号为0或1时选通哪个通道
代码代码
// module top, a 2x2 crossbar switch circuit
module top(
IN0 , // input 1
IN1 , // input 2
SEL0 , // select the output0 source
SEL1 , // select the output1 source
OUT0 , // output data 0
OUT1 ); // output data 1
parameter WL = 16;
input [WL-1:0] IN0, IN1;
input SEL0, SEL1;
output[WL-1:0] OUT0, OUT1;
reg [WL-1:0] OUT0, OUT1;
// get the OUT0
always @ (IN0 or IN1 or SEL0) begin
if(SEL0)
OUT0 = IN1;
else
OUT0 = IN0;
end
// get the OUT1
always @ (IN0 or IN1 or SEL1) begin
if(SEL1)
OUT1 = IN1;
else
OUT1 = IN0;
end
endmodule
// endmodule top
学生实验
1. 编写一个4X4路交叉开关的RTL,然后编译,看RTL View
2. 比较2x2与4x4之间消耗资源的区别。通过对比资源,你有什么结论?
返回顶部
4.3 优先编码器
Verilog RTL代码新手上路教程 2012-12-7
剩余16页未读,继续阅读
资源评论
drjiachen
- 粉丝: 172
- 资源: 2138
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功