모든 HDLBits 포스팅은 Ligth Theme을 권장합니다.

(왼쪽 메뉴 하단)

 

문제는 반드시 HDLBits를 참고하세요! 보다 자세하게 적혀있습니다.

https://hdlbits.01xz.net/wiki/Conditional

 

Conditional - HDLBits

 

hdlbits.01xz.net

 

 

 


Conditional Ternary Operator

 

Given four unsigned numbers, find the minimum. Unsigned numbers can be compared with standard comparison operators (a < b). Use the conditional operator to make two-way min circuits, then compose a few of them to create a 4-way min circuit. You'll probably want some wire vectors for the intermediate results.

unsigned인 4개의 숫자가 주어지면 최소값을 구합니다. unsigned 숫자는 표준 비교 연산자(a < b)로 비교할 수 있습니다. 조건 연산자를 사용하여 2 방향 최소 회로를 만든 다음 그 중 몇 개로 4 방향 최소 회로를 만듭니다. 중간 결과에 대한 와이어 벡터가 필요할 것입니다.

Solution ↓

더보기
module top_module (
    input [7:0] a, b, c, d,
    output [7:0] min);//

    // assign intermediate_result1 = compare? true: false;
    wire [7:0] int1, int2;
    
    //condition ? if_true : if_false
    assign int1 = (a<b)? a:b; 
    assign int2 = (int1<c)? int1:c;
    assign min  = (int2<d)? int2:d;
endmodule

두고 두고 볼만함.

내부에서 조건을 걸고 그에 따른 두 개의 값을 밖에서 선언 가능

먼저 생각나는 건 bit_cnt?


 


Reduction Opertor

 

Parity checking is often used as a simple method of detecting errors when transmitting data through an imperfect channel. Create a circuit that will compute a parity bit for a 8-bit byte (which will add a 9th bit to the byte). We will use "even" parity, where the parity bit is just the XOR of all 8 data bits.

parity 검사는 가끔 불완전한 채널을 통해 데이터를 전송할 때 오류를 감지하는 간단한 방법으로 사용됩니다. 8-bit byte의 parity bit를 계산할 회로를 만드세요. 우리는 parity bit가 8개의 모든 데이터 bit의 XOR인 "짝수" parity를 사용할 것입니다.

& a[3:0]     // AND: a[3]&a[2]&a[1]&a[0]. Equivalent to (a[3:0] == 4'hf)
| b[3:0]     // OR:  b[3]|b[2]|b[1]|b[0]. Equivalent to (b[3:0] != 4'h0)
^ c[2:0]     // XOR: c[2]^c[1]^c[0]

Solution ↓

더보기
module top_module (
    input [7:0] in,
    output parity); 

    assign parity = ^in[7:0];
endmodule

 


Reduction : Even Wider Gates

 

Build a combinational circuit with 100 inputs, in[99:0].

There are 3 outputs:

  • out_and: output of a 100-input AND gate.
  • out_or: output of a 100-input OR gate.
  • out_xor: output of a 100-input XOR gate.

입력이 100개인 조합 회로를 설계하세요.

3가지 출력:

• out_and: 100개 입력 AND Gate의 출력.
• out_or: 100개 입력 OR Gate의 출력.
• out_xor: 100개 입력 XOR Gate의 출력.

Solution ↓

더보기
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

Reduction Operator로 알 수 있는 건.

& in , | in, ^ in 등을 할 때 전체 bit를 모두 연산한다면 뒤에 [99:0]는 넣지 않아도 되다는 당연한 사실.


 


Combinational for - loop : Vector Revesal 2

 

 

Given a 100-bit input vector [99:0], reverse its bit ordering.

주어진 100-bit 입력 vector의 순서를 반전시키세요

Solution ↓

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

for문의 존재도 잊지 말자

왜 인지는 모르겠지만 case, 다른 연산자로 구문 작성을 했지만 simulation error 발생.


 

 


Combinational for - loop : 255-bit Population Count

 

A "population count" circuit counts the number of '1's in an input vector. Build a population count circuit for a 255-bit input vector.

"population count" 회로는 입력 벡터에 있는 '1'의 수를 세는 회로입니다. 255-bit 입력 벡터에 대한 인구 수 회로를 만드세요.

