0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何灵活使用三元运算符

OpenFPGA 来源:OpenFPGA 作者:OpenFPGA 2022-09-28 17:07 次阅读

HDLBits: 在线学习 SystemVerilog(九)-Problem 36-42

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

缩略词索引

SV:SystemVerilog

今天的几道题主要是补充SV的一些补充语法练习。

Problem 36-Conditional

这道题主要是考察条件(三元)运算符的用法,具体详见《SystemVerilog-条件(三元)运算符》!

题目说明

给定四个无符号数,请找出最小值。无符号数可以与标准比较运算符(a < b)进行比较。使用条件运算符描述一个两路的最小值电路,然后组合它来创建一个4路最小电路。可能需要一些线向量作为中间结果。

模块端口声明

moduletop_module(
input[7:0]a,b,c,d,
output[7:0]min);

题目解析

这个题目重点是灵活使用三元运算符,因为这个语法比较简单,所以大家注意一下使用方式即可~

moduletop_module(
inputlogic[7:0]a,b,c,d,
outputlogic[7:0]min
);



assignmin=((a< b ? a : b) < c ? 
                  (a < b ? a : b) : c) < d ? 
                 ((a < b ? a : b) < c ? 
                  (a < b ? a : b) : c) : d; 

endmodule


f7585eac-3eea-11ed-9e49-dac502259ad0.png

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

f77d4bae-3eea-11ed-9e49-dac502259ad0.png

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

这一题就结束了。

Problem 37-Reduction

这题是考察归约运算符,本来想在SV系列文章里写的,这次作为一个专题在下面一篇文章中。

题目说明

当通过不完善的通道传输数据时,奇偶校验通常用作检测错误的简单方法。创建一个电路,计算 8 位字节的奇偶校验位(将向该字节添加第9位)。 我们将使用偶校验,其中奇偶校验位只是所有8个数据位的XOR

模块端口声明

moduletop_module(
input[7:0]in,
outputparity);

题目解析

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

简单解答

moduletop_module(
inputlogic[7:0]in,
outputlogicparity
);
assignparity=^in;
endmodule


f7b55fda-3eea-11ed-9e49-dac502259ad0.png

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

f7d2deb6-3eea-11ed-9e49-dac502259ad0.png

注意图中的无波形。

这一题就结束了。

Problem 38-Gates100

题目说明

构建具有100个输入的组合电路。

电路一共有3个输出:

f7f03920-3eea-11ed-9e49-dac502259ad0.png

模块端口声明

moduletop_module(
input[99:0]in,
outputout_and,
outputout_or,
outputout_xor
);

题目解析

上一个问题已经说过归约运算符了,这道题肯定也是类似解答思路,应该很简单吧~~~

moduletop_module(
inputlogic[99:0]in,
outputlogicout_and,
outputlogicout_or,
outputlogicout_xor
);

assignout_and=∈
assignout_or=|in;
assignout_xor=^in;

endmodule
f8109c38-3eea-11ed-9e49-dac502259ad0.png

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

f82f029a-3eea-11ed-9e49-dac502259ad0.png

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

这一题就结束了。

Problem 39-Vector100r

题目说明

给了一个长度是100的向量,请把它翻转输出一下。

提示:for循环(组合always块或者generate块)在这里很有用。 这道题中,因为不需要模块实例化(必须使用generate块),建议使用always块。

模块端口声明

moduletop_module(
input[99:0]in,
output[99:0]out
);

题目解析

提示中已经暗示了使用for循环,所以我们就按照always...for...使用即可。

moduletop_module(
inputlogic[99:0]in,
outputlogic[99:0]out
);

varintegeri;
always_combbegin
for(i=0;i<= 99; i = i + 1)begin
            out[i] = in[99 - i];
        end
    end

endmodule



f84e0cb2-3eea-11ed-9e49-dac502259ad0.png

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

f87b85de-3eea-11ed-9e49-dac502259ad0.png

注意图中无波形。

这一题就结束了。

Problem 40-Popcount255

题目说明

老生常谈的题目了,设计电路来计算输入矢量中‘1’的个数,题目要求建立一个255bit输入的矢量来判断输入中‘1’的个数。

提示:重复工作量建议使用for~

模块端口声明

moduletop_module(
input[254:0]in,
output[7:0]out);

题目解析

