信号监测器模块的功能是监测 RS-232 输入端的信号,当有新的数据传输时通知 UART 内核开始接收数据,其端口定义如表 5-5 所示。
在监测到传输的起始位后,信号监测器需要将自己锁定,即不对输入信号进行监测,直到UART 内核将其复位。信号监测器的实现代码如下:
- -- 库声明
- library IEEE;
- use IEEE.STD_LOGIC_1164.all;
- use WORK.UART_PACKAGE.ALL;
- -- 实体声明
- entity detector is
- port (
- clk : in std_logic;
- reset_n : in std_logic;
- RxD : in std_logic;
- new_data : out std_logic );
- end detector;
- --}} End of automatically maintained section
- -- 结构体
- architecture detector of detector is
- -- 信号监测器状态机
- signal state : dt_state;
- begin
- -- enter your statements here --
- -- 主过程
- main : process(reset_n, clk)
- begin
- -- 复位信号
- if reset_n = '0' then
- state <= dt_unlock;
- new_data <= '0';
- elsif rising_edge(clk) then
- -- 检查输入信号和状态,当输入为低并且不在锁定状态时,输出 new_data 信号
- if state = dt_unlock and RxD = '0' then
- new_data <= '1';
- state <= dt_lock;
- else
- new_data <= '0';
- end if;
- end if;
- end process;
- end detector;
代码中的状态机 dt_state 是在 UART_PACKAGE 包中定义的,如下:
- -- 信号监测器状态
- type dt_state is
- (
- dt_unlock, -- 未锁定状态
- dt_lock -- 锁定状态
- );
为了验证信号监测器模块的实现,需要编写一个测试平台测试其功能。测试平台的代码请参考 UART 工程源代码中的 detector_tb.vhd 文件,测试的结果如图 5-8 所示。
图 5-8 信号监测器
仿真时序图
其中,RxD 第一次变为低时,new_data 信号产生输出;之后,RxD 又变为低,但由于信号监测器处于锁定状态,所以 new_data 并没有输出;最后,由于 reset_n 信号将信号监测器复位了,RxD 再次变为低时,new_data 上又有输出了。可见,信号监测器的实现完全正确,其功能完全符合设计的要求。