HDLbits 刷题 --Adder100i

Create a 100-bit binary ripple-carry adder by instantiating 100 full adders. The adder adds two 100-bit numbers and a carry-in to produce a 100-bit sum and carry out. To encourage you to actually instantiate full adders, also output the carry-out from each full adder in the ripple-carry adder. cout[99] is the final carry-out from the last full adder, and is the carry-out you usually see.

译:

创建一个100位的二进制串行进位加法器,通过实例化100个全加器来实现。该加法器将两个100位的数字和一个进位输入相加,得到一个100位的和以及进位输出。为了鼓励您实际实例化全加器,还会输出串行进位加法器中每个全加器的进位输出。cout[99]是最后一个全加器的最终进位输出,通常也是您看到的进位输出。

module top_module( 
    input [99:0] a, b,
    input cin,
    output [99:0] cout,
    output [99:0] sum );
 	genvar  i;
     generate
         full_addr(a[0],b[0],cin,cout[0],sum[0]);
         for(i=1;i<100;i++)
        begin:full_adder_inst
           full_addr(a[i],b[i],cout[i-1],cout[i],sum[i]);
        end
    endgenerate

endmodule
module full_addr(input a,
                input b,
                input cin,
                output cout,
                 output sum);
    assign {cout,sum} = a + b + cin;
endmodule

运行结果:

分析解释:

        此题中接触到两个新的关键字,是之前所不知道的,分别是genvar和generate;下面解释下两个关键字

 在Verilog中,generategenvar是用于生成硬件结构的关键字,它们允许设计者通过循环或条件语句来创建重复的模块实例或者执行代码块。这种机制非常适合于实现参数化的硬件设计,如RAM阵列、流水线处理器、数字信号处理器等。

generategenvar的基本用法:

  1. generate: 这个关键字用于定义一个可重复执行的代码块,通常与for循环结合使用,以生成多个实例。

  2. genvar: 这个关键字用于定义一个循环变量,它只能在generate块内部使用,用于迭代生成实例。

  3. 在使用generate的时候,需要为generate块命名,命名的位置在for循环的begin 后; 如果不命名的话将会报错;

如示例:

genvar i;
generate
    for (i = 0; i < 4; i = i + 1) begin : gen_block_name
        // 生成的实例化代码
        some_module inst_name(i);
    end : gen_block_name
endgenerate

使用generategenvar的好处是它们允许设计者以一种非常灵活和参数化的方式来创建硬件结构,从而使得设计可以轻松适应不同的需求和规模。此外,这种参数化的设计方法也有助于减少代码的冗余,提高代码的可读性和可维护性。

那么generate 和always 的区别是什么?

总结来说: 

  • generategenvar用于生成重复的硬件结构  ;和 always 的区别是 always用于描述信号之间的逻辑关系和时序行为。
  • generate块内部的代码只在综合时执行,用于生成硬件的多个实例;always块内部的代码在硬件运行时执行,用于描述信号的逻辑功能。
  • generategenvar通常用于参数化设计,而always块用于描述特定硬件行为。

为什么generate中不能使用int 类型的变量?

generategenvar关键字用于生成硬件结构的参数化实例。这些结构通常在编译时确定,并且在硬件的综合过程中被实例化。genvar类型的变量是专门为generate块设计的,用于在这些结构的实例化过程中提供唯一的标识符。

int类型的变量在Verilog中是用于模拟环境中的整数,它们在仿真时有值,但在硬件综合时并不对应任何实际的硬件资源。由于generate块的目的是在综合时创建硬件结构,而不是在仿真时提供变量的值,因此不允许在generate块中使用int类型的变量。

使用genvar类型的变量可以确保在综合过程中为每个生成的实例分配一个唯一的标识符,这对于创建可配置和可扩展的硬件结构至关重要。genvar变量的值在综合时是唯一的,并且在生成的硬件中占有实际的资源。

简而言之,int类型的变量在综合时没有实际的硬件对应物,而genvar类型的变量在综合时用于创建实际的硬件实例,并且保证每个实例都有唯一的标识符。这就是为什么generate中不能使用int类型的变量,而必须使用genvar类型的原因。

  • 35
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刚及格的陆拾伍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值