将组合逻辑放到时序逻辑中

需要实现的电路

将组合逻辑放到时序逻辑中_第1张图片

代码

代码1

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

生成电路
将组合逻辑放到时序逻辑中_第2张图片


代码2

module top_module (
    input clk,
    input in, 
    output reg out);
    reg d;
        
    always@(posedge clk)begin
        d = in^out;                  // 注意这里是阻塞赋值
    	out <= d;
    end
        
endmodule

生成电路
将组合逻辑放到时序逻辑中_第3张图片


代码3

module top_module (
    input clk,
    input in, 
    output reg out);
    reg d;
        
    always@(posedge clk)begin
        d <= in^out;       // 注意这里为非阻塞赋值
    	out <= d;
    end
        
endmodule

生成电路
将组合逻辑放到时序逻辑中_第4张图片
由于采用非阻塞赋值,导致,当前拍(时钟上升沿)得到的d,需要在下一拍才能传递到out处,因此综合出来的电路会多出一个Reg

总结

组合电路部分最好和时序电路放在不同的always块中实现,能够极大程度避免综合出的电路和设想之间出现差异。还有一点感悟就是:如何利用手头现有的模块实现现有功能。

你可能感兴趣的:(Verilog刷题,Verilog,阻塞,非阻塞)