FPGA组合逻辑设计——译码器

本文详细介绍了如何使用Verilog设计并实现138译码器,包括模块接口定义、逻辑代码编写及Modelsim仿真验证过程。通过具体的代码示例和仿真结果,展示了组合逻辑电路设计的完整流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

导读

在数字电路中可以根据电路功能的不同分为组合逻辑电路与时序逻。

组合逻辑

组合逻辑电路在逻辑功能上的特点是任意时刻的输出仅仅取决于该时刻的输入,与电路原来的状态无关。

时序逻辑

而时序逻辑电路在逻辑功能上的特点是任意时刻的输出不仅取决于当时的输入信号,而且还取决于电路原来的状态,或者说,还与以前的输入有关。

组合逻辑设计之译码器

在次中将通过一个组合逻辑电路的设计再次熟悉 Quartus Prime 工程的建立以及完整的 FPGA 开发流程,并以138译码器为例学习简单的组合逻辑电路设计。

译码器

译码器是一种具有“翻译”功能的逻辑电路,这种电路能将输入二进制代码的各种状态,按照其原意翻译成对应的输出信号。以常见的138译码器为例,这是其真值表:
138译码器真值表 我们忽略掉其它信号,仅看输入(A)和输出(Y’),我们可以看到,每一个二进制输入对应着一个低电平输出。

138译码器Verilog实现

从上图中,我们可以得到模块的接口图:

根据这个模块,我们可以写出接口列表:
module decoder_138(
	a0,
	a1,
	a2,
	out_n

);
	input a0;
	input a1;
	input a2;
	output reg [7:0] out_n;//输出为8位,低电平有效

在根据138的真值表,我们可以写出译码部分的代码:

always @ (a0 or a1 or a2)
   begin
     case({a0,a1,a2})
        3'b000:out_n = 8'b1111_1110;
        3'b001:out_n = 8'b1111_1101;
        3'b010:out_n = 8'b1111_1011;
        3'b011:out_n = 8'b1111_0111;
        3'b100:out_n = 8'b1110_1111;
        3'b101:out_n = 8'b1101_1111;
        3'b110:out_n = 8'b1011_1111;
        3'b111:out_n = 8'b0111_1111;
     endcase
	end

代码写完以后,我们怎么验证代码是否正确呢?难道我们要像单片机一样,将"代码"烧到板子上验证,这样未免太麻烦了。我们可以使用Modelsim进行仿真验证。

仿真脚本的编写

仿真时间

首先是仿真时间单位以及仿真精度。

