首页IT科技leecode刷题(【HDLBits刷题日记】05 More Verilog Features)

leecode刷题(【HDLBits刷题日记】05 More Verilog Features)

时间2025-05-06 06:20:35分类IT科技浏览6327
导读:Conditional 使用三目运算符可以实现一个数据选择器,可以替代if语句,不过:?可读性较差,复杂逻辑还是推荐用if。...

Conditional

使用三目运算符可以实现一个数据选择器            ,可以替代if语句                      ,不过:?可读性较差      ,复杂逻辑还是推荐用if               。

注意这道题中间变量的定义         ,不定义中间变量表达式会变得十分复杂且可读性差                  。

Reduction

归约运算符                      ,双目运算符直接用在多位变量前使用          ,可以实现归约操作       。这里使用了一个异或的归约操作      ,实现了偶校验            。

module top_module ( input [7:0] in, output parity); assign parity = ^in; endmodule

Gates100

同样是使用一个归约运算符                     ,实现100输入的与            、或                      、异或运算                   。

module top_module( input [99:0] in, output out_and, output out_or, output out_xor ); assign out_and=∈ assign out_or=|in; assign out_xor=^in; endmodule

Vector100r

按照提示用了一个for循环              ,for循环一般用于仿真   ,这里也可以用于反转位序          。

答案用了一个$bits()系统函数                    ,可以直接返回信号的位宽        。

module top_module( input [99:0] in, output [99:0] out ); integer i=0; always@(*) begin for(i=0;i<100;i=i+1) begin out[i]=in[99-i]; end end endmodule

Popcount255

同样使用了一个for循环                  ,也可以把in中每位的数加起来,就不用if判断了                    。

module top_module( input [254:0] in, output [7:0] out ); reg [7:0] count; always@(*) begin count = 0; for(int i=0;i<$bits(in);i=i+1) begin if(in[i]==1b1) count=count+1b1; end end assign out=count; endmodule

Adder100i

题目意思是使用例化数组或者generate语句                ,感觉这两种用法用的并不多                      ,不过还是尝试写了一下             。

直接for循环

module top_module( input [99:0] a, b, input cin, output [99:0] cout, output [99:0] sum ); always@(*) begin for(int i=0;i<100;i=i+1) begin {cout[i],sum[i]}=a[i]+b[i]+((i==0)?cin:cout[i-1]); end end endmodule

实例化数组

module top_module( input [99:0] a, b, input cin, output [99:0] cout, output [99:0] sum ); add adder[99:0]( .cin({cout[98:0],cin}), .a(a[99:0]), .b(b[99:0]), .sum(sum[99:0]), .cout(cout[99:0]) ); endmodule module add( input cin, input a, input b, output sum, output cout ); assign {cout,sum}=cin+a+b; endmodule

generate for语句

module top_module( input [99:0] a, b, input cin, output [99:0] cout, output [99:0] sum ); genvar i; generate for(i = 0;i<$bits(sum);i=i+1) begin:gen add adder( .cin((i==0)?cin:cout[i-1]), .a(a[i]), .b(b[i]), .sum(sum[i]), .cout(cout[i]) ); end endgenerate endmodule module add( input cin, input a, input b, output sum, output cout ); assign {cout,sum}=cin+a+b; endmodule

Bcdadd100

这道题同样也是用实例化数组或者generate for语句    。

module top_module( input [399:0] a, b, input cin, output cout, output [399:0] sum ); wire [98:0]c; bcd_fadd u_bcd_fadd[99:0]( .a(a[399:0]), .b(b[399:0]), .cin({c[98:0],cin}), .cout({cout,c[98:0]}), .sum(sum[399:0]) ); endmodule
声明:本站所有文章   ,如无特殊说明或标注            ,均为本站原创发布                     。任何个人或组织                      ,在未征得本站同意时      ,禁止复制      、盗用         、采集                      、发布本站内容到任何网站          、书籍等各类媒体平台                。如若本站内容侵犯了原著者的合法权益         ,可联系我们进行处理。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
mac硬盘损坏原因(MAC硬盘的常见问题及其修复方法)