[实验一] 选择器

2023-05-16

该个栏目的博客都是基于南京大学的数字逻辑与计算机组成的课程设计,方便以后进行总结归纳而准备的。

这次实验是实验一:选择器。设计一个简单的选择器,介绍一些常用的多路选择器的设计方法。Verilog语言中的always语句块、if-else语句和case语句的使用等。最后请读者自行设计一个多路选择器。

1.二选一多路选择器

在这里插入图片描述
通过上述的真值表和卡诺图,可以得到二选一选择器的表达式y=(~s&a)|(a&b);以及通过表达式可以画出其实际的逻辑电路。
在这里插入图片描述
常用的有以下三种方式:数据流建模方式、结构化建模和行为级建模对电路的功能进行描述。应该要做到心中有电路,直接进行描述。而不是希望通过行为级建模的方式,让综合器生成某种行为的电路,这就偏离了“描述电路”的本质了。
基于vivado的综合,这里给出一个二选一多路选择器,采用行为级建模和数据流建模的不同之处。

数据流建模:
在这里插入图片描述
行为级建模
在这里插入图片描述
可以很明显的看出,行为级建模和数据流建模通过RTL的电路都并不相同,行为级建模是通过一个多路选择器实现的,而且数据流建模则是采用与非门实现的功能。MUX的最低的单元,可能不利于描述电路。

真正的描述电路=实例化+连线;
用HDL设计电路,就是在用HDL来描述电路图纸,图纸上有什么,就直接描述什么。所以,用HDL描述电路,无非是做两件事情:
实例化:在电路板上放一个元件/模块,可以是一个门电路,或者是由门电路组成的模块
连线:用导线将元件/模块的引脚正确地连起来
大家可以体会一下,数据流建模和结构化建模是如何体现这两件事的,而行为建模又是如何把这两件简单的事情复杂化的。所以在未掌握“描述电路”的思维而不被行为建模误导之前,我们应该远离行为建模方式,仅通过数据流建模和结构化建模方式直接描述电路。可以通过思考以下问题来帮助大家测试自己是否已经掌握了Verilog的本质
1.在硬件描述语言中,“执行”的精确含义是什么?
2.是谁在执行Verilog的语句?是电路,综合器,还是其它的?
3.if的条件满足,就不执行else后的语句,这里的“不执行”又是什么意思? 和描述电路有什么联系?
4.有“并发执行”,又有“顺序执行”,还有“任何一个变量发生变化就立即执行”,以及“在任何情况下都执行”,它们都是如何在设计出来的电路中体现的?
**虽然学了有一段时间,但这几个问题依然没有什么思路。**所以目前,不采用行为建模的方式。

2.四选一多路选择器

module mux41(a,s,y);
  input  [3:0] a;  // 声明一个wire型输入变量a,其变量宽度是4位的。
  input  [1:0] s;  // 声明一个wire型输入变量s,其变量宽度是2位的。
  output reg y;   // 声明一个1位reg型的输出变量y。

  always @ (s or a)
    case (s)
      0: y = a[0];
      1: y = a[1];
      2: y = a[2];
      3: y = a[3];
      default: y = 1'b0;
    endcase

endmodule

但不建议初学者使用case语句,因为使用case语句描述电路属于行为建模方式。随着电路变的越来越复杂,你可能会写出case语句中包含if语句,if语句中嵌套case语句的代码,但你已经完全不了解它描述的电路是什么样的了。

课程提供了一个通用的选择器模板

module MuxKeyInternal #(NR_KEY = 2, KEY_LEN = 1, DATA_LEN = 1, HAS_DEFAULT = 0) (
  output reg [DATA_LEN-1:0] out,
  input [KEY_LEN-1:0] key,
  input [DATA_LEN-1:0] default_out,
  input [NR_KEY*(KEY_LEN + DATA_LEN)-1:0] lut
);

  localparam PAIR_LEN = KEY_LEN + DATA_LEN;
  wire [PAIR_LEN-1:0] pair_list [NR_KEY-1:0];
  wire [KEY_LEN-1:0] key_list [NR_KEY-1:0];
  wire [DATA_LEN-1:0] data_list [NR_KEY-1:0];

  generate
    for (genvar n = 0; n < NR_KEY; n = n + 1) begin
      assign pair_list[n] = lut[PAIR_LEN*(n+1)-1 : PAIR_LEN*n];
      assign data_list[n] = pair_list[n][DATA_LEN-1:0];
      assign key_list[n]  = pair_list[n][PAIR_LEN-1:DATA_LEN];
    end
  endgenerate

  reg [DATA_LEN-1 : 0] lut_out;
  reg hit;
  integer i;
  always @(*) begin
    lut_out = 0;
    hit = 0;
    for (i = 0; i < NR_KEY; i = i + 1) begin
      lut_out = lut_out | ({DATA_LEN{key == key_list[i]}} & data_list[i]);
      hit = hit | (key == key_list[i]);
    end
    if (!HAS_DEFAULT) out = lut_out;
    else out = (hit ? lut_out : default_out);
  end

