发 帖  
原厂入驻New

【FPGA】UART的计数器模块的实现方式

2018-10-23 10:02:16  1078 FPGA 计数器
分享
计数器模块的功能是可控地在输入时钟驱动下进行计数,当到达计数上阈时给 UART 内核一个提示信号。在不同的工作状态下,计数器模块的输入时钟是不同的。UART 在数据发送之前需要进行数据加载(即将串行序列保存到移位寄存器内),在此过程中计数器模块的输入时钟就是系统时钟,因为此时移位寄存器也是工作在系统时钟下的。除了数据加载,另外两个需要计数器模块的过程是数据接收和数据发送,由于这两个过程中移位寄存器是工作在波特率时钟下的,所以计数器模块的时钟就是和波特率时钟同步的波特率发生器提示信号 indicator,这样每输出一个完整的波特率时钟周期计数器就能增加一。

计数器计数的上阈是在实体声明中定义的,代码如下。代码中的 MAX_COUNT 类属参数就是计数上阈。





  1. entity counter is
  2.         generic (
  3.         MAX_COUNT : integer := 10 );
  4.         port (
  5.         clk : in std_logic;
  6.         reset_n : in std_logic;
  7.         ce : in std_logic;
  8.         oveRFlow : out std_logic );
  9. end counter;

复制代码



计数器模块的端口定义如表 5-10 所示。

4.png

计数器模块的实现代码如下:





  1. -- 库声明
  2. library IEEE;
  3. use IEEE.STD_LOGIC_1164.all;
  4. -- 实体声明
  5. entity counter is
  6. generic (
  7. MAX_COUNT : integer := 10 );
  8. port (
  9. clk : in std_logic;
  10. reset_n : in std_logic;
  11. ce : in std_logic;
  12. overflow : out std_logic );
  13. end counter;
  14. --}} End of automatically maintained section
  15. -- 结构体
  16. architecture counter of counter is
  17. signal count : integer;
  18. begin
  19. -- enter your statements here --
  20. -- 主过程
  21. main: process( clk, reset_n )
  22. begin
  23. -- 判断复位信号
  24. IF reset_n = '0' then
  25. count <= 0;
  26. overflow <= '0';
  27. -- 时钟信号的上升沿动作
  28. elsif rising_edge(clk) and ce = '1' then
  29. -- 在计数上阈时候输出提示信号 overflow
  30. if count = MAX_COUNT-1 then
  31. count <= 0;
  32. overflow <= '1';
  33. -- 恢复提示信号 overflow 为低
  34. elsif count = 0 then
  35. count <= count+1;
  36. overflow <= '0';
  37. else
  38. count <= count+1;
  39. end if;
  40. end if;
  41. end process;
  42. end counter;


复制代码


对上述代码进行仿真测试,得到的仿真波形如图 5-17 所示。计数器在复位后并且 ce 有效时开始计数,并且在第 10 个时钟周期输出提示信号 overflow。
5.png
0
2018-10-23 10:02:16   评论 分享淘帖

相关讨论

只有小组成员才能发言,加入小组>>

285个成员聚集在这个小组

加入小组

热门话题

创建小组步骤

快速回复 返回顶部 返回列表