build a circuit from waveform(依靠波形图编写电路)
Sim/circuit2
比较简单,4输入,1输出。4个输入相同或者有两个输入相同的时候,输出为1.
编了个4位输入寄存器sum存储输入。然后组合电路逻辑判断寄存器,最后输出。
module top_module (
input a,
input b,
input c,
input d,
output q );//
reg [4:0]sum;
always @(*) begin
sum[0]=d;
sum[1]=c;
sum[2]=b;
sum[3]=a;
end
always @(*) begin
case (sum)
0:q=1;
3:q=1;
5:q=1;
6:q=1;
9:q=1;
10:q=1;
12:q=1;
15:q=1;
default:q=0;
endcase
end
endmodule
编译通过。
自己写的这个程序比较长,网上找到了一些比较短的答案。
assign q = (a ^ b) ~^ (c ^ d);
或者
assign q=~(a^b^c^d);
感觉要卡诺图化简,把当年的数电忘了
Sim/circuit3
比较简单,4个输入量,一个输出量。做卡诺图化简,可以得到q=bd+bc+ad+ac=b(c+d)+a(c+d)=(b+a)(c+d), assign q = (a || b) && (c || d);就搞定。
Sim/circuit4
和上一题类似,卡诺图化简即可。略过。
Sim/circuit5
组合逻辑,c为片选信号。很容易用组合逻辑写出。
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)
0:q=b;
1:q=e;
2:q=a;
3:q=d;
default:q=4'b1111;
endcase
end
endmodule
sim/circuit6
输入是4位,输出是16位。看不懂输入输出的具体关系。俺也承认自己懒得找了。用case 直接编写吧
always @ (*) begin
case(a)
0: q = 16'h1232;
1: q = 16'haee0;
2: q = 16'h27d4;
3: q = 16'h5a0e;
4: q = 16'h2066;
5: q = 16'h64ce;
6: q = 16'hc526;
7: q = 16'h2f19;
endcase
end
sim/circuit7
时序电路。因为是单输入单输出,用阻塞赋值和非阻塞赋值都正确。
always@(posedge clk)
begin
q=~a;
end
百度百科找了下阻塞赋值和非阻塞赋值的区别
在状态变量的赋值或开关变量的赋值中,已明确建议大家使用非阻塞赋值。这不但是因为综合工具要求这样做,最根本的原因是与非阻塞赋值语句语意对应的电路结构正是我们想要实现的。这两种赋值语句对应着两种不同的电路结构。阻塞赋值对应的电路结构往往与触发沿没有关系,只与输入电平的变化有关系。而非阻塞赋值对应的电路结构往往与触发沿有关系,只有在触发沿时才有可能发生赋值的情况。
阻塞和非阻塞赋值的区别在阻塞是顺序执行而非阻塞是并行执行。
以下面的语句举例
非阻塞赋值
always@(posedge clk)
begin
b<=a;
c<=b;
end
阻塞赋值
always@(posedge clk)
begin
b=a;
c=b;
end
两种不同的赋值方式结果是不同的,非阻塞赋值b<=a;c<=b;两条语句是同时执行的,而阻塞赋值b=a;c=b;两条语句先执行b=a后执行c=b。
所以,为了良好的习惯,最正确的答案应该是非阻塞赋值<=:
always@(posedge clk)
begin
q<=~a;
end
sim/circuit8
一个时钟信号,一个输入信号。两个输出信号。看波形图没看懂p和输入信号,时钟信号的关联。结果网上搜查猜发现p用的组合逻辑。
module top_module (
input clock,
input a,
output p,
output q );
always@(negedge clock)
begin
q<=p;
end
always@(*)begin
if(clock)p=a;
else p=p;
end
endmodule
sim/circuit9
module top_module (
input clk,
input a,
output [3:0] q );
always@(posedge clk)begin
if(a)q<=4;
else
if(q<6)q<=q+4'b1;
else q<=0;
end
endmodule
sim/circuit10
时序电路,一个组合逻辑电路和一位存储器(flip-flop(触发器))组成,输出的q依靠state确定。
先看波形确定state,再确定输出q和state的关系。
always @ (posedge clk) begin
if(a == b)
state <= a;
else
state <= state;
end
assign q = (a == b) ? state : (~state)
endmodule