Verilog RTL 代码设计——译码器&计数器

实验1:设计4-16译码器

  • 方法一:行为描述方式——使用CASE语句

    1.代码

module decoder4_16A(out,in); 
    output[15:0] out;
    input[3:0] in; 
    reg[15:0] out;//out16位寄存器 
    always @(in) //循环输入
    begin 
        case(in)
        //输入4位十进制数,输出16位二进制数
        4'd0:  out=16'b1111111111111110; 
        4'd1:  out=16'b1111111111111101; 
        4'd2:  out=16'b1111111111111011; 
        4'd3:  out=16'b1111111111110111; 
        4'd4:  out=16'b1111111111101111; 
        4'd5:  out=16'b1111111111011111; 
        4'd6:  out=16'b1111111110111111; 
        4'd7:  out=16'b1111111101111111; 
        4'd8:  out=16'b1111111011111111; 
        4'd9:  out=16'b1111110111111111; 
        4'd10: out=16'b1111101111111111; 
        4'd11: out=16'b1111011111111111; 
        4'd12: out=16'b1110111111111111; 
        4'd13: out=16'b1101111111111111; 
        4'd14: out=16'b1011111111111111; 
        4'd15: out=16'b0111111111111111; 
        endcase
    end
endmodule 

2.RTL视图
Verilog RTL 代码设计——译码器&计数器_第1张图片

3.仿真波形
Verilog RTL 代码设计——译码器&计数器_第2张图片

  • 方法二:数据流描述方式——使用assign语句

    1.代码

    module decoder4_16B(in,out,enable);
    input[3:0] in;
    input enable;
    output[15:0] out;
    wire [15:0] out;
    assign out=~((enable)?(1<<in):16'b0);
/*enable=0时不工作,out=16'b0,enable=1时,out=in左移一位后的值,用16位二进制数表示*/
endmodule

2.RTL视图
Verilog RTL 代码设计——译码器&计数器_第3张图片

3.仿真波形
Verilog RTL 代码设计——译码器&计数器_第4张图片

实验2:设计M=12的计数器

  • 设计要求:设计一个M=12的计数器,上电后对CLK信号,从0顺序计数到11,然后回绕到0,当计数值为11的CLK周期,溢出信号OV输出一个高电平,其他周期OV信号输出0。

    1.代码

module RingCounter_M12(out,count,clk);
    output [3:0]out;
    output count;
    input clk;
    reg [3:0] out;
    reg count;
always@(posedge clk)//clk上升沿触发
    begin
        count<=1'b0;
        if(out==11)
        begin
        count<=1'b1;
        out<=4'b0;
        end
        else 
            out<=out+1;
    end
endmodule

2.RTL视图
Verilog RTL 代码设计——译码器&计数器_第5张图片

3.仿真波形
Verilog RTL 代码设计——译码器&计数器_第6张图片

实验3:设计M=20的计数器

  • 设计要求:设计一个M=20的计数器,上电后对CLK信号,从0顺序计数到19,然后回绕到0 当计数值为19的CLK周期,溢出信号OV输出一个高电平,其他周期OV信号输出0

    1.代码

module RingCounter_M20(out,count,clk);
    output [4:0]out;
    output count;
    input clk;
    reg [4:0] out;
    reg count;
always@(posedge clk)//clk上升沿触发
    begin
        count<=1'b0;
        if(out==19)
        begin
        count<=1'b1;
        out<=4'b0;
        end
        else 
            out<=out+1;
    end
endmodule

2.RTL视图
Verilog RTL 代码设计——译码器&计数器_第7张图片

3.仿真波形
Verilog RTL 代码设计——译码器&计数器_第8张图片

实验4:设计可预置加减计数器

  • 设计要求:设计一个计数器,从0递增1计数到9,然后递减1计数到0,如此往复。

    1.代码

module UpDown_M9(out,count,clk);
    input clk;
    output [3:0]out;
    output count;
    reg [3:0] out;
    reg count=1;
always@(posedge clk)begin       //clk上升沿触发
    case(count)
    2'b1:           //count=1时递加,且加至9时count取反变0
        begin 
            out<=out+1;
            if (out==8)
            count=~count;
        end
    2'b0:           //count=0时递减,且减至0时count取反变1
        begin
            out<=out-1;
            if (out==1)
            count=~count;
        end
    endcase
end
endmodule

2.RTL视图
Verilog RTL 代码设计——译码器&计数器_第9张图片
3.仿真波形
Verilog RTL 代码设计——译码器&计数器_第10张图片

你可能感兴趣的:(Verilog RTL 代码设计——译码器&计数器)