`timescale 1ns/1ns  //仿真时间单位为1ns,仿真精度为1ns。

模块例化

然后是被测试模块的端口和例化,需要注意的是在仿真脚本中,输入只能是reg型,输出只能是wire型。同时注意位宽。

module decoder_138_tb;
	reg a0;  
	reg a1;
	reg a2;
	wire [7:0] out_n;
	
decoder_138 decoder0(
	.a0(a0),
	.a1(a1),
	.a2(a2),
	.out_n(out_n)
); 

例化模块的时候注意,前面是元件名,后面是模块名,这两个之间的关系就类似于这样:

C语言定义变量inta
模块例化decoder_138decoder0

激励信号的产生

激励信号是什么呢,说得简单点就是模块的输入。

integer i;  //int型变量
initial begin

  i = 0;
  a0 = 0;
  a1 = 0;
  a2 = 0;
  #200 //延时200ns
  for(i=0;i<8;i=i+1)
    begin
      {a0,a1,a2} = i;//改变输入值,只会取i的低三位
      #200;
    end
  $stop;
end

在这里稍微偷了下懒,用了一个位拼接和for循环来赋值,其实应该这么写:

initial begin
a0 = 0; a1 = 0; a2 = 0; //初始三个输入均为 0
#200; 					 //200ns 的延时
a0 = 0; a1 = 0; a2 = 1; 
#200; 
a0 = 0; a1 = 1; a2 = 0; 
............

这样虽然很麻烦,但是很直观。

仿真结果

确认没什么问题以后,设置好仿真脚本,就可以开始仿真了,这是译码器的仿真结果:

从图中可以看出,输入输出关系和138译码器的真值表一模一样。 也许这样不太好分析输入与输出的关系,我们可以将输入信号组合起来。
这样就很输入与输出的关系就很直接了。
从以上的仿真可以看出,本次设计的138译码器仿真结果与真值表完全一样,并无任何异常。除了译码器以外,还可以设计编码器,数据选择器,全加器等等一些其它的组合逻辑电路。
<think>嗯,用户想找关于运动码表的组合逻辑设计的设计报告或者PDF下载,或者是实现方案。首先,我需要确定“运动码表”具体指的是什么。可能是指运动用的计时器,比如跑步、游泳等运动中使用的数字码表,能够记录时间、圈数等信息。组合逻辑设计应该是指使用数字电路中的组合逻辑来实现部分功能,比如显示控制、按键处理等。 接下来,我应该考虑用户可能需要的内容。设计报告通常包括设计目的、原理分析、电路图、仿真结果、实现步骤等。组合逻辑设计部分可能涉及状态机、计数器、译码器、显示驱动等模块。用户可能需要具体的实现方案,比如使用Verilog或VHDL代码,或者是基于FPGA/CPLD的开发流程。 然后,我需要检查用户提到的引用内容是否有帮助。引用[2]提到Python的缩进规则,这可能与代码结构有关,但用户的问题是关于硬件设计的,所以相关性不大。引用[1]讨论的是IOC框架的适用场景,可能与当前问题无关。因此,可能需要忽略这些引用,专注于组合逻辑设计和运动码表的相关资料。 用户可能需要具体的资源链接,但由于版权或访问限制,直接提供PDF下载可能有困难。因此,我应该建议用户通过学术数据库、技术论坛或开源平台搜索相关关键词,比如“运动码表 组合逻辑设计 报告”、“digital stopwatch combinational logic design report”等。此外,可以推荐一些常见的学习资源网站,如IEEE Xplore、ResearchGate、GitHub等,或者提供一些实现方案的基本步骤,供用户参考。 还需要考虑用户可能的背景。如果用户是学生或电子爱好者,可能需要较为基础的设计指导;如果是专业人士,可能需要更详细的方案或优化方法。因此,回答应兼顾不同层次的需求,提供多种途径的建议,并提醒注意设计中的关键点,如时序控制、按键去抖动、显示模块驱动等。 最后,生成相关问题,帮助用户进一步深入探索,比如设计工具、仿真验证方法、常见问题解决等。这样既回答了用户的问题,又提供了扩展思路的方向。</think>关于“运动码表的组合逻辑设计设计报告”相关信息,以下是分步说明和建议: 1. **明确设计需求** - 运动码表核心功能通常包括:计时(启动/暂停/复位)、分段计时、显示模块驱动等 - 组合逻辑设计需包含:时钟分频电路、按键消抖模块、BCD计数器、七段译码器等 2. **推荐检索策略** - 使用精确搜索语法: ``` "运动码表" AND ("组合逻辑设计" OR "数字电路设计") filetype:pdf "digital stopwatch" ("combinational logic" OR "VHDL implementation") site:.edu ``` - 尝试专业平台: * IEEE Xplore(需机构访问权限) * 中国知网(CNKI)检索学位论文 * GitHub搜索开源项目(如搜索"digital-stopwatch verilog") 3. **典型设计框架参考** ```verilog // 示例模块结构 module stopwatch( input clk, reset, input start_stop, output [6:0] seg, output [3:0] an ); // 包含分频器、控制逻辑、计数器、显示驱动等子模块 endmodule ``` 4. **关键设计要点** - 按键消抖电路:使用施密特触发器+延时计数器实现 - 显示刷新控制:动态扫描频率建议在60-100Hz之间 - 计时精度处理:通过基准时钟分频实现毫秒级计时 - 状态机设计:最少包含IDLE/RUNNING/PAUSED三个状态 5. **推荐实现工具** - 仿真工具:ModelSim/Logisim - 综合工具:Xilinx ISE/Vivado - 开发板:Basys3/Nexys4系列FPGA
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值