文章目录
- 1、 VL1 输出1
- 2、VL2 wire连线
- 3、 VL3 多wire连接
- 4、VL4 反相器
- 5、VL5 与门
- 6、VL6 NOR 门
- 7、VL7 XOR 门
- 8、VL8 逻辑运算
- 10、VL10 逻辑运算2
- 11、VL11 多位信号
- 12、VL12 信号顺序调整
- 13、VL13 位运算与逻辑运算
- 14、VL14 对信号按位操作
- 15、VL15 信号级联合并
- 16、VL16 信号反转输出
- 17、VL17 三元操作符
- 18、VL18 多位信号xnor
- 19、VL19 五到一选择器
- 20、VL20 256选1选择器
1、 VL1 输出1
描述
构建一个没有输入和一个输出常数1的输出的电路
输入描述:
无
输出描述:
输出信号为one
`timescale 1ns/1ns
module top_module(
output one
);
assign one = 1;
endmodule
2、VL2 wire连线
描述
创建一个具有一个输入和一个输出的模块,其行为类似于电路上的连线。
输入描述:
输入信号in0
输出描述:
输出信号out1
`timescale 1ns/1ns
module wire0( input in0, output out1
);
assign out1 = in0;
endmodule
3、 VL3 多wire连接
描述
创建一个具有 2个输入和 3个输出的模块,使用线连接的方式:
a -> z
b -> x
b -> y
输入描述:
input wire a b
输出描述:
output wire x y z
`timescale 1ns/1ns
module top_module(
a, b, x, y, z
);
input a, b;
output x, y, z;
assign x = b;
assign y = b;
assign z = a;
endmodule
4、VL4 反相器
描述
输出输入信号的值的相反的值
输入描述:
in
输出描述:
out
`timescale 1ns/1ns
module top_module(
input in,
output out
);
assign out = ~in;
endmodule
5、VL5 与门
描述
创建实现 AND 门的模块,输入有三个wire,将三个信号(a b c)进行与操作,请思考在实际电路需要几个与门?请写出对应的RTL
输入描述:
a b c
输出描述:
d
`timescale 1ns/1ns
module top_module(
input a,
input b,
input c,
output d );
assign d = a & b & c;
endmodule
6、VL6 NOR 门
描述
创建实现 OR和NOR 的模块,NOR 门是输出反相的 OR 门。
c 是 nor输出,d是or输出
输入描述:
a b
输出描述:
c d
`timescale 1ns/1ns
module top_module(
input a,
input b,
output c,
output d);
assign c = a ~| b;
assign d = a | b;
endmodule
7、VL7 XOR 门
描述
创建一个实现 XOR 门的模块
输入描述:
a b
输出描述:
c
`timescale 1ns/1ns
module top_module(
input a,
input b,
output c );
assign c = a ^ b;
endmodule
8、VL8 逻辑运算
描述
写出如图的rtl逻辑,限制使用最多四次assign
输入描述:
a b c d
输出描述:
e f
`timescale 1ns/1ns
module top_module (
input a,
input b,
input c,
input d,
output e,
output f );
wire out_xor;
assign out_xor = (a & b) ^ (c | d);
assign e = ~out_xor;
assign f = out_xor;
endmodule
9、VL9 模拟逻辑芯片
描述
下图为某芯片的逻辑,请通过RTL实现它的功能
输入描述:
p1a, p1b, p1c, p1d, p1e, p1f,p2a, p2b, p2c, p2d
输出描述:
p1y,p2y
`timescale 1ns/1ns
module top_module (
input p1a, p1b, p1c, p1d, p1e, p1f,
output p1y,
input p2a, p2b, p2c, p2d,
output p2y );
assign p1y = (p1a & p1b & p1c) | (p1f & p1e & p1d);
assign p2y = (p2a & p2b) | (p2c & p2d);
endmodule
10、VL10 逻辑运算2
描述
根据下述逻辑,给出对应的module设计
输入描述:
a b c d
输出描述:
e f
`timescale 1ns/1ns
module top_module (
input a,
input b,
input c,
input d,
output e,
output f );
wire out_xor;
assign out_xor = (a & b) ^ (c ^ d);
assign e = ~out_xor;
assign f = out_xor | d;
endmodule
11、VL11 多位信号
描述
构建一个具有一个3位输入in的信号[2:0],将其分成三个独立的输出a b c(从2到0)
输入描述:
in
输出描述:
a b c
`timescale 1ns/1ns
module top_module(
in, a, b, c
);
input [2:0] in;
output a, b, c;
assign a = in[2];
assign b = in[1];
assign c = in[0];
endmodule
12、VL12 信号顺序调整
描述
一个16位信号in包含四个四位数[3:0]a[3:0]b[3:0]c[3:0]d,将它们顺序倒置为dcba输出,输出out
输入描述:
in
输出描述:
out
`timescale 1ns/1ns
module top_module(
in, out
);
input [15:0] in;
output [15:0] out;
assign out = { in[3:0], in[7:4], in[11:8], in[15:12] };
endmodule
13、VL13 位运算与逻辑运算
描述
现有一个模块,输入信号为[2:0]a和[2:0]b,请输出信号的按位或[2:0]c和或信号d
输入描述:
[2:0]a [2:0]b
输出描述:
[2:0]c d
`timescale 1ns/1ns
module top_module(
input [2:0] a,
input [2:0] b,
output [2:0] c,
output d
);
assign c = a | b;
assign d = a || b;
endmodule
14、VL14 对信号按位操作
描述
将一个五输入的信号分别进行的每一位进行: 全部按位与;全部按位或;全部按位异或
输入描述:
[4:0]in
输出描述:
out_and, out_or, out_xor
`timescale 1ns/1ns
module top_module(
input [4:0] in,
output out_and,
output out_or,
output out_xor
);
assign out_and = & in;
assign out_or = | in;
assign out_xor = ^ in;
endmodule
15、VL15 信号级联合并
描述
将6个输入信号串联转为四个信号输出,输入信号为[4:0] a[4:0] b[4:0]c [4:0]d [4:0]e [4:0]f,末尾增加一个宽度为两位的3,形成32位长度后,按照从前到后的顺序输出[7:0]w [7:0]x [7:0]y [7:0]z
输入描述:
[4:0] a[4:0] b[4:0]c [4:0]d [4:0]e [4:0]f
输出描述:
[7:0]w [7:0]x [7:0]y [7:0]z
在`timescale 1ns/1ns
module top_module(
input [4:0] a, b, c, d, e, f,
output [7:0] w, x, y, z );
assign { w, x, y, z } = {a, b, c, d, e, f, 2'b11};
endmodule
16、VL16 信号反转输出
描述
输入一个16位的信号in,将其从低位到高位输出(即反转顺序输出)为out
输入描述:
[15:0] in
输出描述:
[15:0] out
`timescale 1ns/1ns
module top_module(
input [15:0] in,
output [15:0] out
);
reg [15:0] out;
integer i;
always@(*)begin
for(i=0; i<=15; i=i+1) begin
out[15-i] = in[i];
end
end
endmodule
个人完成90%,这里一开始用initial总是不成功
需要搞清楚 always 和initial的用法。
17、VL17 三元操作符
描述
给定四个无符号数字,找到最大值。不使用if进行判断,尽量少使用语句的情况下完成。
输入描述:
[7:0]a b c d
输出描述:
[7:0] max
`timescale 1ns/1ns
module top_module(
input [7:0] a, b, c, d,
output [7:0] max);
assign max = (((a >= b) ? a:b)>=((c>=d)? c:d)) ?((a >= b) ? a:b):((c>=d) ? c:d);
endmodule
注:一开始分开比较测试但就是 不用过,最后干脆就直接一行搞定,既然尽量少使用语句,那就一行。
18、VL18 多位信号xnor
描述
给定五个1bit信号(a、b、c、d 和 e),生成两种25位的数据: 一种是将信号复制五次后连接起来aaaaabbbbb…,一种是将信号连接起来复制五次成为abcdeabcde… 。比较两个25位信号,如果两个信号的同样位置的位相等,则输出1。
输入描述:
a, b, c, d, e,
输出描述:
[24:0] out
`timescale 1ns/1ns
module top_module(
input a, b, c, d, e,
output [24:0] out
);
assign out = {{5{a}}, {5{b}}, {5{c}}, {5{d}}, {5{e}}} ~^ {5{a, b, c, d, e}};
endmodule
19、VL19 五到一选择器
描述
输入5个4bit信号,根据sel的值选出对应的信号,对应关系为:0~a 1~b 2~c 3~d 4~e 其他~置零
输入描述:
[3:0] a b c d e
[2:0]sel
输出描述:
[3:0] out
`timescale 1ns/1ns
module top_module(
input [3:0] a, b, c, d, e,
input [2:0] sel,
output reg [3:0] out );
always @(*)
case(sel)
3'b000: out = a;
3'b001: out = b;
3'b010: out = c;
3'b011: out = d;
3'b100: out = e;
default: out =0;
endcase
endmodule
20、VL20 256选1选择器
描述
输入一个256位信号,根据sel信号输出对应位数值,当 sel = 0 时选择 in[0],sel = 1 时选择 in[1],以此类推
输入描述:
[255:0] in
[7:0]sel
输出描述:
out
`timescale 1ns/1ns
module top_module (
input [255:0] in,
input [7:0] sel,
output out
);
assign out = in[sel];
endmodule
这道题一开始一直在纠结这个索引是二进制不是常量怎么办,想用for循环的,但卡在了索引上,看了下有个人是直接赋值,居然可以。