endmodule

这里提供的这个MuxKeyInternal的代码,等后面有时间进行解析。
但现在可以简单示范一下如何使用,需要提供键值对的数量NR_KEY,键值的位宽KEY_LEN以及数据的位宽DATA_LEN这三个参数,以及是否采用默认的输出值。当HAS_DEFAULT为0时,则默认输出全0的输出值。

3.二位四选一选择器

用选择器模板实现一个2位4选1的选择器,如下图所示,选择器有5个2位输入端,分别为X0, X1, X2, X3和Y,输出端为F;X0, X1, X2, X3是四个2位的输入变量。输出F端受控制端Y的控制,选择其中的一个X输出,当Y = 00时,输出端输出X0,即F = X0;当Y = 01时,输出端输出X1,即F = X1;以此类推。
mux4x1_2bit.v

module mux4x1_2bit(
    input   [1:0]   X0   ,
    input   [1:0]   X1   ,
    input   [1:0]   X2   ,
    input   [1:0]   X3   ,
    input   [1:0]   Y    ,
    
    output  [1:0]   F
    );
    
    MuxKeyInternal #(4, 2, 2, 1) dut (F, Y, 2'b00,{
    2'b00,X0,
    2'b01,X1,
    2'b10,X2,
    2'b11,X3
    });
    
endmodule

通过vivado进行综合:
在这里插入图片描述

4.通过NVboard实现小灯的控制

