如何灵活使用三元运算符

hdlbits: 在线学习 systemverilog(九)-problem 36-42
hdlbits 是一组小型电路设计习题集,使用 verilog/systemverilog 硬件描述语言 (hdl) 练习数字硬件设计~
缩略词索引:
sv:systemverilog
今天的几道题主要是补充sv的一些补充语法练习。
problem 36-conditional
这道题主要是考察条件(三元)运算符的用法,具体详见《systemverilog-条件(三元)运算符》!
题目说明
给定四个无符号数,请找出最小值。无符号数可以与标准比较运算符(a < b)进行比较。使用条件运算符描述一个两路的最小值电路,然后组合它来创建一个4路最小电路。可能需要一些线向量作为中间结果。
模块端口声明
module top_module (    input [7:0] a, b, c, d,    output [7:0] min);  
题目解析
这个题目重点是灵活使用三元运算符,因为这个语法比较简单,所以大家注意一下使用方式即可~
module top_module (    input  logic [7:0] a, b, c, d,    output logic [7:0] min    );        assign min = ((a < b ? a : b) < c ?                   (a < b ? a : b) : c) < d ?                  ((a < b ? a : b) < c ?                   (a < b ? a : b) : c) : d; endmodule  
点击submit,等待一会就能看到下图结果:
注意图中的ref是参考波形,yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。
这一题就结束了。
problem 37-reduction
这题是考察归约运算符,本来想在sv系列文章里写的,这次作为一个专题在下面一篇文章中。
题目说明
当通过不完善的通道传输数据时,奇偶校验通常用作检测错误的简单方法。创建一个电路,计算 8 位字节的奇偶校验位(将向该字节添加第9位)。 我们将使用偶校验,其中奇偶校验位只是所有8个数据位的xor。
模块端口声明
module top_module (    input [7:0] in,    output parity);   
题目解析
这道题难度不大核心代码只有一行。
简单解答
module top_module (    input  logic [7:0] in,    output logic parity    ); assign parity = ^in ;endmodule  
点击submit,等待一会就能看到下图结果:
注意图中的无波形。
这一题就结束了。
problem 38-gates100
题目说明
构建具有100个输入的组合电路。
电路一共有3个输出:
模块端口声明
module top_module(     input [99:0] in,    output out_and,    output out_or,    output out_xor );  
题目解析
上一个问题已经说过归约运算符了,这道题肯定也是类似解答思路,应该很简单吧~~~
module top_module(     input  logic [99:0] in,    output logic out_and,    output logic out_or,    output logic out_xor );    assign out_and = & in;    assign out_or = | in;    assign out_xor = ^ in;endmodule  
点击submit,等待一会就能看到下图结果:
注意图中的ref是参考波形,yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。
这一题就结束了。
problem 39-vector100r
题目说明
给了一个长度是100的向量,请把它翻转输出一下。
提示:for循环(组合always块或者generate块)在这里很有用。 这道题中,因为不需要模块实例化(必须使用generate块),建议使用always块。
模块端口声明
module top_module(     input [99:0] in,    output [99:0] out);   
题目解析
提示中已经暗示了使用for循环,所以我们就按照always...for...使用即可。
module top_module(     input  logic [99:0] in,    output logic [99:0] out);    var integer i;    always_comb begin        for(i = 0; i <= 99; i = i + 1)begin            out[i] = in[99 - i];        end    endendmodule  
点击submit,等待一会就能看到下图结果:
注意图中无波形。
这一题就结束了。
problem 40-popcount255
题目说明
老生常谈的题目了,设计电路来计算输入矢量中‘1’的个数,题目要求建立一个255bit输入的矢量来判断输入中‘1’的个数。
提示:重复工作量建议使用for~
模块端口声明
module top_module(     input [254:0] in,    output [7:0] out );  
题目解析
这个题目的争论点在怎么减少逻辑量,目前没什么好思路,但是可以增加运行速度,那就是分类冶制。
module top_module ( input [254:0] in, output reg [7:0] out); always @(*) begin // combinational always block  out = 0;  for (int i=0;i<255;i++)   out = out + in[i]; end endmodule  
点击submit,等待一会就能看到下图结果:
注意图中的ref是参考波形,yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。
这一题就结束了。
problem 41-adder100i
题目说明
通过实例化 100 个全加器来创建一个 100 位二进制波纹进位加法器。加法器将两个 100 位数字和一个进位相加,输出为sum与cout,还要输出纹波进位加法器中每个全加器的进位。cout[99] 是最后一个全加器的最终进位,也是通常看到的进位。
模块端口声明
module top_module(     input [99:0] a, b,    input cin,    output [99:0] cout,    output [99:0] sum );  
题目解析
这个题目简单的用法就是generate...for,最近在整理这方面知识,在这篇文章发出来之前应该已经发布,详见《【verilog我思我用】-generate》。
module top_module(     input logic [99:0] a, b,    input logic cin,    output logic [99:0] cout,    output logic [99:0] sum );        generate        genvar i;        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    endgenerateendmodule  
点击submit,等待一会就能看到下图结果:
注意图中是无波形的。
这一题就结束了。
problem 42-bcdadd100
题目说明
本题已经提供了一个名为bcd_fadd的bcd一位全加器,他会添加两个bcd数字和一个cin,并产生一个cout和sum。
module bcd_fadd {    input [3:0] a,    input [3:0] b,    input     cin,    output   cout,    output [3:0] sum );  
我们需要实例化100个bcd_fadd来实现100位的bcd进位加法器。该加法器应包含两个100bit的bcd码和一个cin, 输出产生sum 和 cout。
模块端口声明
module top_module(     input [399:0] a, b,    input cin,    output cout,    output [399:0] sum );  
题目解析
这个题目也是在巩固generate用法,建议自己完成并思考。
module top_module(     input logic [399:0] a, b,    input logic cin,    output logic cout,    output logic [399:0] sum );        wire logic [99:0] cout_temp;        generate        genvar i;        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  
点击submit,等待一会就能看到下图结果:
注意图中的无波形。
这一题就结束了。
总结
今天的几道题就结束了,整体属于加强练习的过程,适合独立完成,加强理解。


中材科技锂电隔膜方面的主要产品包括哪些?
龙芯中科计划打造高性能通用处理器“中国芯”自主研发创新生态圈
华为荣耀8评测:对比小米5C、红米4X,颜值靓丽有范!性价比超高!
VSCode搭建STM32开发环境的一些常规且使用的功能
苹果自研MacBook M1版最高内存只有16GB
如何灵活使用三元运算符
乐视手机将于酷派一同出售?“乐视大国”就此灭亡,贾跃亭根本指望不上!
FocalSpec1201 BGA小球检测的案例分享
骁龙845喊话麒麟970,骁龙才是王者
电脑CPU风扇的工作原理
节能与新能源汽车技术路线图2.0
通过透传网关实现对信捷PLC远程控制,远程上下载
物联网安全教程:加密固件分析
远程IO和分布式IO之间的区别是什么
常用的卡尺,这几个使用前必知的小贴士,你知道吗?
“场景化造车”理念驱动,北汽蓝谷积聚向好之力
摩托罗拉发布了欧洲的Moto G10和Moto G30预算友好型手机
传闻保千里大宝机器人搭载麦克拉姆轮 并可自主导航
动力系统的电气化简介
3D XPoint发展迅速,下一代存储技术之争越来越激烈