Bootstrap

HDLBits Procedures部分题目练习

1Alwaysblock1

两种方法实现与门

// 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@(*)
        out_alwaysblock <= a&b;
endmodule

2Alwaysblock2

异或门

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@(*)
        out_always_comb <= a ^ b;
    always@(posedge clk)
        out_always_ff <= a ^ b;
endmodule

3Always 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 & sel_b2) ? b : a;
	always @(*) begin
        if (sel_b1 & sel_b2) begin
            out_always <= b;
        end
        else begin
            out_always <= a;
        end
    end
endmodule

4Always 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

5Always 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  // This is a combinational circuit
        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'b0;
        endcase
    end

endmodule

6Always case2

最后一位高电平的索引,没有高电平也返回0

module top_module (
    input [3:0] in,
    output reg [1:0] pos  );
    always@(in)begin
        casex(in)
            4'bxxx1: pos <= 2'd0;
            4'bxx10: pos <= 2'd1;
            4'bx100: pos <= 2'd2;
            4'b1000: pos <= 2'd3;
            default: pos <= 2'd0;
        endcase
    end
endmodule

7Always casez

module top_module (
    input [7:0] in,
    output reg [2:0] pos );
    always@(in)begin
        casez(in)
            8'bzzzz_zzz1: pos <= 3'd0;
            8'bzzzz_zz10: pos <= 3'd1;
            8'bzzzz_z100: pos <= 3'd2;
            8'bzzzz_1000: pos <= 3'd3;
            8'bzzz1_0000: pos <= 3'd4;
            8'bzz10_0000: pos <= 3'd5;
            8'bz100_0000: pos <= 3'd6;
            8'b1000_0000: pos <= 3'd7;
            default: pos <= 3'd0;
        endcase
    end
endmodule

8Always nolatches

module top_module (
    input [15:0] scancode,
    output reg left,
    output reg down,
    output reg right,
    output reg up  ); 
    always@(scancode)begin
        case(scancode)
            16'he06b: {left, down, right, up} <= 4'b1000;
            16'he072: {left, down, right, up} <= 4'b0100;
            16'he074: {left, down, right, up} <= 4'b0010;
            16'he075: {left, down, right, up} <= 4'b0001;
            default: {left, down, right, up} <= 4'b0000;
        endcase
    end
endmodule

;