【HDLbits答案】Verilog Language-Prucedures

目录Verilog Language-Prucedures下练习题答案

Alwaysblock1

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

Alwaysblock2

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 )
    out_always_ff <= a^b;

endmodule

Always if

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

Always if2

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

Always case

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  
        case(sel )
            3'd0:out = data0;
            3'd1:out = data1;
            3'd2:out = data2;
            3'd3:out = data3;
            3'd4:out = data4;
            3'd5:out = data5;
            default:out = 3'd0;
        endcase 
    end 

endmodule

Always case2

module top_module (
    input [3:0] in,
    output reg [1:0] pos  );
always@(*)begin 
    if(in[0])
        pos = 2'b00;
    else    begin 
        case(in )
        4'b0010,4'b0110,4'b1110,4'b1010:    pos = 2'b01;
        4'b0100,4'b1100:    pos = 2'b10;
        4'b1000:            pos = 2'b11;
        default:pos = 2'b0;
        endcase
      end 
end 

endmodule

Always casez

module top_module (
    input [7:0] in,
    output reg [2:0] pos  );
always @(*)begin
    casez(in )
        8'bzzzzzzz1:pos = 3'd0;
        8'bzzzzzz1z:pos = 3'd1;
        8'bzzzzz1zz:pos = 3'd2;
        8'bzzzz1zzz:pos = 3'd3;
        8'bzzz1zzzz:pos = 3'd4;
        8'bzz1zzzzz:pos = 3'd5;
        8'bz1zzzzzz:pos = 3'd6;
        8'b1zzzzzzz:pos = 3'd7;
        default:   pos = 3'd0;
    endcase 
end 

endmodule

Always nolatches

module top_module (
    input [15:0] scancode,
    output reg left,
    output reg down,
    output reg right,
    output reg up  ); 
    
always @(*)begin 
    left = 1'b0;down = 1'b0;right = 1'b0;up = 1'b0;
    case(scancode )
        16'he06b:left    = 1'b1;
        16'he072:down    = 1'b1;
        16'he074:right    = 1'b1;
        16'he075:up        = 1'b1;
    endcase 
end 

endmodule

 

posted @ 2021-03-02 21:55  IntoTheSky  阅读(263)  评论(0编辑  收藏  举报