当前位置:   article > 正文

Verilog与FPGA #1 入门:分析一个4位二进制加法计数器_4位加法计数器设计verilog

4位加法计数器设计verilog

初学FPGA第一天,一遍听课一边总结的笔记 分析不一定准确 若有错误请务必指出

 来源:小明教IC-1天学会verilog(2)_哔哩哔哩_bilibili

Verilog HDL基础知识 - 百度文库

一.分析计数器:

从表中看出

1.q*应该是q的下一个数值  比如q^n+1和q^n的关系   clk的向上箭头表示时钟上升沿触发

2.reset为1时cin中的x意思是无论cin取何值,遇到时钟上升沿时,q*置0

3.reset为0且cin为0时,遇到时钟上升沿时,q*=q,保持计数

4.reset为0且cin为1时,遇到时钟上升沿时,q*=q+1,开始计数

5.同步清0指的是 当4位达到最大值的时候(2进制的1111,也就是10进制的15),遇到上升沿之后并且再+1的情况下,会导致溢出此时溢出位cout变成1,此时遇到时钟上升沿的时候,q清0

(如果是异步清0,在+1后会在短暂时间后直接清0,而不会先经过上升沿再触发清0)

二.分析VerilogHDL源代码

  1. module counter (q, cout, reset, cin, clk);
  2. parameter N=4//定义N用来复用这个值
  3. output [N:1] q;  //指明端口性质 位宽4到1 从1234,4比特 4bit 习惯性高位写在左边
  4. //此处q没有显式声明而是output ,系统默认表示wire类型
  5. output cout; //表示溢出 此处cout没有显式声明而是output ,系统默认表示wire类型
  6. input reset, cin, clk;
  7. reg [N:1] q ; //定义寄存器 4位宽 此处重申了q是reg类型,显式声明
  8. //为什么定义寄存器?
  9. //因为寄存器有储存功能,存储一个值,用于存储某一个时刻计算出来的值用于下一次累加
  10. //计数器在计数过程中有q是在下一次上升沿来之前保持寄存状态
  11. // 逻辑功能描述 clk时钟参与,所以时序逻辑
  12. always @(posedge clk) //每来一次上升沿 就会执行一次 begin与end之间的语句块 并行
  13. begin
  14. if (reset) q<=0;//清 0
  15. else
  16. q<= q + cin; //计数或保持
  17. end
  18. assign cout=&q && cin; // 与q表示4比特的q各自相与,再与cin
  19. //只有在q的4位全是1的时候&q才能为1 此时再与cin(若cin为0表示保持,此时就不加了,为1就会计数+1),
  20. //满足两个是1的时候cout才会为1
  21. //assign 没有时钟参与,叫做组合逻辑电路,里面没有存储,而且当前的值只与当前右边几个信号的值有关系,而时序逻辑中 q是根据与上一次q的值加上cin的输入得到的计数值
  22. //wire表示一根导线没有储存功能,只能是组合逻辑assign 而组合逻辑表示表达式左边和表达式右边是实时对应的,只要右边变化左边马上发生变化
  23. //而时序逻辑always这边是有触发条件的,上升沿触发的情况下这个逻辑才会执行,begin到end的代码块的执行
  24. //此处类比于Vue的绑定数据(瞬时变化)和react/flutter的state(需要setState()方法触发后才会改变页面的内容)
  25. endmodule
  26. //弹幕内容:
  27. //时序逻辑一定要用非阻塞<=.一旦看到敏感列表有posedge就用<=
  28. //组合逻辑一定要用=,一旦敏感列表没有posedge就用=,看到assign就用=
  29. //时序逻辑和组合逻辑分成不同的模块,即一个always模块里面只能出现非阻塞赋值<=或者=

二.分析VerilogHDL TestBench测试源代码

  1. `timescale 1ns / 1ps //1ns表示单位1ns 表示仿真频率1G,1ps指的是仿真的最大精度
  2. module count4_tb_v; //包住测试模块 testbench简写tb
  3. // Inputs
  4. reg reset, cin, clk;
  5. // Outputs
  6. wire [4:1] q;
  7. wire cout;
  8. // Instantiate the Unit Under Test (UUT)
  9. counter uut (.q(q),
  10. .cout(cout),
  11. .reset(reset),
  12. .cin(cin),
  13. .clk(clk));
  14. //此处开始初始化,上电,施加激励 不可综合部分
  15. initial begin
  16. // Initialize Inputs 初始resst,cin,clk都设置为0
  17. reset = 0;
  18. cin = 0;
  19. clk = 0;
  20. //强行指定,强加信号为了测试电路 导致不可综合 只是虚拟平台用于测试代码
  21. #100 reset=1; #100 cin=1; //#100 与第一行有关,这时候是100ns,延迟100ns后执行后面的语句
  22. #100 reset=0;
  23. #(100*20) cin=0; //延迟2000ns
  24. #100 cin=1;
  25. #(100*5) $stop; //延迟500ns后仿真停止
  26. end
  27. always #50 clk=~clk;
  28. endmodule

 最后Verilog分两部分

1.可综合部分

这部分代码用EDA工具做综合,生成具体的硬件电路,乃至于做板图然后最后加工成芯片

但是之后需要测试对不对 所以要用虚拟模块

 2.不可综合部分

在上面虚拟模块在端口里面施加下面虚拟信号

 之后看波形

 

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

闽ICP备14008679号