天天看點

【verilog】時序邏輯的練習計數器

實作D觸發器,有輸入信号d,時鐘信号clk,輸出信号q

【verilog】時序邏輯的練習計數器
module top(d,clk,q);
input d,clk;
output q;
reg q;
always @(posedge clk)begin
    q <= d;
end
           
module test(
    );
reg d,clk;
wire q;
top f(.d(d),.clk(clk),.q(q));
initial begin
    clk = 1;d = 0;
    #20 d = 1;
    #20 d = 0;
    #5 d = 1;
    #10 d = 0;
    #20 d = 1;
    #15 d = 0;
    #5 d = 1;
    
    
    #10 $stop;
end
always begin
    #5 clk = ~clk;
end
endmodule
           
【verilog】時序邏輯的練習計數器

建立8個D觸發器。所有DFF應由clk的上升沿觸發。

【verilog】時序邏輯的練習計數器
module top(d,clk,q);
input d,clk;
output q;
wire[7:0] d;
reg[7:0] q;
always @(posedge clk)begin
    q <= d;
end
           
module test(
    );
reg[7:0] d;
reg clk;
wire[7:0] q;
top f(.d(d),.clk(clk),.q(q));
initial begin
    clk <= 1;d <= 0;
    #5000 $stop;
end
always begin
    #5 clk <= ~clk;
    #7 d <= d + 1;
end
endmodule
           
【verilog】時序邏輯的練習計數器

建立具有高電平有效同步複位的8 D觸發器。所有DFF應由clk的上升沿觸發。

給定一個時鐘信号clk上升沿有效,一個複位信号reset高電平有效,一個位寬為8的輸入信号d,一個位寬為8的輸出信号q

【verilog】時序邏輯的練習計數器
module top(d,clk,reset,q);
input[7:0] d;
input clk,reset;
output q;
reg[7:0] q;
always @(posedge clk)begin
    if(reset)
        q <= 8'd0;
    else
        q <= d;
end
           
module test(
    );
reg[7:0] d;
reg clk,reset;
wire[7:0] q;
top f(.d(d),.clk(clk),.reset(reset),.q(q));
initial begin
    clk <= 0;d <= 8'd13;reset <= 1;
    #15 reset <= 0;
    #35 reset <= 1;
    #15 reset <= 0;
    #10 reset <= 1;
    #25 reset <= 0;
    #10 $stop;
end
always begin
    #5 clk <= ~clk;
    #5 d <= d + 1;
end
endmodule
           
【verilog】時序邏輯的練習計數器

建立具有高電平有效異步複位的 8 個 D 觸發器。所有DFF應由clk的上升沿觸發。

【verilog】時序邏輯的練習計數器
module top(d,clk,reset,q);
input[7:0] d;
input clk,reset;
output q;
reg[7:0] q;
always @(posedge clk or negedge reset)begin
    if(!reset)
        q <= 8'd0;
    else
        q <= d;
     //異步複位的觸發器(複位與寄存不能一起操作)
end
           
module test(
    );
reg[7:0] d;
reg clk,reset;
wire[7:0] q;
top f(.d(d),.clk(clk),.reset(reset),.q(q));
initial begin
    clk <= 1;d <= 8'd13;reset <= 1;
    #15 reset <= 0;
    #5 reset <= 1;
    #14 reset <= 0;
    #7 reset <= 1;
    #21 reset <= 0;
    #4 reset <= 1;
    #24 reset <= 0;
    #6 reset <= 1;
    #16 reset <= 0;
    #10 $stop;
end
always #5 clk <= ~clk;
always #10  d <= d + 3;;

endmodule

           
【verilog】時序邏輯的練習計數器

DFF+gate(Exams/m2014 q4d)

實作以下電路

【verilog】時序邏輯的練習計數器

實際子產品

module top(clk,in,out);
    input clk,in;
    output out;
    reg out;
    
    initial begin
        out = 0;
    end
    always@(posedge clk)
        out = in ^ out;



endmodule

           

子產品執行個體化

module test(
    );
reg in,clk;
wire out;
top f(.clk(clk),.in(in),.out(out));
initial begin
    in = 0;clk = 0;
    
    #200 $stop;
end
always #10 clk = ~clk; 
always #7 in = ~in; 
endmodule
           
【verilog】時序邏輯的練習計數器
【verilog】時序邏輯的練習計數器

總結:

reg 不能連接配接到子產品執行個體化的輸出端口;

reg 不能 用作實際子產品聲明中的輸入;

子產品執行個體化的輸出端口初始化,要在實際子產品中進行

計數器

建構一個4位二進制計數器,其計數範圍為0到15(含0和15),其周期為16。複位輸入是同步的,應将計數器複位為0。

【verilog】時序邏輯的練習計數器
module top(clk,reset,q);
input clk,reset;
output q;
reg[3:0] q;
initial q <= 0; 
always@(posedge clk)begin
    if(reset)
        q <= 4'd0;
    else if(q == 4'd15)
        q <= 0;
    else
        q <= q + 1;
end
           
module test(
    );
reg clk,reset;
wire[3:0] q;
top f(.clk(clk),.reset(reset),.q(q));
initial begin
    clk <= 0;reset <= 0;
    
    #500 $stop;
end
always #5 clk <= ~clk;
always begin
    # 177 reset <= 1;
    #20 reset <= 0;
end
endmodule
           
【verilog】時序邏輯的練習計數器
【verilog】時序邏輯的練習計數器

建立一個十進制計數器,該計數器的計數範圍為0到9(含0和9),周期為10。複位輸入是同步的,應将計數器複位為0。

【verilog】時序邏輯的練習計數器
module top(clk,reset,q);
input clk,reset;
output q;
reg[3:0] q;
initial q <= 0; 
always@(posedge clk)begin
    if(reset)
        q <= 4'd0;
    else if(q == 4'd9)
        q <= 0;
    else
        q <= q + 1;
end
           
module test(
    );
reg clk,reset;
wire[3:0] q;
top f(.clk(clk),.reset(reset),.q(q));
initial begin
    clk <= 0;reset <= 0;
    
    #500 $stop;
end
always #5 clk <= ~clk;
always begin
    # 127 reset <= 1;
    #14 reset <= 0;
end
endmodule
           
【verilog】時序邏輯的練習計數器

建立一個十進制計數器,該計數器的計數範圍為0到9(含0和9),周期為10。複位輸入是同步的,應将計數器複位為0。我們希望能夠暫停計數器,而不是總是在每個時鐘周期都遞增,是以,slowena輸入訓示計數器應何時遞增。

【verilog】時序邏輯的練習計數器
module top(clk,reset,slowna,q);
input clk,reset,slowna;
output q;
reg[3:0] q;
initial q <= 0; 
always@(posedge clk)begin
    if(reset)
        q <= 4'd0;
    else if(slowna)begin
        if(q == 4'd9)
            q <= 0;
        else
            q <= q + 1;
    end
end
           
module test(
    );
reg clk,reset,slowna;
wire[3:0] q;
top f(.clk(clk),.reset(reset),.slowna(slowna),.q(q));
initial begin
    clk <= 0;reset <= 0;slowna <= 1;
    
    #500 $stop;
end
always #5 clk <= ~clk;
always begin
    #70 slowna <= 0;
    #10 slowna <= 1;
end
always begin
    # 127 reset <= 1;
    #14 reset <= 0;
end
endmodule
           
【verilog】時序邏輯的練習計數器
【verilog】時序邏輯的練習計數器

繼續閱讀