모든 HDLBits 포스팅은 Ligth Theme을 권장합니다.
(왼쪽 메뉴 하단)
문제는 반드시 HDLBits를 참고하세요! 보다 자세하게 적혀있습니다.
https://hdlbits.01xz.net/wiki/Alwaysblock1
Always Blocks (Combinational)
Build an AND gate using both an assign statement and a combinational always block.
assign 문과 combination always block을 모두 사용하여 AND 게이트를 만듭니다.
Solution ↓
// synthesis verilog_input_version verilog_2001
module top_module(
input a,
input b,
output wire out_assign,
output reg out_alwaysblock
);
assign out_assign = a && b;
always @ (*) begin
out_alwaysblock = a && b;
end
endmodule
Always Block (Clocked)
Build an XOR gate three ways, using an assign statement, a combinational always block, and a clocked always block. Note that the clocked always block produces a different circuit from the other two: There is a flip-flop so the output is delayed.
assign, combinational always block, clocked always block 이렇게 세 가지 방법으로 XOR Gate를 만들어보세요. clocked always block은 항상 다른 둘과 다른 회로를 생성합니다.(flip-flop으로 출력이 지연됩니다.)
Solution ↓
// synthesis verilog_input_version verilog_2001
module top_module(
input clk,
input a,
input b,
output wire out_assign,
output reg out_always_comb,
output reg out_always_ff );
assign out_assign = a ^ b;
always @ (*) begin
out_always_comb = a ^ b;
end
always @ (posedge clk) begin
out_always_ff = a ^ b;
end
endmodule
If Statement
Build a 2-to-1 mux that chooses between a and b. Choose b if both sel_b1 and sel_b2 are true. Otherwise, choose a. Do the same twice, once using assign statements and once using a procedural if statement.
a와 b 중 하나를 선택하는 2x1 mux를 만드세요. sel_b1과 sel_b2가 모두 참이면 b를 선택하고 아니라면, a를 선택합니다. 같은 작업을 두 번 수행합니다. 한 번은 assign을 사용하고 한 번은 if statement을 사용합니다.
sel_b1 | sel_b2 | out_assignout_always |
0 | 0 | a |
0 | 1 | a |
1 | 0 | a |
1 | 1 | b |
Solution ↓
// synthesis verilog_input_version verilog_2001
module top_module(
input a,
input b,
input sel_b1,
input sel_b2,
output wire out_assign,
output reg out_always );
assign out_assign = (sel_b1 == 1'b1 && sel_b2 == 1'b1)? b:a;
always @ (*) begin
if (sel_b1 == 1'b1 && sel_b2 == 1'b1) out_always = b;
else out_always = a;
end
endmodule
If Statement Latches
The following code contains incorrect behaviour that creates a latch. Fix the bugs so that you will shut off the computer only if it's really overheated, and stop driving if you've arrived at your destination or you need to refuel.
다음 코드는 래치를 발생시키는 잘못된 동작을 포함하고 있습니다. 버그를 수정하여 정말 과열된 경우에만 컴퓨터를 종료하고 목적지에 도착했거나 연료를 보충해야 하는 경우에는 운전을 중단합니다.
always @(*) begin
if (cpu_overheated)
shut_off_computer = 1;
end
always @(*) begin
if (~arrived)
keep_driving = ~gas_tank_empty;
end
Solution ↓
// synthesis verilog_input_version verilog_2001
module top_module (
input cpu_overheated,
output reg shut_off_computer,
input arrived,
input gas_tank_empty,
output reg keep_driving ); //
always @(*) begin
if (cpu_overheated)
shut_off_computer = 1;
else
shut_off_computer = 0;
end
always @(*) begin
if (~arrived)
keep_driving = ~gas_tank_empty;
else
keep_driving = 0;
end
endmodule
Case Statement
Case statements are more convenient than if statements if there are a large number of cases. So, in this exercise, create a 6-to-1 multiplexer. When sel is between 0 and 5, choose the corresponding data input. Otherwise, output 0. The data inputs and outputs are all 4 bits wide.
case가 많아지면 case statement는 if statement보다 편합니다. 따라서 이 연습에서는 6 x 1 mux를 만듭니다. sel이 0에서 5 사이일 때 해당하는 데이터 입력을 선택합니다. 그렇지 않으면 출력 0. 데이터 입력과 출력은 모두 4-bit 너비입니다.
Solution ↓
// synthesis verilog_input_version verilog_2001
module top_module (
input [2:0] sel,
input [3:0] data0,
input [3:0] data1,
input [3:0] data2,
input [3:0] data3,
input [3:0] data4,
input [3:0] data5,
output reg [3:0] out );//
always@(*) begin // This is a combinational circuit
case(sel)
3'b0 : out = data0;
3'b001 : out = data1;
3'b010 : out = data2;
3'b011 : out = data3;
3'b100 : out = data4;
3'b101 : out = data5;
default : out = 0;
endcase
end
endmodule
Priority Encoder
Build a 4-bit priority encoder. For this problem, if none of the input bits are high (i.e., input is zero), output zero. Note that a 4-bit number has 16 possible combinations.
4-bit priority encoder를 구축합니다. 이 문제에 대해 입력 bit 중 어느 것도 high가 아니면 (입력이 0면) 0을 출력합니다. 4-bit 수에는 16개의 가능한 조합이 있습니다.
Solution ↓
// synthesis verilog_input_version verilog_2001
module top_module (
input [3:0] in,
output reg [1:0] pos );
always @(*) begin
if (in[0]==1'b1)
pos = 0;
else if (in[1]==1'b1)
pos = 1;
else if (in[2]==1'b1)
pos = 2;
else if (in[3]==1'b1)
pos = 3;
else
pos = 0;
end
endmodule
Priority Encoder with Casez
Build a priority encoder for 8-bit inputs. Given an 8-bit vector, the output should report the first (least significant) bit in the vector that is 1. Report zero if the input vector has no bits that are high.
8-bit 입력을 위한 priority encoder를 구축합니다. 8-bit vector가 주어지면 출력은 vector에서 첫 번째 (가장 중요하지 않은) bit가 1이라고 보고해야 합니다. 입력 벡터에 높은 비트가 없으면 0을 보고하십시오.
Solution ↓
// synthesis verilog_input_version verilog_2001
module top_module (
input [7:0] in,
output reg [2:0] pos
);
always @(*) begin
casez(in)
8'bzzzzzzz1 : pos = 0;
8'bzzzzzz1z : pos = 1;
8'bzzzzz1zz : pos = 2;
8'bzzzz1zzz : pos = 3;
8'bzzz1zzzz : pos = 4;
8'bzz1zzzzz : pos = 5;
8'bz1zzzzzz : pos = 6;
8'b1zzzzzzz : pos = 7;
default : pos = 0;
endcase
end
endmodule
Avoiding Latches
Scancode [15:0] | Arrow key |
16'he06b | left arrow |
16'he072 | down arrow |
16'he074 | right arrow |
16'he075 | up arrow |
Anything else | none |
Your circuit has one 16-bit input, and four outputs. Build this circuit that recognizes these four scancodes and asserts the correct output.
회로에는 16-bit 입력이 하나 있고 출력이 네 개 있습니다. 이 네 개의 스캔 코드를 인식하고 올바른 출력을 주장하는 회로를 구축하십시오.
Solution ↓
// synthesis verilog_input_version verilog_2001
module top_module (
input [15:0] scancode,
output reg left,
output reg down,
output reg right,
output reg up );
always @ (*) begin
left = 0;
down = 0;
right = 0;
up = 0;
case (scancode)
16'he06b : left = 1;
16'he072 : down = 1;
16'he074 : right = 1;
16'he075 : up = 1;
default :;
endcase
end
endmodule
모든 HDLBIts 포스팅은 Light Theme을 권장합니다.
'Circuit Design > 🚀HDLBits' 카테고리의 다른 글
[HDLBits] 6. Circuits - Combinational Logic(1) (0) | 2024.07.11 |
---|---|
[HDLBits] 5. Verilog Language - More Verilog Features (0) | 2024.07.11 |
[HDLBits] 3. Verilog Language - Modules: Hiearch (0) | 2024.07.07 |
[HDLBits] 2. Verilog Language - Vectors (0) | 2024.07.07 |
[HDLBits] 1. Verilog Language - Basics (0) | 2024.07.07 |