FPGA入门笔记(野火系列教程)


Gitee仓库:https://gitee.com/Shaoyang1202/FPGA_Verilog

组合逻辑

组合逻辑电路的输出信号只与当前时刻输入信号有关,无储存电路。

多路选择器

也称多路开关,可以将多路信号中任意一路选择出来作为输出

  • 实例:二输入选择器
    RTL文件:
module Data_selector
(
   input   wire    [0:0]   in_1,//[0:0]表示1位宽,1位宽也可以不写
   input   wire            in_2,//input+wire/reg(类型)+位宽+信号名
   input   wire            sel ,
   
   output  reg             out  //最后一条信号后面不用加逗号    
);
                                //使用always进行赋值
always@(*)                       //()内是敏感条件,*表示任何信号有电平变化就执行,等于always@(sel,in_1,in_2)
   if(sel == 1'b1)              //当sel为高电平时
       begin                    //如果只有一行赋值,begin、end可省略
       out = in_1;              //组合逻辑要用阻塞赋值
       end
   else    
       out = in_2;
endmodule

tb文件:

`timescale 1ns/1ns  //时间单位/时间精度

module  tb_Data_selector();

reg     in_1;
reg     in_2;
reg     sel ;

wire    out ;

initial     //上电只执行一次,给输入信号赋初值
   begin
       in_1    <=  1'b0;   //非阻塞赋值
       in_2    <=  1'b0;
       sel     <=  1'b0;
   end
   
always #10 in_1 <= {$random} % 2; //十个时间单位的延时,随机数对2取余非零即1,每隔10个时间单位对in_1赋值
always #10 in_2 <= {$random} % 2;
always #10 sel  <= {$random} % 2;

initial
   begin
       $timeformat(-9,0,"ns",6);   //设置时间格式的系统函数,-9表示10的-9次方->纳秒,0表示保留到小数点后0位
       $monitor("@time %t:in_1=%b in_2=%b sel=%b out=%b",$time,in_1,in_2,sel,out);//对电平变化实时打印
   end

Data_selector   Data_selector_inst1     //对模块实例化  
(
      .in_1(in_1),     //alt+左键可以列选择
      .in_2(in_2),     //将仿真模块中生成的模块中的信号与被仿真模块连接
      .sel (sel),
           
      .out (out) 
);
endmodule

添加tb文件在这里插入图片描述
在这里插入图片描述
选择tb文件位置:
在这里插入图片描述
ModelSim仿真
在这里插入图片描述
仿真结果
在这里插入图片描述

译码器

理论

译码是编码的逆过程,可分为变量译码、显示译码,

实战-三八译码器
  1. always实现:
/*
always语句实现2022/4/27
*/
module Decoder
(
    input   wire        in_1,
    input   wire        in_2,
    input   wire        in_3,
    
    output  reg   [7:0] out
);

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;
endmodule

综合电路图:
在这里插入图片描述
2. case实现

module Decoder
(
    input   wire        in_1,
    input   wire        in_2,
    input   wire        in_3,
    
    output  reg   [7:0] out
);

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;   //避免launch
    endcase
endmodule

综合电路图:
在这里插入图片描述

always语句实现有优先级区别,case没有优先级,所以case实现综合后为数据选择器

  • 仿真:
    tb文件
`timescale 1ns/1ns

module  Decoder_tb();

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 in_1 <= {$random} % 2;
always #10 in_2 <= {$random} % 2;
always #10 in_2 <= {$random} % 2;
initial
    begin
        $timeformat(-9,0,"ns",6);
        $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_1)是仿真模块中生成的,与仿真模块中一致
    .in_2(in_2),
    .in_3(in_3),
    
    .out(out)
);
endmodule

在ModelSim仿真界面ctrl+a可以选中所有波形,选中波形后ctrl+g可以对波形进行分组,图示位置可以显示/隐藏变量的路径
在这里插入图片描述
如图、可以设置变量显示的进制
在这里插入图片描述
仿真结果:
在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 野火FPGA教程PDF是一份详细的FPGA入门教程,它详细介绍了FPGA的工作原理、开发环境的搭建、基本的Verilog语言知识以及FPGA开发上的基本操作和常用技巧等内容。 在PDF中,你可以了解到FPGA是什么,它具有什么特点以及它如何应用在各种领域中。同时,该教程提供了大量的图文教程,手把手教导你如何在Windows、Linux或Mac环境下搭建FPGA开发环境,安装相关软件以及调试FPGA开发板。 在学习过程中,你将学习到如何使用Verilog语言进行FPGA开发,包括数据类型、操作符、模块设计等方面的知识。实践中,你将学习如何使用Quartus II软件来实现FPGA的编译、仿真以及烧录等操作。你将进一步学习如何使用FPGA开发板实现项目的实际应用。 总的来说,野火FPGA教程PDF内容涵盖了FPGA入门知识和基本应用,几乎从零开始,循序渐进地教你如何开始使用FPGA开发。它是学习FPGA的绝佳入门教材,对于初学者以及想进一步了解FPGA编程的人来说都是非常有用的。 ### 回答2: 野火fpga教程pdf是一本关于基于野火FPGA实验板的FPGA开发教程。这本教程系统地介绍了FPGA的基础知识,包括FPGA的结构、原理和基本概念等。随后,教程详细介绍了FPGA开发流程和开发环境,并通过实例讲解了如何利用野火FPGA实验板进行FPGA程序的设计、编译、仿真和调试等工作。 此外,教程还介绍了如何使用常见的开发工具进行FPGA设计,包括Quartus II、ISE等。在示例程序部分,教程提供了多个FPGA应用实例,每个实例都有详细的设计过程和开发步骤,使读者能够迅速掌握FPGA开发的核心技能。 通过野火fpga教程pdf,读者可以了解FPGA的基础知识,并学会如何使用野火FPGA实验板进行FPGA开发和调试。对于想要进入FPGA领域的初学者来说,这是一本非常实用的教程,可以帮助他们快速掌握FPGA开发的技术。同时,对于已经从事FPGA开发的工程师来说,也是一本很好的参考书籍,可以提升他们的技能水平和开发效率。 ### 回答3: 野火FPGA教程是一本非常详细的FPGA学习资料,可以帮助初学者快速入门FPGA技术,了解FPGA的基本概念、FPGA的工作原理、FPGA的设计方法等,同时提供了很多实际的FPGA设计案例,可以让读者深入了解FPGA的应用场景和实现方法。 野火FPGA教程主要分为三个部分: 第一部分是基础篇,介绍了FPGA的基本原理、开发环境的搭建、常用的FPGA开发板、FPGA设计中常见的HDL语言等。这一部分的内容对初学者来说非常友好,既不会太过简单又不会太过复杂,能够帮助读者快速上手。 第二部分是进阶篇,介绍了FPGA的高级应用和设计方法,包括FPGA的时序分析、时钟设计、资源优化等。这一部分的内容比较深入,需要较强的FPGA基础和编程经验。 第三部分是案例篇,提供了多个实用的FPGA设计案例,包括数字时钟、音乐播放器、ATM机等。这些案例通过具体的实现可以帮助读者加深对FPGA应用的理解,让读者更好地掌握FPGA设计的方法。 总之,野火FPGA教程是一本非常优秀的FPGA学习资料,不仅覆盖了FPGA的基础知识和设计方法,而且提供了大量的实战案例,是一本值得入手的FPGA教程

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Liweiei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值