这个题目的争论点在怎么减少逻辑量,目前没什么好思路,但是可以增加运行速度,那就是分类冶制。

moduletop_module(
input[254:0]in,
outputreg[7:0]out
);

always@(*)begin//Combinationalalwaysblock
out=0;
for(inti=0;i<255;i++)
   out = out + in[i];
 end
 
endmodule

f89c2a50-3eea-11ed-9e49-dac502259ad0.png

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

f8bdc8cc-3eea-11ed-9e49-dac502259ad0.png

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

这一题就结束了。

Problem 41-Adder100i

题目说明

通过实例化 100 个全加器来创建一个 100 位二进制波纹进位加法器。加法器将两个 100 位数字和一个进位相加,输出为sum与cout,还要输出纹波进位加法器中每个全加器的进位。cout[99] 是最后一个全加器的最终进位,也是通常看到的进位。

模块端口声明

moduletop_module(
input[99:0]a,b,
inputcin,
output[99:0]cout,
output[99:0]sum);

题目解析

这个题目简单的用法就是generate...for,最近在整理这方面知识,在这篇文章发出来之前应该已经发布,详见《【Verilog我思我用】-generate》。

moduletop_module(
inputlogic[99:0]a,b,
inputlogiccin,
outputlogic[99:0]cout,
outputlogic[99:0]sum);


generate
genvari;
for(i=0;i<= 99; i = i + 1)begin:adder
         if(i == 0)begin
             assign {cout[0], sum[0]} = a[0] + b[0] + cin;
            end
            else begin
             assign {cout[i], sum[i]} = a[i] + b[i] + cout[i-1];
            end         
        end
    endgenerate

endmodule

f8ef299e-3eea-11ed-9e49-dac502259ad0.png

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

f9010290-3eea-11ed-9e49-dac502259ad0.png

注意图中是无波形的。

这一题就结束了。

Problem 42-Bcdadd100

题目说明

本题已经提供了一个名为bcd_fadd的BCD一位全加器,他会添加两个BCD数字和一个cin,并产生一个cout和sum。

modulebcd_fadd{
input[3:0]a,
input[3:0]b,
inputcin,
outputcout,
output[3:0]sum);

我们需要实例化100个bcd_fadd来实现100位的BCD进位加法器。该加法器应包含两个100bit的BCD码和一个cin, 输出产生sum 和 cout。

模块端口声明

moduletop_module(
input[399:0]a,b,
inputcin,
outputcout,
output[399:0]sum);

题目解析

这个题目也是在巩固generate用法,建议自己完成并思考。

moduletop_module(
inputlogic[399:0]a,b,
inputlogiccin,
outputlogiccout,
outputlogic[399:0]sum);


wirelogic[99:0]cout_temp;

generate
genvari;
for(i=0;i<= 99; i = i + 1)begin:BCD_adder
            if(i == 0)begin
                bcd_fadd u1_bcd_fadd(
                    .a  (a[3:0]  ),
                    .b  (b[3:0]  ),
                    .cin (cin  ),
                    .sum (sum[3:0] ),
                    .cout (cout_temp[0] )
                );
            end
            else begin
                bcd_fadd u2_bcd_fadd(
                    .a  (a[4 * i + 3: 4 * i] ),
                    .b  (b[4 * i + 3: 4 * i] ),
                    .cin (cout_temp[i - 1]       ),
                    .sum (sum[4 * i + 3: 4 * i]  ),
                    .cout (cout_temp[i]           )
                );
            end
        end
        assign cout = cout_temp[99];
    endgenerate
                    

endmodule

f9274874-3eea-11ed-9e49-dac502259ad0.png

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

f967405a-3eea-11ed-9e49-dac502259ad0.png

注意图中的无波形。

这一题就结束了。

总结

今天的几道题就结束了,整体属于加强练习的过程,适合独立完成,加强理解。

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 电路设计
    +关注

    关注

    6673

    文章

    2451

    浏览量

    204211
  • 硬件
    +关注

    关注

    11

    文章

    3315

    浏览量

    66205
  • 运算符
    +关注

    关注

    0

    文章

    172

    浏览量

    11082

原文标题:HDLBits: 在线学习 SystemVerilog(九)-Problem 36-42

