FPGA学习笔记-2、译码器

本文介绍了如何使用Verilog语言设计并仿真3-8线译码器,包括定义输入输出端口、逻辑设计、模块实例化和测试激励的产生。在仿真过程中,注意到由于组合逻辑电路的延迟可能导致短暂的不稳定状态,这在高速电路设计中需要避免。同时,提到了4-16译码器作为进一步的扩展话题。
摘要由CSDN通过智能技术生成

3-8译码器

ABCOUT
0000000_0001
0010000_0010
0100000_0100
0110000_1000
1000001_0000
1010010_0000
1100100_0000
1111000_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译码器

输入增加,其余的做出适当调整。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值