HDLBits: 在线学习SystemVerilog-Problem

描述

 

 

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

逻辑电路

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

逻辑电路

注意图中的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
逻辑电路

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

逻辑电路

注意图中的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

逻辑电路

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

逻辑电路

注意图中的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
逻辑电路

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

逻辑电路

注意图中无波形。

这一题就结束了。

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
逻辑电路

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

逻辑电路

注意图中无波形。

这一题就结束了。

总结

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

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

代码链接:

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


审核编辑 :李倩


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分