Verilog编程基础练习——3-8译码器仿真实验

一、ModelSim下载安装和基本用法

ModelSim是一种用于硬件描述语言的仿真和调试工具。它可以帮助硬件工程师在将设计实际实现到硬件之前验证其设计。

下载与安装:

  1. 官方网站:首先,你可以从 ModelSim 的官方网站或去B站博主的一些相关视频那里获取软件。通常,它是作为一个独立的仿真工具或与其他设计套件捆绑在一起提供的。

  2. 安装:安装过程可能因你使用的版本而异,但通常包括运行安装程序、选择安装目录以及遵循安装向导的步骤。

基本用法:

一旦安装完成,你可以按照以下步骤使用 ModelSim:

  1. 创建工程: 打开 ModelSim,创建一个新的工程,并添加你的设计文件(Verilog、VHDL 等)。

  2. 编译: 在工程中进行编译,这将把你的设计翻译成模型可以理解的格式。

  3. 仿真: 运行仿真以验证你的设计。你可以设置仿真时长、观察信号波形,以及在仿真过程中调试。

  4. 波形查看: 在 ModelSim 中,有一个波形查看器,你可以使用它来查看信号的变化以及仿真的结果。

  5. 调试: 如果在仿真过程中发现问题,可以使用 ModelSim 提供的调试功能来定位和解决问题。

二、Quartus下载安装和基本用法

Quartus Prime是由Intel(前身为 Altera)开发的一套用于 FPGA(可编程门阵列)设计的综合工具。它提供了设计、验证和实现数字电路的功能。

下载与安装:

  1. 官方网站:首先,你可以从 Intel 的官方网站或其指定的下载渠道获取 Quartus Prime。访问 Intel 官方网站 下载页面。

  2. 选择版本:选择适用于你的操作系统的 Quartus 版本。 Quartus Prime 包括 Standard 和 Lite 两个版本,根据你的需求选择适当的版本。

  3. 安装:下载完成后,运行安装程序并按照安装向导的步骤进行安装。你可能需要注册并获取许可证。

基本用法:

一旦安装完成,你可以按照以下步骤使用 Quartus Prime:

  1. 创建工程: 打开 Quartus Prime,创建一个新的工程。在工程中,你需要定义你的设计文件(Verilog、VHDL 等)。

  2. 设计输入: 输入你的设计,可以使用 Block Diagram、Schematic 或 HDL(硬件描述语言)。

  3. 编译: 在 Quartus 中进行编译,这将把你的设计综合成逻辑网表(Logic Netlist)。

  4. 实现: 进行布局(Place)和布线(Route)以确定在 FPGA 上的具体位置和连接方式。

  5. 时序分析: 进行时序分析以确保设计满足时序约束。

  6. 生成文件: 生成配置文件和比特流文件,用于烧录到目标 FPGA 设备。

  7. 下载到 FPGA: 将生成的比特流文件下载到目标 FPGA 上进行实际硬件实现。

三、3-8译码器原理及仿真实验 

 (一)3-8译码器原理

原理:3-8译码器是一种数字电路,它具有三个输入线和八个输出线。其功能是将三位二进制输入代码映射到其中一个输出线上。每一种可能的输入组合都对应着 8 个输出线中的一个,而其他七个输出线则保持低电平状态。

具体而言,对于一个3-8译码器:

  • 输入线:有三条输入线,分别标记为 A, B, 和 C。
  • 输出线:有八条输出线,标记为 Y0, Y1, Y2, ..., Y7。

(二)3-8译码器真值表 

(三)在logsim中进行电路仿真 

(四)在quartus中进行模拟

