HDLBits刷题合集—6 More Verilog Features

HDLBits刷题合集—6 More Verilog Features

HDLBits-37 Conditional ternary operator
Problem Statement
Verilog也有像C语言一样的三元条件运算符:
(condition ? if_true : if_false)

这可以在一行中根据条件从两个值中选择一个,而不需要在组合的always块中使用if-then语句。
几个例子:

(0 ? 3 : 5)     // This is 5 because the condition is false.
(sel ? b : a)   // A 2-to-1 multiplexer between a and b selected by sel.

always @(posedge clk)         // A T-flip-flop.
  q <= toggle ? ~q : q;

always @(*)                   // State transition logic for a one-input FSM
  case (state)
    A: next = w ? B : A;
    B: next = w ? A : B;
  endcase

assign out = ena ? q : 1'bz;  // A tri-state buffer

((sel[1:0] == 2'h0) ? a :     // A 3-to-1 mux
 (sel[1:0] == 2'h1) ? b :
                      c )

给定四个无符号数,求最小值。无符号数字可以用标准比较运算符(a < b)比较。使用条件运算符制作两个数值的最小值电路,然后组合他们几个,创建一个四个数值的最小值电路。可能需要一些中间线向量。

代码如下:

module top_module (
    input [7:0] a, b, c, d,
    output [7:0] min);//
    
    wire [7:0] result1,result2;
    
	assign result1 = a<b ? a : b;
    assign result2 = c<d ? c : d;
    assign min     = result1<result2 ? result1 : result2;
    // assign intermediate_result1 = compare? true: false;

endmodule

HDLBits-38 Reduction
Problem Statement
当通过一个不完美的信道传输数据时,奇偶校验通常被用来作为一种简单的方法来检测错误。创建一个电路来计算一个8位字节的奇偶校验位(这将为字节增加到9位)。我们将使用“偶数”校验,其中奇偶校验位就是所有8个数据位的异或。

代码如下:

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

HDLBits-39 Gates100
Problem Statement
建立一个有100个输入的组合电路,有3输出:
out_and:100输入与的输出。
out_or:100输入或的输出。
out_xor:100输入异或的输出。

代码如下:

module top_module( 
    input [99:0] in,
    output out_and,
    output out_or,
    output out_xor 
);

	assign out_and =  & in;
    assign out_or  =  | in;
    assign out_xor =  ^ in;
    
endmodule

HDLBits-40 Vector100r
Problem Statement
给定一个100位的输入向量[99:0],颠倒它的位顺序。

代码如下:

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

    always@(*) begin
        for (int i =0; i<=99; i=i+1) 
        begin
            out[i] = in[99-i];
        end
    end
   
endmodule

HDLBits-41 Popcount255
Problem Statement
总体计数电路用来计算输入向量中“1”的个数。为一个255位的输入向量建立一个总体计数电路。

代码如下:

module top_module( 
    input [254:0] in,
    output [7:0] out );
	int i;
	
    always@(*) begin
    
        out = 8'b0000_0000;
        
        for (i=0; i<255; i=i+1)
            begin
                if (in[i] == 1'b1)
                    out = out +1'b1;
                else 
                    out = out + 1'b0;
            end
    end
endmodule

HDLBits-42 Popcount255
Problem Statement
通过实例化100个全加法器来创建一个100位二进制行纹进位加法器。加法器加上两个100位的数字和一个进位,产生一个100位的和与向高位进位。

题目要求用实例化全加器,但这里用了always块。
代码如下:

module top_module( 
    input [99:0] a, b,
    input cin,
    output [99:0] cout,
    output [99:0] sum );
       
	assign cout[0] = a[0] & b[0] | a[0] & cin | b[0] & cin;
    assign sum[0]  = a[0] ^ b[0] ^ cin;
    integer i;
    
    always @ (*) begin
        for (i=1; i<100; i++)
        begin
          cout[i] = a[i] & b[i] | a[i] & cout[i-1] | b[i] & cout[i-1];
          sum[i]  = a[i] ^ b[i] ^ cout[i-1];
        end
    end
    
endmodule

HDLBits-43 Bcdadd100
Problem Statement
给定一个名为bcd_fadd一位BCD码加法器,它可以计算两个BCD数字和低位进位,并生成一个和与高位进位。
module bcd_fadd {
input [3:0] a,
input [3:0] b,
input cin,
output cout,
output [3:0] sum );

代码如下:

module top_module( 
    input [399:0] a, b,
    input cin,
    output cout,
    output [399:0] sum );
    
    wire [399:0] cout_tmp;
    bcd_fadd fadd(.a(a[3:0]), .b(b[3:0]), .cin(cin), .cout(cout_tmp[0]),.sum(sum[3:0]));
    assign cout = cout_tmp[396];
    
    generate
        genvar i;
        for(i = 4; i < 400; i=i+4) begin : bcdadd//必须有名字
            bcd_fadd fadd(.a(a[i+3:i]), .b(b[i+3:i]), .cin(cout_tmp[i-4]), .cout(cout_tmp[i]),.sum(sum[i+3:i]));
        end
    endgenerate

endmodule

这题参考知乎—HDLBits 中文导学

Note
新手一枚,主要分享博客,记录学习过程,后期参考大佬代码或思想会一一列出。欢迎大家批评指正!

你可能感兴趣的:(HDLBits刷题合集—6 More Verilog Features)