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
观察波形就可以知道这里必须写异步输出。