文章出处:【微信号:Open_FPGA,微信公众号:OpenFPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言运算符的使用方法

    详细介绍了C语言表达式、算术运算符、赋值运算符、关系运算符、条件结构、逻辑运算符、位运算符的语法和使用方法,并讨论了
    发表于 11-02 11:30 1606次阅读
    C语言<b class='flag-5'>运算符</b>的使用方法

    如何去使用运算符

    运算的定义是什么?运算符是由什么组成的?如何去使用运算符
    发表于 07-15 13:13

    条件运算符是什么_条件运算符有哪些

    运算符优先级高于赋值、逗号运算符,低于其他运算符。关系运算实际上是逻辑比较运算,它是逻辑运算
    发表于 11-16 16:02 1.1w次阅读
    条件<b class='flag-5'>运算符</b>是什么_条件<b class='flag-5'>运算符</b>有哪些

    单目运算符是什么_单目运算符有哪些

    单目运算符是指运算所需变量为一个的运算符,又叫一运算符,其中有逻辑非运算符:!、按位取反
    的头像 发表于 02-24 15:42 6.1w次阅读
    单目<b class='flag-5'>运算符</b>是什么_单目<b class='flag-5'>运算符</b>有哪些

    C运算符的优先级和结合性详细解决

    运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。 C语言内置了丰富的运算符,大体可分为10类:算术运算符、关系运算符、逻辑运算符、位
    的头像 发表于 02-22 17:27 3234次阅读

    浅析MySQL中的各类运算符

    MySQL支持多种运算符,我们在写SQL脚本时经常会需要用到各种各样的运算符,这些运算符可以用来连接表达式,进而从数据库中查询我们需要的结果集等。这些类型主要包括算术运算符、比较
    的头像 发表于 05-03 17:41 2052次阅读
    浅析MySQL中的各类<b class='flag-5'>运算符</b>

    干货:大实例讲解种C++运算符重载

    本章节主要讲解是运算符重载。运算符重载是赋予运算符能操作自定义类型的功能。C++运算符重载主要分为以下类:
    的头像 发表于 09-30 16:59 3440次阅读
    干货:<b class='flag-5'>三</b>大实例讲解<b class='flag-5'>三</b>种C++<b class='flag-5'>运算符</b>重载

    python运算符是什么

    python运算符 0. 什么是运算符? 本章节主要说明Python的运算符。举个简单的例子 4 +5 = 9 。 例子中,4和5被称为操作数,“+”号为运算符。 Python语言支持
    的头像 发表于 02-21 16:44 2378次阅读

    SystemVerilog-运算符/表达式规则

    RTL建模中广泛使用的运算符是条件运算符,也称为三元运算符,该运算符用于在两个表达式之间进行选择——表5-2列出了用于表示条件
    的头像 发表于 08-03 09:03 3113次阅读

    什么是运算符重载

    重载运算符是具有特殊名称的函数,是通过关键字** operator **后跟运算符的符号来定义的
    的头像 发表于 01-20 15:30 2487次阅读

    条件(三元运算符

    RTL建模中广泛使用的运算符是条件运算符,也称为三元运算符,该运算符用于在两个表达式之间进行选择——表5-2列出了用于表示条件
    的头像 发表于 02-09 15:42 1358次阅读
    条件(<b class='flag-5'>三元</b>)<b class='flag-5'>运算符</b>

    什么是移位运算符

    移位运算符将向量的位向右或向左移位指定的次数。SystemVerilog具有按位和算术移位运算符
    的头像 发表于 02-09 15:49 1831次阅读
    什么是移位<b class='flag-5'>运算符</b>

    Go语言运算符主要包括哪些呢?

    Go语言运算符主要包括:算数运算符、关系运算符、逻辑运算符、位运算符、赋值运算符和其他
    的头像 发表于 05-26 15:54 861次阅读
    Go语言<b class='flag-5'>运算符</b>主要包括哪些呢?

    Golang为何舍弃三元运算符

    golang中不存在?:运算符的原因是因为语言设计者已经预见到三元运算符经常被用来构建一些极其复杂的表达式。虽然使用if进行替代会让代码显得更长,但这毫无疑问可读性更强。
    的头像 发表于 04-03 15:13 693次阅读

    c语言从右到左的运算符有哪些

    用在变量之后时,它们会先返回变量的原始值,然后再进行递增或递减。 三元条件运算符 ( ?: ):这个运算符的求值顺序是从右到左。首先计算第个表达式,然后根据第一个表达式的结果选择第二
    的头像 发表于 08-20 11:39 918次阅读