모든 HDLBits 포스팅은 Ligth Theme을 권장합니다.
(왼쪽 메뉴 하단)
문제는 반드시 HDLBits를 참고하세요! 보다 자세하게 적혀있습니다.
https://hdlbits.01xz.net/wiki/Conditional
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 = ∈
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
오늘은 유용해 보이는 문법이 많네요. 자주 와서 찾아볼 듯 합니다.
'Circuit Design > 🚀HDLBits' 카테고리의 다른 글
[HDLBits] 7. Circuit - Combinational Logic (2) (1) | 2024.07.14 |
---|---|
[HDLBits] 6. Circuits - Combinational Logic(1) (0) | 2024.07.11 |
[HDLBits] 4. Verilog Language - Procedures (0) | 2024.07.08 |
[HDLBits] 3. Verilog Language - Modules: Hiearch (0) | 2024.07.07 |
[HDLBits] 2. Verilog Language - Vectors (0) | 2024.07.07 |