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

HDLBits: 在线学习 SystemVerilog(十一)-Problem 60-64

HDLBits: 在线学习 SystemVerilog(十一)-Problem 60-64

a653d6336ebdfe09513c5da70add1f7d.jpeg

HDLBits 是一组小型电路设计习题集,使用 Verilog/SystemVerilog 硬件描述语言 (HDL) 练习数字硬件设计~

网址如下:

https://hdlbits.01xz.net/

关于HDLBits的Verilog实现可以查看下面专栏:

https://www.zhihu.com/column/c_1131528588117385216

缩略词索引:

  • SV:SystemVerilog

从今天开始新的一章-Circuits,包括基本逻辑电路、时序电路、组合电路等。

今天更新整个多路选择器一小节题目,多路选择器也是组合电路的基本电路。

Problem 60-Mux2to1

题目说明

创建一个一位宽2路选择器。当 sel=0 时,选择 a。当 sel=1 时,选择 b。

模块端口声明

module top_module( 
    input a, b, sel,
    output out );

题目解析

这个题目没什么难度,看下面参考代码即可:

module top_module( 
    input logic a, b, sel,
    output logic out ); 
 
    assign out = sel ? b : a;
    
    
endmodule
f5509f9b3dcc1291ac19ef43667ba0b3.png

点击Submit,等待一会就能看到下图结果:

1fc11058bdc4dc0b2a6d379bc5168c88.png

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。

Problem 61-Mux2to1v

题目说明

创建一个100位宽2路选择器。当 sel=0 时,选择 a。当 sel=1 时,选择 b。

模块端口声明

module top_module( 
    input [99:0] a, b,
    input sel,
    output [99:0] out );

题目解析

这道题难度不大核心代码只有一行。

简单解答

module top_module( 
    input logic [99:0] a, b,
    input logic sel,
    output logic [99:0] out );

    
    assign out = sel ? b : a;

endmodule
03e0cf530c3b10af65a7c7b48fed8615.png

点击Submit,等待一会就能看到下图结果:

0b20916cefff862f284c5d90434ccaf7.png

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。

Problem 62-Mux9to1v

题目说明

创建一个 16 位宽的 9 选 1 多路选择器。sel=0 选择 a,sel=1 选择 b,等等。对于未使用的情况(sel=9 到 15),将所有输出位设置为“1”。

模块端口声明

module top_module( 
    input [15:0] a, b, c, d, e, f, g, h, i,
    input [3:0] sel,
    output [15:0] out );

题目解析

这种多路选择,用条件运算显然不合适,所以我们选择使用case。

module top_module( 
    input logic [15:0] a, b, c, d, e, f, g, h, i,
    input logic [3:0] sel,
    output logic [15:0] out );

    always_comb begin
        case(sel)
            4'd0:begin
                out = a;
            end
            4'd1:begin
                out = b;
            end
            4'd2:begin
                out = c;
            end
            4'd3:begin
                out = d;
            end
            4'd4:begin
                out = e;
            end
            4'd5:begin
                out = f;
            end
            4'd6:begin
                out = g;
            end
            4'd7:begin
                out = h;
            end
            4'd8:begin
                out = i;
            end
            default:begin
                out = 16'hffff;
            end
        endcase
    end

endmodule
975f740c6568e92eeeba4986c764cd43.png

点击Submit,等待一会就能看到下图结果:

b8758e45b137e021bcfa0e15a3420e6b.png

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。

Problem 63-Mux256to1

题目说明

创建一个 1 位宽、256 选 1 的多路选择器。256 个输入打包成一个 256 位输入向量。sel=0 应该选择in[0], sel=1 选择in[1]位, sel=2 选择in[2]位,等等。

模块端口声明

module top_module( 
    input [255:0] in,
    input [7:0] sel,
    output out );

题目解析

题目输入是一个向量,我们在设计的时候不可能按照case或者三元运算去做设计(工作量巨大),所以我们需要观察 这个题目的特点,输入是256位宽,是不是2^8次方?

