https://hdlbits.01xz.net/wiki/Build a Circuit from Simulation Waveform答案

1.sim

module top_module (
    input a,
    input b,
    output q );//

    assign q = a & b; // Fix me
endmodule

2.circuit2

module top_module (
    input a,
    input b,
    input c,
    input d,
    output q );//
    assign q = ((~a) & (~b) & (~c) & (~d)) | ((~a) & (~b) & (c) & (d)) | ((~a) & (b) & (~c) & (d)) |  
       		   ((~a) & (b) & (c) & (~d)) | ((a) & (~b) & (~c) & (d)) | ((a) & (~b) & (c) & (~d))
        | ((a) & (b) & (~c) & (~d)) | ((a) & (b) & (c) & (d)); // Fix me
endmodule

一看这有一半是1我就怀疑不能化简的了。。。果然果然。
3.circuit3

module top_module (
    input a,
    input b,
    input c,
    input d,
    output q );//

    assign q = ~(((~c) & (~d)) | ((~a) & (~b))); // Fix me
endmodule

这里q等于1有九个显然是可以化简的。
4.Circuit4

module top_module (
    input a,
    input b,
    input c,
    input d,
    output q );//

    assign q = ~((~b) & (~c)); // Fix me
endmodule

等于零的只有四个量,显然应该从此处下手
5.Circuit5

module top_module (
    input [3:0] a,
    input [3:0] b,
    input [3:0] c,
    input [3:0] d,
    input [3:0] e,
    output [3:0] q );

    always@(*)begin
        case(c)
            4'd0: q = b;
            4'd1: q = e;
            4'd2: q = a;
            4'd3: q = d;
            default: q = 4'hf;
        endcase
    end
endmodule

从波形图可以看出来应该是一个四选一的MUX同时有默认输出4'b1111。组合电路必须有默认输出,否则就构成锁存器了。
6.Circuit6

module top_module (
    input [2:0] a,
    output [15:0] q ); 
	
    always@(*)begin
        case(a)
            3'd0: q = 16'h1232;
            3'd1: q = 16'haee0;
            3'd2: q = 16'h27d4;
            3'd3: q = 16'h5a0e;
            3'd4: q = 16'h2066;
            3'd5: q = 16'h64ce;
            3'd6: q = 16'hc526;
            3'd7: q = 16'h2f19;
            default: q = 16'h0;
        endcase
    end
endmodule

这理应是一个八选一MUX,默认输出是我自己加的,但是建议还是要有,这毕竟是组合电路。
7.Circuit7

module top_module (
    input clk,
    input a,
    output q );
    always@(posedge clk)begin
        if(~a)
            q <= 1'b1;
        else
            q <= 1'b0;
    end
endmodule

一个时钟控制的同步输出的反相器。
8.Circuit8

module top_module (
    input clock,
    input a,
    output p,
    output q );
	reg p0;
    reg p1;
    always@(*)begin
        if(clock)
            p1 = a;
        else
            p1 = 1'b0;
    end
    always@(negedge clock)begin
        q <= a;
        p0 <= a;
    end
    
    assign p = (clock)? p1 : p0;
endmodule

首先这里q的逻辑简单,就是下降沿时把a赋值进来,p则是clock高电平同步a,下降沿时保持此时的a(或者说是保持上一个时刻的p),所以这里p有组合的部分也有时序的部分,因而必须把两部分分开最后用一个MUX接上再输出。
9.Circuit

module top_module (
    input clk,
    input a,
    output [3:0] q );
    
    always@(posedge clk)begin
        if(a)
            q <= 4'd4;
        else if(q==4'd6)
            q <= 4'd0;
        else
            q <= q + 4'd1;
    end
endmodule

这个的逻辑也很清晰,是一个若a为高电平则同步置位为4,若a为低电平则计数,计数为7进制即到7就置零。
10.Circuit10

module top_module (
    input clk,
    input a,
    input b,
    output q,
    output state  );
    reg next_state;
    
    always@(*)begin
        case(state)
            1'b0: next_state = a & b;
            1'b1: next_state = ~((~a) & (~b));
            default: next_state = 1'b0;
        endcase
    end
    
    always@(posedge clk)
        state <= next_state;
    
    assign q = (state)? ~(a^b) : (a^b); //异步输出
endmodule

观察波形就可以知道这里必须写异步输出。

上一篇:Java反射


下一篇:Verilog 不同版本的差异