FPGA 第6讲 简单组合逻辑多路选择器

时间:2024.11.11-11.14

一、学习内容

1.组合逻辑

组合逻辑是VerilgHDL设计中一个重要组成部分。从电路本质上讲,组合逻辑电路的特点是输出信号只是当前时刻输入信号的函数,与其他时刻的输入状态无关,无存储电路,也没有反馈电路。

2.多路选择器

多路选择器是数据选择器的别称。在多路数据传送过程中,能够根据需要将其中任意一路选出来的电路,叫做数据选择器,也称多路选择器或多路开关。

  1. 实验目标

设计并实现 2 选 1 多路选择器,主要功能是通过选通控制信号 S 确定选通 A 路或 B 路作为信号输出。当选通控制信号 S 为 1 时,信号输出为 A 路信号;当选通控制信号 S 为 0时,信号输出为 B 路信号。

开发板的按键未按下时为高电平、按下后为低电平;LED 灯则为低电平点亮。

二、实验

1.准备工作

新建文件夹存放工程

2.利用visio绘制和波形图

++蓝色的线代表有效信号。++

3. 代码编写

在rtl文件夹里新建.v文件进行编写代码

3.1编写代码

方法一:使用always进行组合逻辑的编写,同时使用if-else条件分支语句进行多路选择器的实现
复制代码
module mux2_1      //模块名称与文件名尽量保持一致
(
    input   wire    [0:0]  in_1,  //输入信号1
    input   wire           in_2;  //输入信号2
    input   wire           sel,   //选通信号
    
    output  reg           out     //输出信号

);
//用always给变量赋值,()里面是敏感条件,*表示通配符,在此处表示任何一个信号只要有电平变化都要执行这条语句
//此处*相当于sel,in_1,in_2
always@(*)
   if(sel==1'b1)
    out = in_1;
  else
    out = in_2;
endmodule
方法二:使用always-case进行代码编写
方法三:使用assign中的三目运算符进行编写代码

3.2实验工程的创建

在Quartus里创建工程,添加.v文件,进行编译,编译成功后进行仿真文件的书写

3.3编写仿真文件

在sim文件夹里创建.v文件,进行仿真文件的编写

复制代码
`timescale 1ns/1ns
module tb_mux2_1();
//仿真文件就是要对我们被仿真的模块进行一个输入信号的模拟
reg    in_1;
reg    in_2;
reg    sel;
//进行输出信号的命名,将输出信号引出,便于信号的观察
wire   out;
//initial语句上电只执行一次,它的结构一般是initial-begin-end
//在仿真文件中,begin-end之间的内容都是顺序执行的,在没有延时的情况下,几乎没有差别,看上去像并行执行
//在rtl语句中,begin-end相当于括号的作用,在同一个always块中,如果给多个变量赋值,要使用begin-end
initial
   begin
       in_1  <= 1'b0;
       in_2  <= 1'b0;
       sel   <= 1'b0;
   end
//对三个输入信号进行随机数的赋值
//每隔10ns对in_1进行一次赋值,赋值的是一个随机的数(0/1)
always #10 in_1 <= {$random}%2;           //$random随机数的产生,系统函数
always #10 in_2 <= {$random}%2;
always #10 sel  <= {$random}%2;

//为了便于观察,需要添加一些系统函数
initial
    begin
         $timeformat(-9,0,"ns",6);   //显示时间格式是ns,10的-9次方,0表示小数点后的位数(精确度)
                                     //""里写的内容要和-9处写的对应,6表示打印的最小数字字符是6个
         $monitor("@time %t:in1=%b in2=%b sel=%b out=%b",$time,in_1,in_2,sel,out);  //监测的系统函数,便于观察
    end






//实例化:在仿真文件中调用我们被仿真的文件
mux2_1    mux2_1_inst  //模块名   实例化名称(如果实例化了多次,可以在实例化名称后面加数字,例如mux2_1_inst3)
(
//此处的.代表连接
   . in_1(in_1),  //输入信号1
   . in_2(in_2),  //输入信号2
   . sel (sel),   //选通信号

   . out (out)    //输出信号

);

endmodule

3.4仿真波形验证

添加文件后,在modelsim里面进行仿真波形的验证

3.5上板验证

引脚约束后,连接开发板,进行上板验证

三、实验结果

波形图

打印结果

四、知识点和小技巧

1.模块名称与文件名尽量保持一致

2.代码编写规范

输入一定是wire类型;

一位宽可以不写,也可以写成0:0;

输出可以是wire或reg类型,用always赋值的变量是reg型;

最后一条信号后面不需要加,

*表示通配符;

每个模块只能有一组module和endmodule,所有的模块要在这两个之间进行编写

3.设置时间格式的系统函数$timeformat

复制代码
$timeformat(-9,0,"ns",6);   //显示时间格式是ns,10的-9次方,0表示小数点后的位数(精确度)
                                     //""里写的内容要和-9处写的对应,6表示打印的最小数字字符是6个

4.获取随机数的系统函数$random

复制代码
//对三个输入信号进行随机数的赋值
//每隔10ns对in_1进行一次赋值,赋值的是一个随机的数(0/1)
always #10 in_1 <= {$random}%2;           //$random随机数的产生,系统函数
always #10 in_2 <= {$random}%2;
always #10 sel  <= {$random}%2;
相关推荐
泛联新安6 小时前
FPGA仿真加速:AccEmu正式亮相,一周的回归,一天跑完
机器学习·fpga开发·数据挖掘·回归·自动化·嵌入式软件·代码漏洞扫描
Terasic友晶科技6 小时前
【教程】Agilex 5 SOC FPGA的HPS端如何响应FPGA端中断(四)——设计中断驱动程序
fpga开发·hps·fpga端中断·设计中断驱动程序
szxinmai主板定制专家21 小时前
基于 RK3588+RK1820/28 算力卡的国产工控机,适用于机器视觉,机器人等边缘算力场景
人工智能·fpga开发·zynq·控制器·mpsoc·半导体设备
unicrom_深圳市由你创科技1 天前
硬件在环(HIL)测试在FPGA项目中为什么重要?
fpga开发
嵌入式-老费1 天前
esp32开发与应用(和高云FPGA的配合)
fpga开发
156002548401 天前
基于3U VPX总线架构的VU37P FPGA高带宽HBM缓存数据处理卡(缓存带宽480GB/s)
fpga开发·架构
szxinmai主板定制专家1 天前
基于 RK3576 的智能割草机器人解决方案,从样机到量产
人工智能·嵌入式硬件·计算机视觉·fpga开发·机器人·rk3588+fpga·割草机器人
续写烂尾2 天前
SD NAND vs SPI NAND:接口协议、坏块管理与开发成本全面对比
fpga开发
叶子野格2 天前
《Verilog学习:数字系统设计基础》
学习·fpga开发
花 满 楼2 天前
TPWM — PWM 测量模式(TIM PWM Measurement Mode)
单片机·嵌入式硬件·fpga开发