当前位置:   article > 正文

fpga代码规范之GVIM编辑器_gvim生成fpga测试文件模板

gvim生成fpga测试文件模板

GVIM 是类似于记事本的代码编辑工具,但相比于记事本其输入效率更高,可以更好的提升工作 效率。由于 GVIM 具有丰富的代码补全、编译及错误跳转等便于编程的功能,其在 IC 开发领域得到 了广泛应用,也为学习 FPGA 工程提供了助力。GVIM 是一款 FPGA 工程师常用的软件,本文是基于明德扬的教程总结了一些常用且相对好用的命令。

首先是GVIM分为三种模式:命令模式(打开gvim为默认模式,即光标闪烁时就是命令模式);插入模式(左下角显示“插入”);列操作模式(左下角显示“可视块”)。

下图是三者的转换关系:

 1.列删除的方法:在插入模式下,选择要删除的块,再按”ctrl+q“,再按delete

 

 2.列插入:在命令模式下,光标放在要添加的行,然后按下”ctrl+q“,使用h,j,k,l(小写的L)去选择范围,最后按下I(大写的i),输入想要添加的数据,最后按下ESC。(多注意左下角在什么模式下

 

 3.模块框架:在插入模式下,输入”Module“

  1. module module_name(
  2. clk ,
  3. rst_n ,
  4. //其他信号,举例dout
  5. dout
  6. );
  7. //参数定义
  8. parameter DATA_W = 8;
  9. //输入信号定义
  10. input clk ;
  11. input rst_n ;
  12. //输出信号定义
  13. output[DATA_W-1:0] dout ;
  14. //输出信号reg定义
  15. reg [DATA_W-1:0] dout ;
  16. //中间信号定义
  17. reg signal1;
  18. //组合逻辑写法
  19. always@(*)begin
  20. end
  21. //时序逻辑写法
  22. always@(posedge clk or negedge rst_n)begin
  23. if(rst_n==1'b0)begin
  24. end
  25. else begin
  26. end
  27. end
  28. endmodule

 4.时序逻辑:在插入模式下输入“Shixu”或者“Shixu2”或“Shixu3”

  1. always @(posedge clk or negedge rst_n)begin
  2. if(rst_n==1'b0)begin
  3. end
  4. else begin
  5. end
  6. end
  1. always @(posedge clk or negedge rst_n)begin
  2. if(rst_n==1'b0)begin
  3. end
  4. else if()begin
  5. end
  6. else if()begin
  7. end
  8. end
  1. always @(posedge clk or negedge rst_n)begin
  2. if(rst_n==1'b0)begin
  3. end
  4. else if()begin
  5. end
  6. else if()begin
  7. end
  8. else if()begin
  9. end
  10. end

5.组合逻辑:在插入模式下输入“Zuhe”或者“Zuhe2”或“Zuhe3”

  1. always @(*)begin
  2. end
  1. always @(*)begin
  2. if()begin
  3. end
  4. else begin
  5. end
  6. end
  1. always @(*)begin
  2. if()begin
  3. end
  4. else if()begin
  5. end
  6. else begin
  7. end
  8. end

6.计数器:在命令模式下,输入“:call MDYJSQ()”  (当有多个计数器时,仍然用这个命令,计数器命名会自动+1)

  1. reg [ ():0] cnt0 ;
  2. wire add_cnt0 ;
  3. wire end_cnt0 ;
  4. always @(posedge clk or negedge rst_n) begin
  5. if (rst_n==0) begin
  6. cnt0 <= 0;
  7. end
  8. else if(add_cnt0) begin
  9. if(end_cnt0)
  10. cnt0 <= 0;
  11. else
  12. cnt0 <= cnt0+1 ;
  13. end
  14. end
  15. assign add_cnt0 = ();
  16. assign end_cnt0 = add_cnt0 && cnt0 == ()-1 ;
  1. reg [ ():0] cnt1 ;
  2. wire add_cnt1 ;
  3. wire end_cnt1 ;
  4. always @(posedge clk or negedge rst_n) begin
  5. if (rst_n==0) begin
  6. cnt1 <= 0;
  7. end
  8. else if(add_cnt1) begin
  9. if(end_cnt1)
  10. cnt1 <= 0;
  11. else
  12. cnt1 <= cnt1+1 ;
  13. end
  14. end
  15. assign add_cnt1 = ();
  16. assign end_cnt1 = add_cnt1 && cnt1 == ()-1 ;

7.状态机:在插入模式下,输入“Ztj”

  1. //四段式状态机
  2. //第一段:同步时序always模块,格式化描述次态寄存器迁移到现态寄存器(不需更改)
  3. always@(posedge clk or negedge rst_n)begin
  4. if(!rst_n)begin
  5. state_c <= IDLE;
  6. end
  7. else begin
  8. state_c <= state_n;
  9. end
  10. end
  11. //第二段:组合逻辑always模块,描述状态转移条件判断
  12. always@(*)begin
  13. case(state_c)
  14. IDLE:begin
  15. if(idl2s1_start)begin
  16. state_n = S1;
  17. end
  18. else begin
  19. state_n = state_c;
  20. end
  21. end
  22. S1:begin
  23. if(s12s2_start)begin
  24. state_n = S2;
  25. end
  26. else begin
  27. state_n = state_c;
  28. end
  29. end
  30. S2:begin
  31. if(s22s3_start)begin
  32. state_n = S3;
  33. end
  34. else begin
  35. state_n = state_c;
  36. end
  37. end
  38. default:begin
  39. state_n = IDLE;
  40. end
  41. endcase
  42. end
  43. //第三段:设计转移条件
  44. assign idl2s1_start = state_c==IDLE && ;
  45. assign s12s2_start = state_c==S1 && ;
  46. assign s22s3_start = state_c==S2 && ;
  47. //第四段:同步时序always模块,格式化描述寄存器输出(可有多个输出)
  48. always @(posedge clk or negedge rst_n)begin
  49. if(!rst_n)begin
  50. out1 <=1'b0 //初始化
  51. end
  52. else if(state_c==S1)begin
  53. out1 <= 1'b1;
  54. end
  55. else begin
  56. out1 <= 1'b0;
  57. end
  58. end

8.测试文件模板:在插入模式下,输入“Test”

  1. `timescale 1 ns/1 ns
  2. module testbench_name();
  3. //时钟和复位
  4. reg clk ;
  5. reg rst_n;
  6. //uut的输入信号
  7. reg[3:0] din0 ;
  8. reg din1 ;
  9. //uut的输出信号
  10. wire dout0;
  11. wire[4:0] dout1;
  12. //时钟周期,单位为ns,可在此修改时钟周期。
  13. parameter CYCLE = 20;
  14. //复位时间,此时表示复位3个时钟周期的时间。
  15. parameter RST_TIME = 3 ;
  16. //待测试的模块例化
  17. module_name uut(
  18. .clk (clk ),
  19. .rst_n (rst_n ),
  20. .din0 (din0 ),
  21. .din1 (din1 ),
  22. .dout0 (dout0 ),
  23. .dout1 (dout1 )
  24. );
  25. //生成本地时钟50M
  26. initial begin
  27. clk = 0;
  28. forever
  29. #(CYCLE/2)
  30. clk=~clk;
  31. end
  32. //产生复位信号
  33. initial begin
  34. rst_n = 1;
  35. #2;
  36. rst_n = 0;
  37. #(CYCLE*RST_TIME);
  38. rst_n = 1;
  39. end
  40. //输入信号din0赋值方式
  41. initial begin
  42. #1;
  43. //赋初值
  44. din0 = 0;
  45. #(10*CYCLE);
  46. //开始赋值
  47. end
  48. //输入信号din1赋值方式
  49. initial begin
  50. #1;
  51. //赋初值
  52. din1 = 0;
  53. #(10*CYCLE);
  54. //开始赋值
  55. end
  56. endmodule

总结:将GVIM编辑器和quartus或者vivado结合起来使用会事半功倍。

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

闽ICP备14008679号