文章目录
Verilog编程巩固练习
在线编程网站的基本使用方法
编程界面就在主页面上
在下方有各种元件的选择框,点进去就可以看到对应的用法和编程框,写入程序提交后,网站会自动将你的答案与正确答案对比纠错,或用语句给出波形图。
一、门电路
1.1 与门
-
公式:
Y = A + B Y=A+B Y=A+B -
设计代码:
module top_module(
input a,
input b,
output out );
assign out=a&b;
endmodule
- 结果:
1.2 或非门
-
公式:
Y = A + B ‾ Y=\overline{A+B} \\ Y=A+B -
设计代码:
module top_module(
input a,
input b,
output out );
assign out=!(a||b);
endmodule
- 结果:
*
1.3 异或非门
- 公式:
Y
=
A
⊕
B
‾
Y=\overline{A \oplus B} \\
Y=A⊕B
等同于
Y
=
A
⊙
B
Y=A \odot B
Y=A⊙B
- 设计代码:
module top_module(
input a,
input b,
output out );
assign out= !((!a & b) | (a & !b));
endmodule
- 结果:
二、组合逻辑电路
2.1 半加器
- 公式:
S = A ‾ B + A B ‾ C = A B S = \overline{A} B+A\overline{B}\\ \\ C=AB S=AB+ABC=AB - 真值表:
被加数 | 加数B | 和数S | 进位 |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 1 | 1 | 0 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 |
- 设计代码:
module top_module(
input a, b,
output cout, sum );
assign cout=a&b;
assign sum=a^b;
endmodule
- 结果:
2.2 全加器
- 公式:
(一位全加器)
S i = A i ⊕ B i ⊕ C i − 1 C i = A i B i + C i − 1 ( A i + B i ) S_i = A_i \oplus B_i \oplus C_{i-1} \\ C_i=A_i B_i+C_{i-1}(A_i+B_i) \\ Si=Ai⊕Bi⊕Ci−1Ci=AiBi+Ci−1(Ai+Bi)
第二个表达式也可用一个异或门来代替或门对其中两个输入信号进行求和:
C i = A i B i + C i − 1 ( A i ⊕ B i ) C_i=A_i B_i+C_{i-1}(A_i \oplus B_i) Ci=AiBi+Ci−1(Ai⊕Bi) - 真值表:
Ai | Bi | Ci-1 | Si | Ci |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 | 0 |
0 | 1 | 0 | 1 | 0 |
0 | 1 | 1 | 0 | 1 |
1 | 0 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 1 |
1 | 1 | 0 | 0 | 1 |
1 | 1 | 1 | 1 | 1 |
- 设计代码:
module top_module(
input a, b, cin,
output cout, sum );
assign sum = a^b^cin;
assign cout = (a&b)|(a&cin)|(b&cin);
endmodule
- 结果:
2.3 选择器
- 公式:
o u t = B s e l ‾ + A s e l out = B \overline{sel}+Asel\\ out=Bsel+Asel - 真值表:
A | B | sel | out |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 |
1 | 0 | 0 | 0 |
1 | 1 | 0 | 1 |
0 | 0 | 1 | 0 |
0 | 1 | 1 | 0 |
1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 |
- 设计代码:
module top_module(
input a, b, sel,
output out );
assign out=(sel)?b:a;
endmodule
- 结果:
三、时序逻辑电路
3.1 D触发器
- 公式:
Q n + 1 = D Q_{n+1}=D Qn+1=D - 功能表:
D | CLK | Q | Qn |
---|---|---|---|
0 | 上升沿 | 0 | 1 |
1 | 上升沿 | 1 | 0 |
× | 0 | 保持 | 保持 |
× | 1 | 保持 | 保持 |
- 设计代码:
module top_module (
input clk, // Clocks are used in sequential circuits
input d,
output reg q );//
// Use a clocked always block
// copy d to q at every positive edge of clk
// Clocked always blocks should use non-blocking assignments
always@(posedge clk) begin
q <= d;
end
endmodule
- 结果:
3.2 8位D触发器
8位D触发器只需改变D触发器a和b的位宽即可,原理一致,改变代码中a和b的位宽即可
- 设计代码:
module top_module (
input clk,
input [7:0] d,
output [7:0] q
);
always@(posedge clk) begin
q <= d;
end
endmodule
- 结果:
3.3 可复位的D触发器
在D触发器的实际使用过程中,有时候需要一个复位端(也称清零端)
电路上电时,电路的逻辑处于不定状态,复位脉冲的到来将电路初始化为Q=0的状态。随后,在时钟的控制下输出端D的数据在每个时钟上升沿被置到输出端Q。
- 设计代码:
module top_module (
input clk,
input reset, // Synchronous reset
input [7:0] d,
output [7:0] q
);
always@(posedge clk) begin
if(reset)
q <= 8'b0;
else
q <= d;
end
endmodule
- 结果:
3.4 锁存器
- 设计代码:
module top_module (
input d,
input ena,
output q);
always@(*)begin
if(ena)begin
q<=d;
end
end
endmodule
有警告信息:大意是告知我们创建了一个锁存器,锁存器会占用大量资源,系统有必要确实我们是不是有意为之
安装 Robei并完成练习
1、安装
2、注册
在 Robei官网 注册
注册好后登录
一般在注册时填写的信息为学生/Student后,官方会在几天后发给你序列号,由于还没有收到,暂无法继续