赞
踩
全部答案汇总:刷完这套题,我才发现Verilog原来如此简单----HDLBits答案汇总
今天更新Circuits章节中Verification:Reading Simulation的1个小节:Finding bugs in code。
这个章节主要是找代码的bug,建议先看代码找BUG,如果是在看不出来,可以直接仿真,看仿真出来的波形跟需求波形差在什么地方,从而针对性的进行分析。
题目:
下面的8位宽二选一选择器不工作了,请修复它。
个人思路:
out是选择器输出的结果,肯定是输入之一,那么位宽应该是8位的。因为sel是1位宽的,所以不能这样和输入做位与运算,如果输入也是1位宽的话,那么这个代码这么写没问题。
- module top_module (
- input sel,
- input [7:0] a,
- input [7:0] b,
- output [7:0] out );
-
- assign out = sel ? a : b;
-
- endmodule
题目:
下面3输入与非门不工作了,请修复它。
你必须使用下面提供给你的5输入与门。
module andgate ( output out, input a, input b, input c, input d, input e );
个人思路:
它例化这个五输入的与门没有例化对,输入信号没有对好。
因为是3输入的模块,所以多出来的信号应该用1(一个数与上1都是这个数本身,等于没有操作)代替,例化完了后因为被例化的是与非门,所以输出还需要取反。
- module top_module (input a, input b, input c, output out);//
-
- wire out1;
- andgate inst1 ( out1, a, b, c, 1'b1,1'b1 );
- assign out = ~out1;
- endmodule
题目:
下面的四选一选择器不工作了,请修复它。
你必须使用下面的二选一选择器:
module mux2 ( input sel, input [7:0] a, input [7:0] b, output [7:0] out );
个人思路:
mux0、mux1应该是8位宽的,这样位宽才匹配;其次c、d的选择应该是使用sel[0]。
- module top_module (
- input [1:0] sel,
- input [7:0] a,
- input [7:0] b,
- input [7:0] c,
- input [7:0] d,
- output [7:0] out ); //
-
- wire [7:0] mux0, mux1;
- mux2 inst1 ( sel[0], a, b, mux0 );
- mux2 inst2 ( sel[0], c, d, mux1 );
- mux2 inst3 ( sel[1], mux0, mux1, out );
-
- endmodule
题目:
下面的加法器/减法器不工作了,请修复它。
个人思路:
这个一看代码,就发现if语句后面没有else语句,所以会生成锁存器,标志信号被电平触发后会一直保持在高电平状态,所以应该补全if--else语句。
- // synthesis verilog_input_version verilog_2001
- module top_module (
- input do_sub,
- input [7:0] a,
- input [7:0] b,
- output reg [7:0] out,
- output reg result_is_zero
- );//
-
- always @(*) begin
- case (do_sub)
- 0: out = a+b;
- 1: out = a-b;
- endcase
-
- if (!out)
- result_is_zero = 1;
- else
- result_is_zero = 0;
- end
-
- endmodule
题目:
这个组合电路应该可以识别8位键盘扫描码的0到9按键。它应该指示10个分支中是否有一个被识别(有效),如果是,那么哪个按键被检测到。请修复bug。
个人思路:
乍一看该有的都有,那么就直接仿真,结果如下:
结合代码,很容易发现有两个分支是明显错的,一个位宽为6,一个是10进制单位,分别修改( 8‘d26----8'h26;6'h46----8'h46)后:
可以看到:该输出0的时候,我们写的模块输出还是上一个输出,说明生成了锁存器,那么肯定是case语句没有写全;另一个问题是valid的输出一直是0,结合代码发现 valid没有写道case分支中去。那么就可以改动代码如下(最终版):
- module top_module (
- input [7:0] code,
- output reg [3:0] out,
- output reg valid
- );
-
- always @(*)begin
- case (code)
- 8'h45: begin out = 0;valid =1;end
- 8'h16: begin out = 1;valid =1;end
- 8'h1e: begin out = 2;valid =1;end
- 8'h26: begin out = 3;valid =1;end
- 8'h25: begin out = 4;valid =1;end
- 8'h2e: begin out = 5;valid =1;end
- 8'h36: begin out = 6;valid =1;end
- 8'h3d: begin out = 7;valid =1;end
- 8'h3e: begin out = 8;valid =1;end
- 8'h46: begin out = 9;valid =1;end
- default:begin out = 0;valid =0;end
- endcase
- end
-
- endmodule
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。