module Decoder_3to8 (
  input [2:0] input_code,  // 3-bit输入
  output [7:0] output_lines  // 8个输出线
);

  assign output_lines[0] = (input_code == 3'b000) ? 1'b1 : 1'b0;
  assign output_lines[1] = (input_code == 3'b001) ? 1'b1 : 1'b0;
  assign output_lines[2] = (input_code == 3'b010) ? 1'b1 : 1'b0;
  assign output_lines[3] = (input_code == 3'b011) ? 1'b1 : 1'b0;
  assign output_lines[4] = (input_code == 3'b100) ? 1'b1 : 1'b0;
  assign output_lines[5] = (input_code == 3'b101) ? 1'b1 : 1'b0;
  assign output_lines[6] = (input_code == 3'b110) ? 1'b1 : 1'b0;
  assign output_lines[7] = (input_code == 3'b111) ? 1'b1 : 1'b0;

endmodule

这个 Verilog 代码中,Decoder_3to8模块有一个3位的输入input_code和8位的输出output_lines。每个输出线通过赋值语句根据输入码的不同条件进行赋值。请注意,这只是一个简单的例子,实际上,3-8译码器通常会使用更复杂的逻辑电路进行实现。此处的代码主要用于演示Verilog中描述3-8译码器的基本方法。在实际的工程中,可能会使用更优化的逻辑电路来实现这一功能。

生成RTL电路图:

代码测试:

// Copyright (C) 1991-2013 Altera Corporation
// Your use of Altera Corporation's design tools, logic functions 
// and other software and tools, and its AMPP partner logic 
// functions, and any output files from any of the foregoing 
// (including device programming or simulation files), and any 
// associated documentation or information are expressly subject 
// to the terms and conditions of the Altera Program License 
// Subscription Agreement, Altera MegaCore Function License 
// Agreement, or other applicable license agreement, including, 
// without limitation, that your use is for the sole purpose of 
// programming logic devices manufactured by Altera and sold by 
// Altera or its authorized distributors.  Please refer to the 
// applicable agreement for further details.
// *****************************************************************************
// This file contains a Verilog test bench template that is freely editable to  
// suit user's needs .Comments are provided in each section to help the user    
// fill out necessary details.                                                  
// *****************************************************************************
// Generated on "12/15/2023 16:30:15"
                                                                                
// Verilog Test Bench template for design : Decoder_3to8
// 
// Simulation tool : ModelSim (Verilog)
// 
 
`timescale 1 ps/ 1 ps
module Decoder_3to8_vlg_tst();
// constants                                           
// general purpose registers
reg eachvec;
// test vector input registers
reg [2:0] input_bits;
// wires                                               
wire [7:0]  output_bits;
 
// assign statements (if any)                          
Decoder_3to8 i1 (
// port map - connection between master ports and signals/registers   
	.input_bits(input_bits),
	.output_bits(output_bits)
);
initial                                                
begin                                                  
$display("Running testbench");        
 
	 // Test case 1
    input_bits = 3'b000;
    #10;
    if (output_bits !== 8'b00000001) $fatal("Test case 1 failed");
    // Test case 2
    input_bits = 3'b001;
    #10;
    if (output_bits !== 8'b00000010) $fatal("Test case 2 failed");
	 // Test case 3
    input_bits = 3'b010;
    #10;
    if (output_bits !== 8'b00000100) $fatal("Test case 3 failed");
	 // Test case 4
    input_bits = 3'b011;
    #10;
    if (output_bits !== 8'b00001000) $fatal("Test case 4 failed");
	 // Test case 5
    input_bits = 3'b100;
    #10;
    if (output_bits !== 8'b00010000) $fatal("Test case 5 failed");
	 // Test case 6
    input_bits = 3'b101;
    #10;
    if (output_bits !== 8'b00100000) $fatal("Test case 6 failed");
	 // Test case 7
    input_bits = 3'b110;
    #10;
    if (output_bits !== 8'b01000000) $fatal("Test case 7 failed");
	 // Test case 8
	 input_bits = 3'b111;
    #10;
    if (output_bits !== 8'b10000000) $fatal("Test case 8 failed");
 
end                                                    
always
             
begin                                                                                                        
@eachvec;                                                                                         
end                                                    
endmodule
 

 (五)在modelsim中进行仿真并生成波形图

(六)问题解决

1、Verilog 综合生成的3-8译码器电路原理图与原始设计电路存在什么差异?仿真测试生成的结果是否与真值表一致? 

(1)原理图与原始设计电路基本没有什么差异,存在的差异可能是对Verilog代码进行逻辑优化,以减小了电路的面积、功耗或提高性能,这可能导致生成的电路与原始设计的逻辑电路不同。

(2)仿真测试生成的结果与真值表一致。

2、Verilog代码设计的3-8译码器模块的输出信号为何要定义为reg类型而不用默认wire(导线)类型?改成wire型是否可以?(即是否可以把 output reg [7:0] out  改为 output  [7:0] out) 修改后会出现什么错误?为什么会出错? 

(1)定义为reg类型而不用默认wire(导线)类型:在Verilog中,reg 和 wire 是两种不同的数据类型,用于描述信号的行为方式。一般情况下,reg用于描述存储器件,而 wire 用于描述组合逻辑电路的连线。模块的输出通常需要在组合逻辑中进行赋值,而 reg 具备这种可赋值的特性,3-8译码器模块的输出信号 out 是被赋值的,所以要定义为reg类型。

(2)改成wire型是否可以:虽然在某些情况下,你可以使用 wire 类型来声明模块的输出,但为了避免混淆和与传统实践保持一致,通常建议使用 reg 类型。

  • 18
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值