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

(왼쪽 메뉴 하단)

 

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

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

 

Alwaysblock1 - HDLBits

 

hdlbits.01xz.net

 

 

 

 


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을 권장합니다.