目录
1.门电路的练习
1.1 有三个 wire : a,b 以及 out。a,b 信号已经由模块的输入端口驱动,但图中黑色的部分中,wire out 还没有被任何信号驱动。本题要写一个 assign 语句,使 a,b 信号经过与门的输出驱动 wire out 信号
。
`module top_module(
input a,
input b,
output out );
assign out = a & b;
endmodule`
& 和 && 的区别,& 是逐位与,而 && 是逻辑与。
1.2使用 Verilog 实现一个 NOR 门,注意这里其实是或非门,而不是更常见的异或门,或非门是或门的输出取反。
module top_module(
input a,
input b,
output out );
assign out =~ (a | b);
endmodule
注意括号的由来,因为 ~ 非逻辑的优先级大于 | 或。
1.3同或门 (XNor Gate) 是异或门 (Nor Gate) 的取反输出。异或门的输入输出可以概括为:(输入)相同(输出)为 0 ,不同为 1 。
^ 为逐位异或,Verilog 中不存在逻辑异或符号。
2.组合电路的练习
2.1分别输出 16 位输入信号的高 8 位 和低 8 位。
`default_nettype none // Disable implicit nets. Reduces some types of bugs.
module top_module(
input wire [15:0] in,
output wire [7:0] out_hi,
output wire [7:0] out_lo );
assign out_hi = in[15:8];
assign out_lo = in[7:0];
endmodule
这里使用 [ : ] 语法进行了最朴素和常用的信号片选。
2.2分别构建一个 4 输入与门,或门以及异或门。
module top_module(
input [3:0] in,
output out_and,
output out_or,
output out_xor
);
assign out_and = & in;
assign out_or = | in;
assign out_xor = ^ in;
endmodule
4 输入逻辑门,转换为 Verilog 的思想是将 4 个输入变量进行逻辑操作,得到 1 比特结果,在本题中,最简单的写法是
assign out_and = in[3] & in[2] & in[1] & in[0];
解答中的写法使用了缩减运算符的语法,和将位展开的写法相同,但更加简便,我们将在后续的课程中加以展开。
2.3
上图上方的方格表示模块 32 位输入向量,按照上下对应关系,输出为下方的 4 个 8 比特向量。
module top_module (
input [4:0] a, b, c, d, e, f,
output [7:0] w, x, y, z );//
// assign { ... } = { ... };
assign w = {a,b[4:2]};
assign x = {b[1:0],c,d[4]};
assign y = {d[3:0],e[4:1]};
assign z = {e[0],f,2'b11};
endmodule
3.时序电路的练习
3.1给出了一个名为mod_a的模块,该模块按顺序具有2个输出和4个输入。必须将6个端口按位置顺序与顶层的端口out1,out2,a,b,c和d相连接。
module top_module (
input a,
input b,
input c,
input d,
output out1,
output out2
);
mod_a name(out1,out2,a,b,c,d);
endmodule
3.2 给出了一个名为my_dff8的模块,包含两个输入和一个输出(实现一个8bit的D触发器)。请实例化三个,并将它们连接在一起,形成一个长度为3的8bit移位寄存器。此外,再写出一个4选1多路复用器(未提供模块模型),根据输入的sel[1:0]选择要输出的内容:输入D的值,在第一个D触发器之后的值,第二个或第三个D触发器之后的值。(可以说sel选择的是输入延迟的的周期数,0~3个时钟周期不等。)
module top_module (
input clk,
input [7:0] d,
input [1:0] sel,
output reg [7:0] q
);
wire [7:0] o1, o2, o3; // 声明每一个触发器的输出
// Instantiate three my_dff8s
my_dff8 d1 ( clk, d, o1 );
my_dff8 d2 ( clk, o1, o2 );
my_dff8 d3 ( clk, o2, o3 );
// 这是实现4选1选择器的一种方法
always @(*) // 组合逻辑always块
case(sel)
2'h0: q = d;
2'h1: q = o1;
2'h2: q = o2;
2'h3: q = o3;
endcase
endmodule
如果在写文档的时候这样只表注输入输出端口而没有名字是不规范的。自己写文档的时候要避免。
3.3 给出了一个名为my_dff的模块,包含两个输入和一个输出(实现D触发器的功能)。实例化三个my_dff,然后将它们连接在一起,构成长度为3的移位寄存器。注意:clk端口需要连接到所有的寄存器实例上。
module top_module (
input clk,
input d,
output q
);
wire a, b; // 声明两个wire变量,命名为a, b
// 对my_dff进行了三次实例化,用了三个不用的名字 (d1, d2, and d3).
// 端口使用了位置连接的方式( input clk, input d, output q)
my_dff d1 ( clk, d, a );
my_dff d2 ( clk, a, b );
my_dff d3 ( clk, b, q );
endmodule
要在模块内部进行连接,您可能需要先声明一些连线。 注意命名连线和模块实例时,它们的名字必须是唯一的。
4.环境配置
Quartus的安装与破译
链接:https://pan.baidu.com/s/1KPh95-EZRxY86J38OeoRxw
提取码:p7sq
Logisim下载安装与使用:
https://blog.csdn.net/m0_59667483/article/details/125941447
modelsim安装与配置:
https://blog.csdn.net/vistayi/article/details/102966383
https://blog.csdn.net/QWERTYzxw/article/details/115350715
5.使用logisim实现N位全加器
5.1 1位全加器
(1)实验设计分析
首先,通过逻辑抽象为真值表。通过分析全加器的逻辑功能后,我们容易得到全加器有三个输入端,即加数、被加数和低一级的进位,同时其有两个输出端,即当前位置的进位和当前位置的加法运算结果。
令加数为A,被加数为B,低一级的进位为Ci,当前位置的加法运算结果为S,当前位置的进位为Co,我们可以得到五个变量的真值表,结果如下所示:
其次,通过真值表写表达式。通过结果列S和Co,我们可以得到S和Co的原始逻辑表达式和化简逻辑表达式(通过卡诺图)为:
S = A’B’Ci + A’BCi’ + AB’Ci’ + ABCi = A⊕B⊕Ci
Co = A’BCi + AB’Ci + ABCi’ + ABCi = AB + ACi + BCi
因此,在电路图的设计中,S端的处理应该将A和B先通过一次异或门得到A异或B,将A异或B的结果和Ci再通过一次异或门得到A异或B异或Ci。同时,Co端的处理应该将A和B、A和Ci、B和Ci先通过一次与门得到AB、ACi、BCi,再将AB和ACi和BCi再通过一次或门得到AB + ACi + BCi。
实验连线
5.2 4位全加器
4位加减法器
(1)实验设计分析
首先,通过逻辑抽象为真值表。由于实验1已经实现了加法器的功能,因此实验2只需在加法器的基础上实现减法器的功能。通过分析全减器的逻辑功能后,我们容易得到全减器有三个输入端,即减数、被减数和高一级的借位,同时其有两个输出端,即当前位置的借位和当前位置的减法运算结果。
令被减数为A,减数为B,高一级的借位为Ci,当前位置的加减法运算结果为D,当前位置的借位为Co,我们可以得到五个变量的真值表,结果如下所示:
实验连线:
6.在Quartus里实现N位全加器
6.1输入原理图实现1位加法器
打开Quartus,创建项目
选择文件夹,填写名称
配置芯片
next后点击finish
建立原理图
连线时注意不要漏接
查看RTL图
生成波形图
环境配置
功能仿真:
时序仿真:
使用集成元件
7.Verilog编程实现1位加法器
代码:
module full_adder(
//输入信号,ain表示被加数,bin表示加数,cin表示低位向高位的进位
input ain,bin,cin,
//输出信号,cout表示向高位的进位,sum表示本位的相加和
output reg cout,sum
);
reg s1,s2,s3;
always @(ain or bin or cin) begin
sum=(ain^bin)^cin;//本位和输出表达式
s1=ain&cin;
s2=bin&cin;
s3=ain&bin;
cout=(s1|s2)|s3;//高位进位输出表达式
end
endmodule
RLT图:
仿真:
参考:
中文导学:https://zhuanlan.zhihu.com/c_1131528588117385216
学习网站:https://hdlbits.01xz.net/wiki/Main_Page
https://blog.csdn.net/m0_74045503/article/details/134960936
https://blog.csdn.net/m0_65787507/article/details/131627028