提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、代码
RTL Viewer:
always和case两种方法得到的RTL Viewer的结果不同,如下:
前者是always方法,后者是case方法。
代码如下:
module decoder
(
input wire in_1,
input wire in_2,
input wire in_3,
output reg [7:0] out
);
//output可以用wire,也可以用reg,如果用always语句就用reg,assign语句就用wire,位宽8bit
//进行赋值,if else存在优先级
always@(*)
if({in_1,in_2,in_3}==3'b000)
out=8'b0000_0001;
else if({in_1,in_2,in_3}==3'b001)
out=8'b0000_0010;
else if({in_1,in_2,in_3}==3'b010)
out=8'b0000_0100;
else if({in_1,in_2,in_3}==3'b011)
out=8'b0000_1000;
else if({in_1,in_2,in_3}==3'b100)
out=8'b0001_0000;
else if({in_1,in_2,in_3}==3'b101)
out=8'b0010_0000;
else if({in_1,in_2,in_3}==3'b110)
out=8'b0100_0000;
else if({in_1,in_2,in_3}==3'b111)
out=8'b1000_0000;
else
out=8'b0000_0001;
/* always@(*)
case({in_1,in_2,in_3})
3'b000:out=8'b0000_0001;
3'b001:out=8'b0000_0010;
3'b010:out=8'b0000_0100;
3'b011:out=8'b0000_1000;
3'b100:out=8'b0001_0000;
3'b101:out=8'b0010_0000;
3'b110:out=8'b0100_0000;
3'b111:out=8'b1000_0000;
default:out=8'b0000_0001;
endcase */
//Rtl Viewer:代码被中合成一个3-8译码器
endmodule
二、测试代码
代码如下:
`timescale 1ns/1ns
//时间尺度 时间单位/时间精度
module tb_decoder();
//使用always initial语句进行赋值的一律是reg型,使用assign的一律是wire型
reg in_1;
reg in_2;
reg in_3;
wire [7:0] out;
//输入信号的初始化
initial
begin in_1<=1'b0;
in_2<=1'b0;
in_3<=1'b0;
end
//always语句进行随机数的赋值,#表示时间延时,10表示延时10个时间单位,即10ns
always #10 in_1<={$random}%2;
always #10 in_2<={$random}%2;
always #10 in_3<={$random}%2;
initial
begin
$timeformat(-9,0,"ns",6);
//首先是时间格式的设置(时间单位 小数位 时间单位名称 打印数据位宽)
//-9是ns级别,0是小数位的设置,即不打印
//其次使用检测函数
$monitor("@time %t:in_1=%b,in_2=%b,in_3=%b,out=%b",$time,in_1,in_2,in_3,out);
end
//实例化,模块名称+实例化名称
decoder decoder_inst
(
.in_1(in_1),
.in_2(in_2),
.in_3(in_3),
.out (out)
);
endmodule
这里解释一下实例化部分:
括号里的in_1是图左侧左列的,是仿真文件模拟生成的in_1,可以更改;括号前的in_1是图左侧右列的,.相当于连线进行连接;括号里的out是图右侧右列的,括号前的out是图右侧左列的。
三、Modulsim相关
1.Ctrl A+Delete 删除数据,可在sim—Default选项卡右键Add Wave添加tb_decoder和decoder_inst(或选中+Ctrl W进行快速添加),Ctrl G进行分组;
2.点击左下角第一行第一个按钮,可删除路径,只显示名称;
3.点击in_1右键->Radix->…,可选择进制之间的转换;
4.如上图:0 1 1->0000_1000。