0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Vivado HDL编写示例

CHANBAEK 来源:FPGA入门到精通 作者:未可知摩尔 2023-05-16 16:58 次阅读

Vivado 软件提供了HDL编写中常用的示例,旨在帮助初学者更好地理解和掌握HDL编程,这里分享一下verilog代码示例。

一、触发器、寄存器与锁存器

Vivado综合工具根据HDL代码会选择4种寄存器原语:

  • FDCE:带有时钟使能和异步清0的D触发器;
  • FDPE:带有时钟使能和异步预置(Preset)的D触发器;
  • FDSE:带有时钟使能和同步置位的D触发器;
  • FDRE:带有时钟使能和同步复位的D触发器;

触发器是一种存储器件,可以用来存储一个二进制位。 常见的触发器有D触发器、JK触发器、T触发器等。

module dff(
    input clk,
    input reset,
    input d,
    output reg q
);

always @(posedge clk or posedge reset) begin
    if (reset) begin
        q <= 0;
    end else begin
        q <= d;
    end
end

endmodule

寄存器是一种广泛使用的存储器件,可以在时序逻辑中存储多个比特位,通常由触发器或D触发器等逻辑单元实现。 一个寄存器需要同时包含时钟、使能和数据输入端口

module register(
    input clk,
    input enable,
    input [7:0] d,
    output reg [7:0] q
);

always @(posedge clk) begin
    if (enable) begin
        q <= d;
    end
end

endmodule

Vivado综合会报告检测出的锁存器(Latches),这些锁存器是由组合逻辑HDL代码设计错误引起的,比如if或case状态不完整。 综合会为检测出的锁存器报告一个WARNING(Synth 8-327)。

module latches (
    input a,
    input b,
    input clr,
    output reg q
);

always @ *
    if(CLR) q = a;
    else if(G) q = b;

endmodule

二、三态缓冲器

三态缓冲器是一种带有使能控制的存储器件,允许多个设备共享同一个总线信号。 当三态缓冲器的使能信号为高时,它就会输出输入信号; 当使能信号为低时,它就会将输出信号设置为高阻(高阻状态)。

module tristate_buffer(
    input enable,
    input [7:0] data_in,
    output reg [7:0] data_out,
    inout [7:0] bus
);

assign bus = enable ? data_out : 8'bZ;

always @(bus, enable) begin
    if (enable) begin
        data_out <= data_in;
    end
end

endmodule

三、移位寄存器

移位寄存器是一种可以将数据向左或向右移位的存储器件。 它可以在时序逻辑中被用来实现FIR滤波器数字信号处理等应用。

Vivado 综合中使用 SRL 类型的资源(SRL16E 和 SRLC32E)来实现移位寄存器。 根据移位寄存器的长度不同,在综合时会选择采用一个 SRL 类型原语,或采用级联的 SRLC 类型原语进行实现。

module shift_register(
    input clk,
    input [7:0] data_in,
    output reg [7:0] data_out
);

reg [7:0] reg_data [0:7];

always @(posedge clk) begin
    for (int i = 7; i > 0; i--) begin
        reg_data[i] <= reg_data[i-1];
    end
    reg_data[0] <= data_in;
end

assign data_out = reg_data[7];

endmodule

四、乘法器

乘法器是一种数学运算器件,可以在FPGA设计中进行数字乘法。 乘法器在数码信号处理器中非常常见,在数字信号处理、滤波器和音频编解码器等领域有广泛的应用。

Vivado综合时会根据实际情况,确定是用LUT实现,还是用DSP实现,建议使用乘法时,计算结果输出多打两拍,有助于改善时序。

module multiplier_unsigned(
    input clk, 
    input [7:0] a,
    input [7:0] b,
    output reg signed [15:0] c
);

always @(posedge clk) begin
    c <= a * b;
end

endmodule

五、黑盒子

FPGA设计支持EDIF网表,可以在HDL源代码中使用BLACK_BOX属性完成实例化,该实例将被视作黑盒子。

//模块定义
(* black_box *) module black_box
(
    input in1, in2, 
    output dout
);
   //此处省略代码
endmodule

//模块实例化
module black_box
(
    input DI_1, DI_2, 
    output DOUT
);

//模块调用
black_box u_black_box (
    .in1(DI_1),
    .in2(DI_2),
    .dout(DOUT)
);

endmodule

六、FSM状态机

Vivado综合时可以从RTL源码中提取出有限状态机(FSM)逻辑,支持Moore和Mealy型状态机。 一个状态机由状态寄存器、下一个状态功能、输出功能三部分组成。

module fsm(
    input clk,
    input reset,
    input [1:0] state_in,
    output reg [1:0] state_out
);

parameter STATE_A = 2'd0;
parameter STATE_B = 2'd1;
parameter STATE_C = 2'd2;

reg [1:0] state_reg;

always @(posedge clk) begin
    if (reset) begin
        state_reg <= STATE_A;
    end else begin
        case (state_reg)
            STATE_A: state_reg <= STATE_B;
            STATE_B: state_reg <= STATE_C;
            STATE_C: state_reg <= STATE_A;
            default: state_reg <= STATE_A;
        endcase
    end
end

assign state_out = state_reg;

