HDLBits 是一组小型电路设计习题集,使用 Verilog/SystemVerilog 硬件描述语言 (HDL) 练习数字硬件设计~
网址如下:
https://hdlbits.01xz.net/
关于HDLBits的Verilog实现可以查看下面专栏:
https://www.zhihu.com/column/c_1131528588117385216
缩略词索引:
从今天开始新的一章-Circuits,包括基本逻辑电路、时序电路、组合电路等。
今天更新整个多路选择器一小节题目,多路选择器也是组合电路的基本电路。
创建一个一位宽2路选择器。当 sel=0 时,选择 a。当 sel=1 时,选择 b。
module top_module(
input a, b, sel,
output out );
这个题目没什么难度,看下面参考代码即可:
module top_module(
input logic a, b, sel,
output logic out );
assign out = sel ? b : a;
endmodule
点击Submit,等待一会就能看到下图结果:
注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。
这一题就结束了。
创建一个100位宽2路选择器。当 sel=0 时,选择 a。当 sel=1 时,选择 b。
module top_module(
input [99:0] a, b,
input sel,
output [99:0] out );
这道题难度不大核心代码只有一行。
module top_module(
input logic [99:0] a, b,
input logic sel,
output logic [99:0] out );
assign out = sel ? b : a;
endmodule
点击Submit,等待一会就能看到下图结果:
注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。
这一题就结束了。
创建一个 16 位宽的 9 选 1 多路选择器。sel=0 选择 a,sel=1 选择 b,等等。对于未使用的情况(sel=9 到 15),将所有输出位设置为“1”。
module top_module(
input [15:0] a, b, c, d, e, f, g, h, i,
input [3:0] sel,
output [15:0] out );
这种多路选择,用条件运算显然不合适,所以我们选择使用case。
module top_module(
input logic [15:0] a, b, c, d, e, f, g, h, i,
input logic [3:0] sel,
output logic [15:0] out );
always_comb begin
case(sel)
4'd0:begin
out = a;
end
4'd1:begin
out = b;
end
4'd2:begin
out = c;
end
4'd3:begin
out = d;
end
4'd4:begin
out = e;
end
4'd5:begin
out = f;
end
4'd6:begin
out = g;
end
4'd7:begin
out = h;
end
4'd8:begin
out = i;
end
default:begin
out = 16'hffff;
end
endcase
end
endmodule
点击Submit,等待一会就能看到下图结果:
注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。
这一题就结束了。
创建一个 1 位宽、256 选 1 的多路选择器。256 个输入打包成一个 256 位输入向量。sel=0 应该选择in[0], sel=1 选择in[1]位, sel=2 选择in[2]位,等等。
module top_module(
input [255:0] in,
input [7:0] sel,
output out );
题目输入是一个向量,我们在设计的时候不可能按照case或者三元运算去做设计(工作量巨大),所以我们需要观察这个题目的特点,输入是256位宽,是不是2^8次方?
根据题目提示:选择运算符的 index 可以为变量,只要变量的位宽和向量的长度匹配即可。
So?
module top_module(
input logic [255:0] in,
input logic [7:0] sel,
output logic out );
assign out = in[sel];
endmodule
点击Submit,等待一会就能看到下图结果:
注意图中无波形。
这一题就结束了。
本题中需要实现一个 256 选 1 选择器,sel 信号作为选择信号,当 sel = 0 时选择 in[3:0],sel = 1 时选择 in[7:4],以此类推。同上一题的区别在于,位宽从 1 位变到了 4 位。
module top_module(
input [1023:0] in,
input [7:0] sel,
output [3:0] out );
将上一题答案稍加改造即可,选择的位跨4位并且+4。
module top_module(
input logic [1023:0] in,
input logic [7:0] sel,
output logic [3:0] out );
assign out = in[sel * 4 +: 4];
endmodule
点击Submit,等待一会就能看到下图结果:
注意图中无波形。
这一题就结束了。
今天的几道题就结束了,整体比较简单,没有复杂的代码,没有复杂的设计思路。
最后我这边做题的代码也是个人理解使用,有错误欢迎大家批评指正,祝大家学习愉快~
代码链接:
https://github.com/suisuisi/SystemVerilog/tree/main/SystemVerilogHDLBits
审核编辑 :李倩
全部0条评论
快来发表一下你的评论吧 !