二、7【FPGA】层次化设计

前言

学习说明此文档为本人的学习笔记

学习视频:是根据野火FPGA视频教程——第九讲
https://www.bilibili.com/video/BV1nQ4y1Z7zN?p=3

学习资料:《数字电子技术基础》清华大学出版社

                  《Verilog HDL数字设计与综合》第二版

理论学习

层次建模在Verilog编程语言中有讲解,请参看本人的另一篇博客:

三、2【Verilog HDL】基础知识之层次建模_FPGA-桥的博客-CSDN博客《Verilog HDL 数字设计与综合》第二版,第二章学习笔记,主要描述了功能块的使用https://blog.csdn.net/ARM_qiao/article/details/124033741全加器及多位加法器的实现的方式是通过半加器串联得到,其基础理论可以参考本人的另一篇博客:

《数字电子技术基础》4.3 若干常用的组合逻辑电路 学习笔记_FPGA-桥的博客-CSDN博客《数字电子技术基础》常用的组合逻辑电路编码器和译码器、数据选择器和数据分配器、加法器、数值比较器、奇偶发生/校验器https://blog.csdn.net/ARM_qiao/article/details/124052097

实战演练

一、设计规划

1.1 功能描述

通过层次化设计实现一个全加器,全加器的基础理论上面链接已经给出

1.2 硬件资源

KEY1、KEY2、KEY3分别作为分别作为加数in1、被加数in2和进位信号cin的信号输入;

LED灯D9作为求和输出sum,LED灯D10作为进位的输出count。

二、程序设计

2.1 模块框图

  

2.2 端口信号及其真值表

输入输出信号描述
信号位宽类型功能描述板载引脚板载功能
in11bitinput加数1V17按键KEY1
in21bitinput加数2W17按键KEY2
cin1bitinput进位AA18按键KEY3
sum1bitoutput求和结果M21LED灯D9
cout1bitoutput求和进位L21LED灯D10
半加器真值表
输入输出
in1in2cinsumcout
00000
110
01010
101
10010
101
11001
111

2.3 波形图绘制

2.4 代码编写

在编写全加器前,由于全加器调用了两个半加器,所以需要将前一节的半加器代码添加进来。

添加方式在之前已经讲过,请参考本人另一篇博客:

二、3【FPGA】如何点亮LED灯_FPGA-桥的博客-CSDN博客FPGA开发 按键控制LED灯的亮灭Xilinx Artix7https://blog.csdn.net/ARM_qiao/article/details/123969251下面这张图也现实了添加方式:

`timescale 1ns / 1ps
//
// Company: 追逐者——桥的小作坊
// Engineer: 
// 
// Create Date: 2022/04/20 16:48:53
// Design Name: 
// Module Name: full_adder
// Project Name: 
// Target Devices: 
// Tool Versions: Vivado 2018_3
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:视频学习代码
// 
//


module full_adder(
    output wire sum,
    output wire count,
    
    input wire in1,
    input wire in2,
    input wire cin
    );
//声明中间变量    
    wire H0_sum, H0_count;
    wire H1_count;
//调用半加器实例化
//顺序端口链接
    half_add  half_adder0(H0_sum, H0_count, in1, in2);
//命名端口链接    
    half_add  half_adder1(
        .sum (sum),
        .cout(H1_count),
             
        .in1 (H0_sum),
        .in2 (cin)
        );
    assign count = (H0_count | H1_count);
       
endmodule

 RTL代码对应的原理视图: 

本人在编写代码时出现问题: 将assign count = (H0_count | H1_count);中的count写成了cout,虽然代码并没有报错(语法说的过去),但是并没有完成连线输出。可以通过逻辑综合侯生成的RTL视图来判断是否正确,如图为错误的RTL视图:

三、逻辑仿真

3.1 仿真文件的编写

`timescale 1ns / 1ps
//
// Company: 追逐者——桥的小作坊
// Engineer: 
// 
// Create Date: 2022/04/20 20:22:40
// Design Name: 
// Module Name: tb_full_adder
// Project Name: 
// Target Devices: 
// Tool Versions: Vivado 2018_3
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:视频学习代码
// 
//

module tb_full_adder();
    wire sum, cout;
    reg  in1, in2, cin;
    
    initial begin
        in1 <= 1'b0;
        in2 <= 1'b0;
        cin <= 1'b0;
    end 
       
    initial begin
        $timeformat(-12, 0, "ps", 6);
        $monitor($time, "in1=%b, in2=%b, cin=%b", in1, in2, cin);
    end 
    
    always #10 in1 <= {$random} % 2 ;
    always #10 in2 <= {$random} % 2 ;
    always #10 cin <= {$random} % 2 ;
          
//  always@ #10 cin <= {$random} % 2 ;
//always@(*)
    
//实例化(即调用)
    full_adder full_adder_inst(
        .sum  (sum),  
        .count(cout),
        
        .in1  (in1),
        .in2  (in2),
        .cin  (cin)
        );
    
endmodule

编写时发生的错误:将“   always #10 cin <= {$random} % 2 ;  ”

                            写成“   always@ #10 cin <= {$random} % 2 ;  ”

多加了一个@

原因:“  always@(*) ” 和在选择语句中出现的,记混了,这个的意思为通配符,意思是在选择语句中只要有变量发生改变就进入该循环。

3.2 仿真波形图的对比

与之前的真值表和绘制的波形图进行对比可以,功能逻辑仿真波形图并没有问题。 

四、上板验证

4.1 管脚绑定

编写管脚约束文件full_adder.xdc文件

#按键 led灯
set_property PACKAGE_PIN   V17  [get_ports in1]
set_property PACKAGE_PIN   W17  [get_ports in2]
set_property PACKAGE_PIN   AA18 [get_ports in3]
set_property PACKAGE_PIN   M21  [get_ports sum]
set_property PACKAGE_PIN   L21  [get_ports cout]
set_property IOSTANDARD    LVCMOS33 [get_ports in1]
set_property IOSTANDARD    LVCMOS33 [get_ports in2]
set_property IOSTANDARD    LVCMOS33 [get_ports in3]
set_property IOSTANDARD    LVCMOS33 [get_ports sum]
set_property IOSTANDARD    LVCMOS33 [get_ports cout]

4.2 程序下载与固化

在生成bit流文件时,设置同时生成bin固化文件

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追逐者-桥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值