endmodule
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5042

    浏览量

    117768
  • HDL
    HDL
    +关注

    关注

    8

    文章

    324

    浏览量

    47107
  • 锁存器
    +关注

    关注

    8

    文章

    752

    浏览量

    41044
  • 触发器
    +关注

    关注

    14

    文章

    1694

    浏览量

    60424
  • Vivado
    +关注

    关注

    18

    文章

    790

    浏览量

    65111
收藏 人收藏

    评论

    相关推荐

    正弦振荡用verilog HDL如何编写

    正弦振荡用verilog HDL如何编写
    发表于 04-15 22:00

    使用Vivado实现硬宏的示例

    嗨,我正在寻找有关如何使用Xilinx Vivado创建Hard宏的示例。了解如何在设计中修复路由并在阅读pdf(下面)时,提到可以根据要求提供示例,这将非常有帮助。我是否可以收到一些此实施的
    发表于 11-12 14:42

    Vivado生成的HDL代码是否在Vivado自带的许可证之上有任何特殊的许可

    大家好,我想知道Vivado生成的HDL代码是否在Vivado自带的许可证之上有任何特殊的许可。考虑为AXI奴隶生成的代码,有什么阻止我在设置中使用它大学课程的论文?如果代码刚刚生成并从设计诉讼中
    发表于 12-20 11:23

    怎么将Vivado项目转换为ISE项目

    我想知道是否可以将Vivado项目转换为ISE项目,以便将其导入HDL Designer。 HDL设计师确实有Vivado流,但不是Vivado
    发表于 12-20 11:24

    请问Vivado会将设计流程从HDL架构转移到高级功能块生成器吗?

    这样的低级HDL / UCF设计流程用于裸逻辑设计?或者Vivado会继续将设计流程从HDL架构转移到高级功能块生成器吗?谢谢你的时间。以上来自于谷歌翻译以下为原文I should preface
    发表于 07-29 07:54

    vivado_tutorial示例项目文档内容

    你好,我对vivado很新,并尝试使用安装vivado时提供的一些示例。在expamples \ vivado_toturial \ Projects下可以找到几个项目,但是我找不到这
    发表于 03-27 10:17

    请问如何在Vivado项目中实例化hdl系统生成器输出的多个实例》

    嗨,如何在Vivado项目中实例化hdl系统生成器输出的多个实例?在vivado项目中很容易实例化一个hdl系统生成器输出。当我想将另一个实例实例化到同一个项目时,我在合成状态下面临一
    发表于 07-31 10:38

    Vivado的多种RAM编写方式

    Vivado综合可以理解多种多样的RAM编写方式,将其映射到分布式RAM或块RAM中。两种实现方法在向RAM写入数据时都是采取同步方式,区别在于从RAM读取数据时,分布式RAM采用异步方式,块RAM
    发表于 09-29 09:40

    Vivado中进行HDL代码设计

    Vivado中进行HDL代码设计,不仅需要描述数字逻辑电路中的常用功能,还要考虑如何发挥Xilinx器件的架构优势。目前常用的HDL语言有三种。VHDL语言的优势有:语法规则更加严格;在HD
    发表于 09-29 10:08

    Verilog HDL语言及VIVADO的应用

    中国大学MOOC 本课程以目前流行的Xilinx 7系列FPGA的开发为主线,全面讲解FPGA的原理及电路设计、Verilog HDL语言及VIVADO的应用,并循序渐进地从组合逻辑、时序逻辑的开发开始,深入到FPGA的基础应用、综合应用和进阶应用。
    的头像 发表于 08-06 06:12 3499次阅读
    Verilog <b class='flag-5'>HDL</b>语言及<b class='flag-5'>VIVADO</b>的应用

    Vivado中电路结构的网表描述

    我们都知道FPGA的实现过程分为2步:分析综合与布局布线后就可以产生目标文件,这两个步骤中间有个非常重要的文件,那就是-网表。 下图是Vivado中网表列表示例:           Vivado
    的头像 发表于 05-14 10:46 3857次阅读
    <b class='flag-5'>Vivado</b>中电路结构的网表描述

    UM1864_Java编写游戏示例

    UM1864_Java编写游戏示例
    发表于 11-22 19:09 0次下载
    UM1864_Java<b class='flag-5'>编写</b>游戏<b class='flag-5'>示例</b>

    Vivado使用技巧-HDL编写

    Vivado 中进行HDL代码设计,不仅需要描述数字逻辑电路中的常用功能,还要考虑如何发挥Xilinx器件的架构优势。目前常用的HDL语言有三种。 (1)VHDL 语言的优势有: 语法规则更加
    的头像 发表于 12-28 17:05 2521次阅读

    使用C语言编写的热水器控制温度的PID算法示例

    以下是一个使用C语言编写的热水器控制温度的PID算法示例
    的头像 发表于 09-28 17:14 1807次阅读
    使用C语言<b class='flag-5'>编写</b>的热水器控制温度的PID算法<b class='flag-5'>示例</b>

    自己编写函数示例代码很难吗?分享几个示例

    Q A 问: Arduino Uno的函数示例 我决定自己编写函数示例代码,因为这应该是Arduino中的基本示例。网络上确实有关于使用函数的文档,但是,如果要尝试使用代码环境,则必须
    的头像 发表于 11-16 16:05 225次阅读
    自己<b class='flag-5'>编写</b>函数<b class='flag-5'>示例</b>代码很难吗?分享几个<b class='flag-5'>示例</b>!