HDL bits--circuits--sequential logic--latches and flip-flops

1.Dff

在clk always 模块中 始终用非阻塞

module top_module (
    input clk,    // Clocks are used in sequential circuits
    input d,
    output reg q );//
    always@(posedge clk) begin
        q<=d;
    end

    // Use a clocked always block
    //   copy d to q at every positive edge of clk
    //   Clocked always blocks should use non-blocking assignments

endmodule

2.Dff8

module top_module (
    input clk,
    input [7:0] d,
    output [7:0] q
);
    always@(posedge clk) begin
        q<=d;
    end
endmodule

3.Dff8r

module top_module (
    input clk,
    input reset,            // Synchronous reset
    input [7:0] d,
    output [7:0] q
);
    always@(posedge clk) begin
        if(reset)
            q<=0;
        else
            q<=d;
    end
        
endmodule

4.dff8p

(这题题目没看懂)

module top_module (
    input clk,
    input reset,
    input [7:0] d,
    output [7:0] q
);
    always@(negedge clk) begin
        if(reset)
            q<=8'h0x34;
        else
            q<=d;
    end
endmodule

5.Dff8ar

module top_module (
    input clk,
    input areset,   // active high asynchronous reset
    input [7:0] d,
    output [7:0] q
);
    always@(posedge clk or posedge areset) begin
        if (areset)
            q<=0;
        else
            q<=d;
    end
       
endmodule

6.Dff16e

(我靠 第一个 错的,第二个代码是对的)但是为什么啊?使能端都为0的话,输出不应该是0吗?

module top_module (
    input clk,
    input resetn,
    input [1:0] byteena,
    input [15:0] d,
    output [15:0] q
);
    always@(posedge clk) begin
        if(!resetn)
            q<=0;
        else begin
            case(byteena)
                2'b00:q<=0;
                2'b01:q[7:0]<=d[7:0];
                2'b10:q[15:8]<=d[15:8];
                2'b11:q<=d;
            endcase
        end
    end
                
endmodule
module top_module (
    input clk,
    input resetn,
    input [1:0] byteena,
    input [15:0] d,
    output [15:0] q
);
always @(posedge clk) begin
	if(!resetn)
		q <= 16'd0;
	else begin
		case(byteena)     // 这里用if..else if..else if..else这种写法也是可以的
			2'b00: q <= q;
			2'b01: q[7:0] <= d[7:0];
			2'b10: q[15:8] <= d[15:8];
			2'b11: q <= d;
		endcase
	end	
end


                
endmodule

我不明白当byteena是01的时候,q的[15:8]不用管吗?原来这种语句也可以嵌套,记得写begin.

7. d latch

module top_module (
    input d, 
    input ena,
    output q);
    always@(ena) begin
        if(ena)
            q<=d;
        else
            q<=q;
    end       
endmodule

8.dff

module top_module (
    input clk,
    input d, 
    input ar,   // asynchronous reset
    output q);
    always@(posedge clk or posedge ar) begin
        if(ar)
            q<=0;
        else
            q<=d;
    end
endmodule

9.dff

module top_module (
    input clk,
    input d, 
    input r,   // synchronous reset
    output q);
    always@(posedge clk) begin
        if(r)
            q<=0;
        else
            q<=d;
    end
endmodule

10.dff+gate

module top_module (
    input clk,
    input in, 
    output out);
    reg d;
    assign d=in^out;
    always@(posedge clk) begin
        out<=d;
    end
endmodule

11.mux and dff

module top_module (
	input clk,
	input L,
	input r_in,
	input q_in,
	output reg Q);
    reg d;
    always@(L) begin
        if(L)
            d<=r_in;
        else
            d<=q_in;
    end
    always@(posedge clk) begin
            Q<=d;
    end
endmodule

12.mux and dff

module top_module (
    input clk,
    input w, R, E, L,
    output Q
);
    wire w1;
    reg d;
    assign w1=(E?w:Q);
    assign d=(L?R:w1);
    always@(posedge clk) begin
        Q<=d;
    end
endmodule

13.dffs and gates

module top_module (
    input clk,
    input x,
    output z
); 
    reg d1,d2,d3,Q1,Q2,Q3;
    assign d1=x^Q1;
    assign d2=x&(~Q2);
    assign d3=x|(~Q3);
    always@(posedge clk) begin
        Q1<=d1;
        Q2<=d2;
        Q3<=d3;
    end
    assign z=(~(Q1|Q2|Q3));
endmodule

14.Exams/ece241 2013 q7

module top_module (
    input clk,
    input j,
    input k,
    output Q); 
    
    always@(posedge clk) begin
        Q<=(j&(~Q))|((~k)&Q);
    end           
endmodule

15.Edgedetect

module top_module (
    input clk,
    input [7:0] in,
    output [7:0] pedge
);
    reg [7:0]dff;
   
    always@(posedge clk) begin
      dff<=in;
        pedge<=(~dff)&in;
    end
endmodule

不要忘记之前写那么多寄存器是干嘛用的

16.Edgedetect2

module top_module (
    input clk,
    input [7:0] in,
    output [7:0] anyedge
);
    reg [7:0] dff;
    always@(posedge clk) begin
        dff<=in;
        anyedge<=(dff&(~in))|((~dff)&in);
    end
endmodule

我其实蛮不懂的,为什么不能写下降沿啊

17.Edgecapture

module top_module (
    input clk,
    input reset,
    input [31:0] in,
    output [31:0] out
);
    reg[31:0] dff;
    always@(posedge clk) begin
        dff<=in;
        if (reset)
            out<=0;
        else          
        out<=(dff&(~in))|out;
    end
endmodule

18.Dualedge

module top_module (
    input clk,
    input d,
    output q
);
    reg dff1,dff2;  
    always@(posedge clk) begin
       dff1<=d;
    end
    always@(negedge clk) begin
        dff2<=d;  
    end
    assign q=clk?dff1:dff2;
endmodule

注意观察图像

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值