第15周实验--FPGA编程入门

目录

一、Verilog编程入门练习

练习网站:https://hdlbits.01xz.net/wiki/Main_Page

在这里插入图片描述

1.1、门电路

(1)与门

在这里插入图片描述

module top_module( 
    input a, 
    input b, 
    output out );
    assign out = a&b;
endmodule

在这里插入图片描述

(2)或非门

或非门是具有多端输入和单端输出的门电路。当任一输入端(或多端)为高电平(逻辑“1”)时,输出就是低电平(逻辑“0”);只有当所有输入端都是低电平(逻辑“0”)时,输出才是高电平(逻辑“1”)。输入的或非门真值表如下表所示:
在这里插入图片描述

在这里插入图片描述

module top_module( 
    input a, 
    input b, 
    output out );
    assign out = ~(a|b);
endmodule

在这里插入图片描述

(3)同或门

同或门(英语:XNOR gate或equivalence gate)也称为异或非门,在异或门的输出端再加上一个非门就构成了异或非门,是数字逻辑电路的基本单元,有2个输入端、1个输出端。当2个输入端中有且只有一个是低电平(逻辑0)时,输出为低电平。亦即当输入电平相同时,输出为高电平(逻辑1)。
在这里插入图片描述

module top_module( 
    input a, 
    input b, 
    output out );
    assign out = ~(a^b);
endmodule

在这里插入图片描述

1.2、组合电路

(1)Declaring wires

在这里插入图片描述

module top_module(
    input a,
    input b,
    input c,
    input d,
    output out,
    output out_n   ); 
    wire and_ab;
    wire and_cd;
    assign and_ab = a&b;
    assign and_cd = c&d;
    assign out = and_ab|and_cd;
    assign out_n = ~out;
endmodule

在这里插入图片描述

(2)7458

在这里插入图片描述

module top_module ( 
    input p1a, p1b, p1c, p1d, p1e, p1f,
    output p1y,
    input p2a, p2b, p2c, p2d,
    output p2y );
    
    wire p11, p12, p21, p22;
    assign p11 = (p1a&p1b&p1c);
    assign p12 = (p1d&p1e&p1f);
    assign p21 = (p2a&p2b);
    assign p22 = (p2c&p2d);
    assign p1y = p11 | p12;
    assign p2y = p21 | p22;

endmodule

在这里插入图片描述

(3)7420

在这里插入图片描述

module top_module ( 
    input p1a, p1b, p1c, p1d,
    output p1y,
    input p2a, p2b, p2c, p2d,
    output p2y );
    assign p1y = ~(p1a&p1b&p1c&p1d);
    assign p2y = ~(p2a&p2b&p2c&p2d);

endmodule

在这里插入图片描述

1.3、时序电路

(1)D触发器

在这里插入图片描述

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

在这里插入图片描述

(2)Dff8

module top_module (
    input clk,
    input [7:0] d,
    output [7:0] q
);
    always@(posedge clk) begin
        q <= d;
    end

endmodule

在这里插入图片描述

(3)DFF8r

module top_module (
    input clk,
    input reset,            // Synchronous reset
    input [7:0] d,
    output [7:0] q
);
    always@(posedge clk) begin
        q <= (~{8{reset}} & d);
    end
endmodule

在这里插入图片描述

二、Logisim仿真

首先安装Logisim软件,新建一个项目,采用门电路组合电路方式完成一个1位全加器的设计,并在Logisim中进行测试。然后封装这个1位全加器为自定义的一个子电路模块(比如名称为OneAdder),然后新建一个项目,用1位全加器串行级联方式完成一个4位全加器的设计,并进行功能测试。

2.1、1bit全加器

1bit全加器真值表如下:

abcinsum
0000
0101
1001
1110

逻辑表达式如下:

sum = a ⊕ b ⊕ cin;
cout = ab +(a⊕b)cin ;

绘制电路图如下:
在这里插入图片描述
测试如下(使用工具栏中的修改值工具):
在这里插入图片描述

2.2、4bit全加器

封装1bit全加器,使用串联方法进行4bit全加器的构建:
在这里插入图片描述
验证如下:
在这里插入图片描述
也可查看其真值表:
在这里插入图片描述

四、Quartus实验仿真

