当前位置:   article > 正文

学习使用Vivado和SDK进行Xilinx ZYNQ FPGA开发 | (十二)Verilog程序设计举例 | 2023.11.6/星期一/天气晴

vivado

系列文章目录

专栏系列文章:学习Xilinx ZYNQ FPGA开发



摘要

在上一次的学习内容《Vivado建立工程》的基础上,我已经有一个工程了,现在以1位全加器的设计过程来举例说明Verilog HDL程序的设计以及在Vivado上进行程序设计的过程。包括:

  • 编写Verilog代码
  • 仿真
  • RTL分析

一、设计思路

根据真值表进行简化,1位二进制全加器可以由两个半加器和一个或门组成,因此使用自底向上的设计方法,先分别进行底层的或门模块my_or2.v和半加器模块h_adder.v的设计,再进行顶层的1位全加器h_adder.v的设计。
在这里插入图片描述

二、创建Verilog源文件

创建并添加3个源文件
在这里插入图片描述
在Design Sources里右键f_adder.v,选择Set as Top,将f_adder.v设为Top文件。
在这里插入图片描述

三、编写Verilog源程序

或门模块 my_or2.v

// 或门模块
module my_or2(a, b, c); // 模块描述开始
    input a, b;         // 模块输入端口说明
    output c;           // 模块输出端口说明
    // 数据流方式描述模块功能
    assign c = a | b;   // 连续赋值语句描述模块功能
endmodule               // 模块描述结束
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

半加器模块 h_adder.v

// 半加器模块
module h_adder(a, b, so, co);    // 模块描述开始
    input a, b;                 // 模块输入端口说明
    output so, co;              // 模块输出端口说明
    // 数据流方式描述模块功能
    assign so = (a | b) && (!(a && b)); // 连续赋值语句描述模块功能
    assign co = !(!(a && b));           // 连续赋值语句描述模块功能
endmodule               // 模块描述结束
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

全加器模块 f_adder.v

// 全加器模块
module f_adder(ain, bin, cin, sum, cout);    // 模块描述开始
    input ain, bin, cin;                    // 模块输入端口说明
    output sum, cout;                       // 模块输出端口说明
    wire s1, s2, s3;                        // 数据类型说明
    // 使用元件实例化语句描述系统的组成结构
    h_adder u1(.a(ain),.b(bin),.so(s2),.co(s1));    // 名字关联元件实例化
    h_adder u2(.a(s2),.b(cin),.so(sum),.co(s3));    // 名字关联元件实例化
    my_or2 u3(.a(s1),.b(s3),.c(cout));             // 名字关联元件实例化
endmodule               // 模块描述结束
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

四、仿真

在左边流程窗口点击Add Sources,再选择Add or create simulation sources
在这里插入图片描述
在Simulation Sources里面添加一个tb_top.v文件,并编写testbench的内容。

`timescale 1ns / 1ps
module tb_top();
    reg ain, bin, cin;
    wire sum, cout;
    
    initial
    begin
        ain = 0;
        bin = 0;
        cin = 0;
    end
    
    always
        #10 ain = !ain;
        
    always
        #20 bin = !bin;
        
    always
        #40 cin = !cin;
        
    f_adder uut (.ain(ain), .bin(bin), .cin(cin), .sum(sum), .cout(cout));
    
endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

在左边流程窗口中展开SIMULATION,点击Run Simulation,选择Run Behavioral Simulation运行。
在这里插入图片描述
弹出仿真结果窗口,全加器的sum和cout的逻辑符合预期。
在这里插入图片描述

五、查看RTL分析

在左边流程窗口中展开RTL ANALYSIS,选择Schmatic,点击运行。
在这里插入图片描述
打开RTL视图后,可以看出,Verilog等硬件描述语言描述的是一套硬件电路。如果电路系统正常工作的话,电路中各个部分应该是同时工作,也即电路系统的各部分工作是并行的。(经过一定的设计,也可以设计成按顺序工作的)
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/535553
推荐阅读
相关标签
  

闽ICP备14008679号