根据题目提示:选择运算符的 index 可以为变量,只要变量的位宽和向量的长度匹配即可。

So?

module top_module( 
    input logic [255:0] in,
    input logic [7:0] sel,
    output logic out );
  assign out = in[sel];
endmodule
2ac2927a05e7780cd4124d796f63bd6d.png

点击Submit,等待一会就能看到下图结果:

9a83b7470f19cbc70edfa540a0531c2a.png

注意图中无波形。

这一题就结束了。

Problem 64-Mux256to1v

题目说明

本题中需要实现一个 256 选 1 选择器,sel 信号作为选择信号,当 sel = 0 时选择 in[3:0],sel = 1 时选择 in[7:4],以此类推。同上一题的区别在于,位宽从 1 位变到了 4 位。

模块端口声明

module top_module( 
    input [1023:0] in,
    input [7:0] sel,
    output [3:0] out );

题目解析

将上一题答案稍加改造即可,选择的位跨4位并且+4。

module top_module( 
    input logic [1023:0] in,
    input logic [7:0] sel,
    output logic [3:0] out );
  assign out = in[sel * 4 +: 4];
endmodule
6a8ae43ee0cf8ef66febf47cf81168fc.png

点击Submit,等待一会就能看到下图结果:

ee0914b14cd9438a4aee891a33ff13ba.png

注意图中无波形。

这一题就结束了。

总结

今天的几道题就结束了,整体比较简单,没有复杂的代码,没有复杂的设计思路。

最后我这边做题的代码也是个人理解使用,有错误欢迎大家批评指正,祝大家学习愉快~

代码链接:

https://github.com/suisuisi/SystemVerilog/tree/main/SystemVerilogHDLBits

相关文章:

  • Linux环境基础开发工具使用
  • IDEA使用swing创建应用程序
  • 22.0、C语言数据结构——二叉排序树
  • GSW同态加密方案学习
  • Java -- 每日一问:Exception 和 Error 有什么区别?
  • 使用 Typora 画图
  • Gradle 入门说难也不难,说简单吧也不简单~
  • 层次聚类分析及代码实现
  • 学生选课系统 前后端分离 vue springboot
  • 网络安全比赛A模块任务书
  • IP报文在阿里云上的神奇之旅:同地域内云上通信
  • 基于网络安全的Docker逃逸
  • Android——一个简单的音乐APP(二)
  • 在Eclipse 中使用 Maven 创建雅加达 EE 应用程序
  • 112-JavaSE基础进阶:XML的创建、文档约束、文件的解析技术-Dom4J、解析案例、文件的数据检索技术-XPath
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • Akka系列(七):Actor持久化之Akka persistence
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • CSS 专业技巧
  • javascript从右向左截取指定位数字符的3种方法
  • JSONP原理
  • Linux链接文件
  • MySQL用户中的%到底包不包括localhost?
  • PHP 的 SAPI 是个什么东西
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • React as a UI Runtime(五、列表)
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • unity如何实现一个固定宽度的orthagraphic相机
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 技术:超级实用的电脑小技巧
  • 开源地图数据可视化库——mapnik
  • 蓝海存储开关机注意事项总结
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 如何在 Tornado 中实现 Middleware
  • 微信小程序:实现悬浮返回和分享按钮
  • 应用生命周期终极 DevOps 工具包
  • 在Docker Swarm上部署Apache Storm:第1部分
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • No resource identifier found for attribute,RxJava之zip操作符
  • FaaS 的简单实践
  • MyCAT水平分库
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • #include
  • $.ajax,axios,fetch三种ajax请求的区别
  • (1)(1.13) SiK无线电高级配置(五)
  • (k8s中)docker netty OOM问题记录
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (十六)一篇文章学会Java的常用API
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .Net Core和.Net Standard直观理解
  • .NetCore实践篇:分布式监控Zipkin持久化之殇