首先基于Quartus 软件完成一个1位全加器的设计。分别采用原理图输入以及 Verilog编程 这两种设计方法。然后通过4个1位全加器的串行级联,完成一个4位全加器的 原理图设计;再改用 Verilog编程(3种模式:门电路、数据流和行为级描述),完成这个4位全加器设计,并观察Verilog代码编译综合后生成的 RTL电路,与之前电路图设计的4位全加器电路进行对比 。

4.1、原理图输入1bit全加器

4.1.1、创建工程

点击new project wizard,选择创建路径以及工程名
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
后续直接next到finish

4.1.2、电路图

file->new
在这里插入图片描述
在这里插入图片描述
编译
在这里插入图片描述
查看RTL
在这里插入图片描述
创建vwm格式波形文件,仿真
在这里插入图片描述

4.2、Verilog语言实现1bit全加器

4.2.1、创建verilog文件

在这里插入图片描述

4.2.2、代码

module FullAdder_gate(
	input a, b, cin,
	output sum, cout
);
	assign sum = a ^ b ^ cin;
	assign cout = (a & b) | ((a^b)&cin);
endmodule

4.2.3、RTL

在这里插入图片描述
logisim电路图:
在这里插入图片描述
发现两者是一样的。

4.3、原理图设计4bit全加器

4.3.1、电路图

在这里插入图片描述

4.3.2、RTL

在这里插入图片描述

4.4、Verilog编写4bit全加器(数据流)

4.4.1、代码

module FullAdder_four_gate (
	input [3:0] a, b,
	output [3:0] sum,
	input cin,
	output cout
);
	wire c1, c2, c3;
	FullAdder_one_gate f1(a[0], b[0], cin, sum[0], c1);
	FullAdder_one_gate f2(a[1], b[1], c1, sum[1], c2);
	FullAdder_one_gate f3(a[2], b[2], c2, sum[2], c3);
	FullAdder_one_gate f4(a[3], b[3], c3, sum[3], cout);
endmodule

module FullAdder_one_gate (
	input a, b, cin,
	output sum, cout
);
	assign sum = a^b^cin;
	assign cout = (a&b)|((a^b)&cin);
endmodule

4.4.2、RTL

在这里插入图片描述

4.5、Verilog编写4bit全加器(行为级描述)

4.5.1、代码

module FullAdder_one_functional (
	input a,b,cin,
	output sum,cout
);
	assign {cout, sum} = a + b + cin;
endmodule

module FullAdder_four_functional (
	input [3:0] a, b,
	output [3:0] sum,
	input cin,
	output cout);
	wire c0, c1, c2;
	FullAdder_one_functional f1(a[0], b[0], cin, sum[0], c0);
	FullAdder_one_functional f2(a[1], b[1], c0, sum[1], c1);
	FullAdder_one_functional f3(a[2], b[2], c1, sum[2], c2);
	FullAdder_one_functional f4(a[3], b[3], c2, sum[3], cout);
endmodule

4.5.2、RTL

在这里插入图片描述
logisim生成的:
在这里插入图片描述
对比可发现,使用verilog可以将输入个数变为位宽处理,其它部分区别并不是很大。

五、VHDL语言风格描述

5.1、行为描述

使用过程块语句结构(always)和比较抽象的高级程序语句对电路的逻辑功能进行描述。

5.2、数据流描述

使用连续赋值语句(assign)对电路的逻辑功能进行描述,该方式特别便于对组合逻辑电路建模。

5.3、门级描述

使用实例化低层次模块的方法,即调用其他已经定义过的低层次模块对整个电路的功能进行描述,或者直接调用Verilog内部预先定义的基本门级元件描述电路的结构。

六、仿真波形烧录验证

在这里插入图片描述
在这里插入图片描述
在实验室只做出了一位全加器,忘记拍视频,借用同学的视频展示效果。
在这里插入图片描述

六、实验总结

经过本次实验初步了解了Verilog编程的思想,熟悉了quartus的基本操作,发现之前学过的模数电知识已经全忘了,还有计算机系统等,需要重新再回顾一下知识。

参考资料

https://blog.csdn.net/qq_43279579/article/details/115286467
https://blog.csdn.net/qq_43279579/article/details/115480406
https://blog.csdn.net/m0_74045503/article/details/134960936

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值