目前,还没有将NVboard配置完成,且其中的Makefile还没完全弄明白,所以等后续有时间了再补充该部分,将小灯的引脚挂载到F引脚上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[实验一] 选择器 的相关文章

  • conda新建环境时报错NotWritableError: The current user does not have write permissions

    目录 1 问题描述 2 问题原因 3 解决方案 4 测试 5 参考自 1 问题描述 在使用 conda create n environment name 命令新建环境时 xff0c 遇到错误 xff1a Solving environme
  • C++快读快写详解

    文章目录 完整的读写模板 xff08 新式 xff09 基本快读快写 xff08 旧式 xff09 更快的快读代码解释 完整的读写模板 xff08 新式 xff09 span class token macro property span
  • Anaconda 使用以及cmd命令

    在使用anaconda进行配置环境的时候 xff0c 可以再anaconda中进行环境配置 xff0c 同时也可以使用cmd利用pip或者conda在cmd命令下安装 Ubuntu指令集合 xff09 查看install清单 1 conda
  • 记录ubuntu22.04突然连不上网

    问题 xff1a ubuntu22 04莫名其妙连不上网 xff0c 右上角那个网络图标也没有 折腾了一天之后终于能连网了 因为虚拟机里装了conda环境 xff0c 装了一个机器学习框架要用的各种包 xff0c 实在不想再装一次虚拟机和环
  • IOS开发之——多线程-基础(1)

    一 概述 进程和线程多线程在IOS开发中的应用耗时操作的执行 二 进程和线程 2 1 什么是进程 进程是指在系统中正在运行的一个应用程序比如同时打开QQ Xcode xff0c 系统就会分别启动2个进程通过 活动监视器 可以查看Mac系统中
  • Word文档(.docx) 转为 Markdown文档(.md)的一种方法 —— 一款word插件(Writage)

    将Word文档转为Markdown文档 xff0c 虽然这种情况不多 xff0c 但是遇到的时候 xff0c 如果有一个顺手的插件 xff0c 那真是太舒服了 工具 xff1a Writage大小 xff1a lt 10M下载方式 xff1
  • Redis主从集群搭建(有网情况下在一台服务器)

    Redis集群搭建 简介 Redis 集群是一个提供在多个Redis节点间共享数据的程序集 Redis 集群通过分区来提供一定程度的高可用性 在实际环境中 xff0c 当某个节点宕机或者不可达的情况下能够继续提供服务 xff1b Redis
  • 操作无法完成,因为其中的文件夹或文件已在另一程序中打开 --> 彻底解决方案

    操作无法完成 xff0c 因为其中的文件夹或文件已在另一程序中打开 gt 彻底解决方案 删除文件时出现的状况 xff1a 解决方案一 打开任务管理器 xff08 快捷键Ctrl 43 alt 43 Del xff09 xff0c 选择性能
  • 重装系统后Photoshop打开提示已停止工作

    友情链接 xff1a http laozhangdongzao com 1 首先右键单击photoshop cs6 点击 属性 2 点击 兼容性 3 可以看到此时 以兼容模式运行这个程序 前未勾选 4 勾选 以兼容模式运行这个程序 xff0
  • python3—字典(dict)

    目录 1 字典的描述2 访问字典里的值3 修改字典4 删除字典元素5 字典键的特性6 字典内置函数 amp 方法 1 字典的描述 字典是另一种可变容器模型 xff0c 且可存储任意类型对象 字典的每个键值 key 61 gt value 对
  • 字母交换

    题目 字符串S由小写字母构成 xff0c 长度为n 定义一种操作 xff0c 每次都可以挑选字符串中任意的两个相邻字母进行交换 询问在至多交换m次之后 xff0c 字符串中最多有多少个连续的位置上的字母相同 xff1f 链接 思路 记录每个
  • github加载太慢以及release里面文件下载太慢或者无法下载的解决方法

    参考链接 xff1a github下载与加载慢怎么解决 1 FastGithub 项目 解决github加载太慢 xff0c 解决releases无法上传下载失败等问题 2 dev sidecar 项目 解决github加载太慢 xff0c
  • Git常用命令符

    1 强制推送 xff08 慎用 xff0c 除非你认为其他冲突等可以丢弃 或者不是很重要 xff09 git push force 2 创建文件等小命令 touch a 创建一个a文件 echo 1234 gt gt a 把1234这个内容
  • ffmpeg--libswscale(图像缩放、颜色空间和像素格式转换操作)

    libswscale介绍 span class token number 1 span span class token number 2 span 种初始化方法 xff1a span class token keyword struct
  • vmware Ubuntu22.04共享文件夹找不到问题

    1 在VMware上先配置Windows上需要共享的文件名称路径 xff0c 选择 总是开启 2 在终端执行命令 xff1a vmware hgfsclient 当前面一步配置正确会显示 xff0c windows下共享的文件夹名称 但是我
  • Ubuntu Server 22.04修改静态ip及配置网关

    1 查看本机获取的IP地址 xff1a 输入命令 ip addr xff1a 2 修改配置文件 跳转到配置文件目录 xff1a cd etc netplan 使用ls查看配置文件名称 xff1a ls 使用nano修改配置文件 xff1a
  • 【二】卷积神经网络CNN

    为什么设计神经网络的架构能让结果表现更好 xff1f 总结 本课从影像识别切入 xff0c 从全连接网络讲起 xff0c 通过2种观察得出2种简化得到了CNN xff0c 一是有些pattern仅出现在图片的一小部分提出了感受野 xff0c
  • Docker Error :Invalid or corrupt jarfile .jar

    他提示的是你的jar包有问题 xff0c 无效 那么有很多种情况 xff0c 我遇到的是两种 dockerfile有问题 xff0c 我的dockerfile一开始是直接网上复制的 xff0c 其中有一句是将jar包copy进到容器 xff
  • Python每日一编程小练习(2019.05.26)——1到3循环报数,最后留下报号不是3的位置

    题目 xff1a 有n个人围成一圈 xff0c 顺序排号 xff0c 从第一个人开始报数 xff08 从1 3报数 xff09 xff0c 凡报到3的人退出圈子 问 xff1a 最后留下的人原来排在第几号 难点 xff1a 如何定义一个能循
  • 解决Ubuntu16.04拨号上网及有线连接频繁断网的问题

    最近从Ubuntu14 04换到了16 04 xff0c 学校又从锐捷校园网换成了深澜 xff0c 于是上网时候遇到了一些小问题 首先解决在Ubuntu下拨号上网 首先终端输入 sudo pppoeconf 之后就会出现一个界面 xff0c

随机推荐