当前位置:   article > 正文

vivado HDL编写示例_vivado数字信号处理实例

vivado数字信号处理实例

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

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

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

  • FDCE:带有时钟使能和异步清0的D触发器;

  • FDPE:带有时钟使能和异步预置(Preset)的D触发器;

  • FDSE:带有时钟使能和同步置位的D触发器;

  • FDRE:带有时钟使能和同步复位的D触发器;

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

  1. module dff(
  2. input clk,
  3. input reset,
  4. input d,
  5. output reg q
  6. );
  7. always @(posedge clk or posedge reset) begin
  8. if (reset) begin
  9. q <= 0;
  10. end else begin
  11. q <= d;
  12. end
  13. end
  14. endmodule

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

  1. module register(
  2. input clk,
  3. input enable,
  4. input [7:0] d,
  5. output reg [7:0] q
  6. );
  7. always @(posedge clk) begin
  8. if (enable) begin
  9. q <= d;
  10. end
  11. end
  12. endmodule
  13. Vivado综合会

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

  1. //带有Postive Gate和异步复位的锁存器
  2. module latches (
  3. input a,
  4. input b,
  5. input clr,
  6. output reg q
  7. );
  8. always @ *
  9. if(CLR) q = a;
  10. else if(G) q = b;
  11. endmodule

二、三态缓冲器

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

  1. module tristate_buffer(
  2. input enable,
  3. input [7:0] data_in,
  4. output reg [7:0] data_out,
  5. inout [7:0] bus
  6. );
  7. assign bus = enable ? data_out : 8'bZ;
  8. always @(bus, enable) begin
  9. if (enable) begin
  10. data_out <= data_in;
  11. end
  12. end
  13. endmodule

三、移位寄存器

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

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

  1. module shift_register(
  2. input clk,
  3. input [7:0] data_in,
  4. output reg [7:0] data_out
  5. );
  6. reg [7:0] reg_data [0:7];
  7. always @(posedge clk) begin
  8. for (int i = 7; i > 0; i--) begin
  9. reg_data[i] <= reg_data[i-1];
  10. end
  11. reg_data[0] <= data_in;
  12. end
  13. assign data_out = reg_data[7];
  14. endmodule

四、乘法器

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

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

  1. module multiplier_unsigned(
  2. input clk,
  3. input [7:0] a,
  4. input [7:0] b,
  5. output reg signed [15:0] c
  6. );
  7. always @(posedge clk) begin
  8. c <= a * b;
  9. end
  10. endmodule

五、黑盒子

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

  1. //模块定义
  2. (* black_box *) module black_box
  3. (
  4. input in1, in2,
  5. output dout
  6. );
  7. //此处省略代码
  8. endmodule
  9. //模块实例化
  10. module black_box
  11. (
  12. input DI_1, DI_2,
  13. output DOUT
  14. );
  15. //模块调用
  16. black_box u_black_box (
  17. .in1(DI_1),
  18. .in2(DI_2),
  19. .dout(DOUT)
  20. );
  21. endmodule

六、FSM状态机

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

  1. module fsm(
  2. input clk,
  3. input reset,
  4. input [1:0] state_in,
  5. output reg [1:0] state_out
  6. );
  7. parameter STATE_A = 2'd0;
  8. parameter STATE_B = 2'd1;
  9. parameter STATE_C = 2'd2;
  10. reg [1:0] state_reg;
  11. always @(posedge clk) begin
  12. if (reset) begin
  13. state_reg <= STATE_A;
  14. end else begin
  15. case (state_reg)
  16. STATE_A: state_reg <= STATE_B;
  17. STATE_B: state_reg <= STATE_C;
  18. STATE_C: state_reg <= STATE_A;
  19. default: state_reg <= STATE_A;
  20. endcase
  21. end
  22. end
  23. assign state_out = state_reg;
  24. endmodule
 

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

闽ICP备14008679号