3-8译码器
A | B | C | OUT |
---|---|---|---|
0 | 0 | 0 | 0000_0001 |
0 | 0 | 1 | 0000_0010 |
0 | 1 | 0 | 0000_0100 |
0 | 1 | 1 | 0000_1000 |
1 | 0 | 0 | 0001_0000 |
1 | 0 | 1 | 0010_0000 |
1 | 1 | 0 | 0100_0000 |
1 | 1 | 1 | 1000_0000 |
- Quartus中工程名推荐不要用数字开头,否则会报错。
例程
1、定义端口列表
2、定义端口类型
- 端口类型:input output inout(双向端口)
3、逻辑设计
- 养成良好的写注释的习惯
//Verilog语言以module+模块名开头
module my3_8(a,b,c,out);//定义端口列表
//定义端口类型input output inout(双向端口)
input a;//输入端口A
input b;//输入端口A
input c;//输入端口A
output reg [7:0]out;//表示输出信号的位宽
//[7:0]表示多位位宽,高位在前,低位在后
//或者写成 output [7:0]out; reg [7:0]out;
//逻辑设计,always语句
//Verilog语句中只要在always语句中赋值的信号,在定义时必须将其定义为reg型(寄存器),无论他是reg型还是线网型
//敏感列表,当括号中的任意信号(敏感信号)发生变化时,就会执行always@中的内容,begin和end之间就是用户逻辑。用户逻辑见上述表格
always@(a,b,c)begin
case({a,b,c})//花括号将三个信号拼接成一个三位信号,case表示情况,后面也要有endcase
3'b000:out = 8'b0000_0001;//3'b中的'为Enter左边的按键,和testbench开头的不同
3'b001:out = 8'b0000_0010;//3表示输入信号的位宽,位宽长度为7-0+1=8
3'b010:out = 8'b0000_0100;//b表示二进制
3'b011:out = 8'b0000_1000;//_表示占位符,无任何意义,只是为了便于区分
3'b100:out = 8'b0001_0000;//out为是上边定义的输出端口
3'b101:out = 8'b0010_0000;
3'b110:out = 8'b0100_0000;
3'b111:out = 8'b1000_0000;
//default:out = 8'b1000_0000;//具体情况中如果case不包含所有的情况,只选择几种情况进行输出,即剩下的情况对应的输出
endcase//又开始就有结束
end
endmodule
4、分析与综合
//保存在testbnech文件夹下
//testbench是一张桌子,上面放置着我们的待测模块、激励信号源以及信号观测的示波器
//定义一个仿真精度,前面为仿真步进,后面为仿真精度
//`为Esc下按键,并非Enter旁的', 错误会使得程序报错
//1为数字1,并非i
`timescale 1ns/1ps
module my3_8_tb;
reg a; //测试激励源,a,b,c,out
reg b; //reg型的为激励信号源
reg c;
wire [7:0] out ; //wire型的为输出信号的观测信号
//定义好了之后将其一一对应起来
//模块例化
my3_8 u1( //直接复制待测试模块的模块名以及端口,并给其编一个号u1
.a(a),
.b(b),
.c(c),
.out(out)
);
//信号激励的产生
initial begin
a = 0;b = 0;c = 0;
#200;
a = 0;b = 0;c = 1;
#200;
a = 0;b = 1;c = 0;
#200;
a = 0;b = 1;c = 1;
#200;
a = 1;b = 0;c = 0;
#200;
a = 1;b = 0;c = 1;
#200;
a = 1;b = 1;c = 0;
#200;
a = 1;b = 1;c = 1;
#200;
$stop;//系统函数,将仿真停止下来,如果不写,会使得仿真一直运行
end
endmodule
- 将文件连接起来进行前仿真和后仿真
- 实验结果及分析
- OUT是输出信号,必须根据输入来确定,在上电的零时刻是未知的,又有一定的延时,所以开始时刻,OUT输出的是红线。短暂时间后恢复到正确的状态。
- 因内部电路结构,导致电路中信号到达的时间不一样(组合逻辑电路中存在竞争和冒险????),部分地方可能与正确结果不一致。(eg:从0000_0001到0000_0010可能先变为0000_0011后,再变为0000_0010)总的说,在电路变化过程中存在一些不稳定的情况,这些不稳定的情况输出而且电路反应速度够快!!!就会导致逻辑错误。这是必须要避免的。后续时序逻辑再来讲解。
- 仿真中假如不关闭仿真工具,修改代码后直接执行仿真,系统会报错检测到正在运行。因为modelsim只支持当前工程打开一次。所以必须将仿真工具关闭,后再次进行仿真。
4-16译码器
输入增加,其余的做出适当调整。