HDLBits(9)10.13

2 Verilog语言

2.5 更多特点

2.5.4 组合for循环

翻转输出一个长度为100的向量(使用组合always块)

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

2.5.5 组合for循环:255位总体计数

建立一个255bit输入的矢量来判断输入中 ’1‘ 的个数

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

    integer i;

    always @ (*)
        begin
            out = 8'b0000_0000;     //为了后面的计数累加,此处先初始化为0.
            for (i=0; i<255; i++)
                begin
                    if(in[i] == 1'b1)
                        out = out + 1'b1;
                    else
                        out = out;
                end
        end

endmodule
module top_module( 
    input [254:0] in,
    output [7:0] out );
    integer i;
    always @(*)begin
        out = 8'd0;
        for(i=0;i<255;i=i+1) 
            out=in[i]?out+8'd1:out;
    end
endmodule

2.5.6 生成for循环:100位二进制加法器

通过实例化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
        for(i=0;i<100;i++) begin:adder
            if(i==0)
                assign {cout[0],sum[0]} = a[0]+b[0]+cin;
            else
                assign {cout[i],sum[i]} = a[i]+b[i]+cout[i-1];
        end           
    endgenerate
endmodule

generate语句:

 

2.5.6 生成for循环:100位BCD加法器

本题已经提供了一个名为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码(包含在400bit的矢量中)和一个cin, 输出产生sum 和 cout

posted @ 2023-02-14 14:36  LhTian21  阅读(45)  评论(0)    收藏  举报