Solution ↓

더보기
module top_module( 
    input [254:0] in,
    output [7:0] out );
	
    integer i;
    reg [7:0] cnt;
    assign out = cnt;
    
    always @ (in) begin
		cnt = 0;
        for (i=0; i<255; i=i+1) begin
            if (in[i]==1'b1) 
                cnt = cnt + 1'b1;
        end
    end
endmodule

 


Generate for - loop : 100-bit Binary Adder 2

 

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 fromeachfull 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개의 full adder를 인스턴스화하여 100-bit 이진 ripple-carry adder를 만듭니다. adder는 100-bit 숫자 2개와 carry-in을 추가하여 100-bit 합계를 생성하고 수행합니다. full adder를 실제로 인스턴스화하도록 권장하려면 ripple-carry adder의 각 full adder에서 수행된 결과도 출력합니다. cout[99]는 마지막 full adder에서 나온 최종 carry-out이며, 일반적으로 볼 수 있는 carry-out입니다.

Solution ↓

더보기
module top_module(
    input [99:0] a, b,
    input cin,
    output [99:0] cout,
    output [99:0] sum
);

integer i;

assign sum[0] = a[0] ^ b[0] ^ cin;
assign cout[0] = (a[0] & b[0]) | (a[0] & cin) | (b[0] & cin);

always @(*) begin
    for (i = 1; i < 100; i = i + 1) begin
        sum[i] = a[i] ^ b[i] ^ cout[i-1];
        cout[i] = (a[i] & b[i]) | (a[i] & cout[i-1]) | (b[i] & cout[i-1]);
    end
end

endmodule

genvar와 generate 

generate ~ endgenerate에서만 사용 가능한 변수이다. 실제 회로에 영향을 끼치지 않음.

더보기
module top_module( 
    input [99:0] a, b,
    input cin,
    output [99:0] cout,
    output [99:0] sum 
    );
  
  genvar i;
  
  assign sum[0] = a[0]^b[0]^cin;
  assign cout[0]=a[0]&b[0] | a[0]&cin | b[0]&cin;
  
  generate
      for(i=1; i<100 ; i=i+1)begin:FA
          assign sum[i] = a[i]^b[i]^cout[i-1];
          assign cout[i] = a[i]&b[i] | a[i]&cout[i-1] | b[i]&cout[i-1];
      end
  endgenerate

endmodule

 


Generate for - loop : 100-digit BCD Adder

 

You are provided with a BCD one-digit adder named bcd_fadd that adds two BCD digits and carry-in, and produces a sum and carry-out. Instantiate 100 copies of bcd_fadd to create a 100-digit BCD ripple-carry adder. Your adder should add two 100-digit BCD numbers (packed into 400-bit vectors) and a carry-in to produce a 100-digit sum and carry out.

두 개의 BCD-digit과 carry-in을 더하고 sum과 carry-out을 생성하는 bcd_fadd 라는 이름의 BCD one-digit adder가 제공됩니다. bcd_fadd의 100개 copy를 인스턴스화하여 100자리 BCD ripple-carry adder를 만듭니다. adder는 100자리 BCD 숫자 2개(400-bit 벡터로 포장)와 carry-in을 추가하여 100자리 sum과 carry-out을 생성해야 합니다.

module bcd_fadd (
    input [3:0] a,
    input [3:0] b,
    input     cin,
    output   cout,
    output [3:0] sum );

Solution ↓

더보기
module top_module( 
    input [399:0] a, b,
    input cin,
    output cout,
    output [399:0] sum );
	
    wire[99:0] cout_wires;
    genvar i;
    
    generate
        bcd_fadd(a[3:0], b[3:0], cin, cout_wires[0],sum[3:0]);
        for (i=4; i<400; i=i+4) begin: bcd_adder_instances
            bcd_fadd bcd_adder(a[i+3:i], b[i+3:i], cout_wires[i/4-1],cout_wires[i/4],sum[i+3:i]);
        end
    endgenerate
    
    assign cout = cout_wires[99];
endmodule

 

 

오늘은 유용해 보이는 문법이 많네요. 자주 와서 찾아볼 듯 합니다.