当前位置: 首页 > article >正文

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

时间:2024.11.11-11.14

一、学习内容

1.组合逻辑

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

2.多路选择器

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

3. 实验目标
       设计并实现 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;


http://www.kler.cn/a/395631.html

相关文章:

  • 给阿里云OSS绑定域名并启用SSL
  • Linux——Linux环境基础开发工具使用
  • 844.比较含退格的字符串
  • Elasticsearch 8.16:适用于生产的混合对话搜索和创新的向量数据量化,其性能优于乘积量化 (PQ)
  • c++写一个死锁并且自己解锁
  • 阿里云通义大模型团队开源Qwen2.5-Coder:AI编程新纪元
  • Datawhale模型压缩技术Task2之模型剪枝
  • 基于Java Springboot旅游信息推荐系统
  • 全面解读 USB Key:定义、使用场景、加密技术及 Java 实现
  • linux之调度管理(5)-实时调度器
  • 【计算机网络】TCP协议特点3
  • 通过地址获取LONG和LAT并且存入csv
  • ubuntu, 安装部署comfyui,记录1:
  • Nginx在Windows上和Linux上(Docker启动)分别配置基本身份认证示例
  • 计算机毕业设计Python+CNN卷积神经网络股票预测系统 股票推荐系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI
  • 千益畅行,共享旅游卡市场乱象解析与未来展望
  • Python3中str和bytes
  • STM32串口——5个串口的使用方法
  • selenium元素定位---元素点击交互异常解决方法
  • 0x00基础算法 -- 0x05 排序
  • Modern Effective C++:item 1 理解模板类型推导
  • Spring Boot 中使用 @Transactional 注解配置事务管理
  • 表的数据结构和常见操作
  • 硬盘物理故障的表现、原因和解决方法全解析
  • 鸿蒙next ui安全区域适配(刘海屏、摄像头挖空等)
  • kali上安装docker,并且生成centos7容器和创建apache容器后台运行