基于vhdl的rs232串口通信控制器word格式内容摘要:

d_logic。 串行数据接收端 txd : OUT std_logic。 串行数据 发送端 en : OUT std_logic_vector(5 downto 0)。 数码管使能 seg_data : OUT std_logic_vector(7 DOWNTO 0)。 数码管数据 key_input : IN std_logic 按键输入 )。 END UART。 ARCHITECTURE arch OF UART IS //////////////////inner reg//////////////////// SIGNAL div_reg : std_logic_vector(15 DOWNTO 0)。 分频计数器,分频值由波特率决定。 分频后得到频率 8 倍波特率的时钟 SIGNAL div8_tras_reg : std_logic_vector(2 DOWNTO 0)。 该寄存器的计数值对应发送时当前位于的时隙数 SIGNAL div8_rec_reg : std_logic_vector(2 DOWNTO 0)。 寄存器的计数值对应接收时当前位于的时隙数 SIGNAL state_tras : std_logic_vector(3 DOWNTO 0)。 发送状态寄存器 SIGNAL state_rec : std_logic_vector(3 DOWNTO 0)。 接受状态寄存器 SIGNAL clkbaud_tras : std_logic。 以波特率为频率的发送使能信号 SIGNAL clkbaud_rec : std_logic。 以波特率为频率的接受使能信号 SIGNAL clkbaud8x : std_logic。 以 8 倍波特率为频率的时钟,它的作用是将发送或接受一个 bit 的时钟周期分为 8个时隙 SIGNAL recstart : std_logic。 开始发送标志 SIGNAL recstart_tmp : std_logic。 开始接受标志 SIGNAL trasstart : std_logic。 SIGNAL rxd_reg1 : std_logic。 接收寄存器 1 SIGNAL rxd_reg2 : std_logic。 接收寄存器 2,因为接收数据为异步信号,故用两级缓存 SIGNAL txd_reg : std_logic。 发送寄存器 SIGNAL rxd_buf : std_logic_vector(7 DOWNTO 0)。 接受数据缓存 SIGNAL txd_buf : std_logic_vector(7 DOWNTO 0)。 发送数据缓存 SIGNAL send_state : std_logic_vector(2 DOWNTO 0)。 每次按键给 PC 发送 Wele字符串,这是发送状态寄存器 SIGNAL t_delay : std_logic_vector(19 DOWNTO 0)。 延时去抖计数器 SIGNAL start_delayt : std_logic。 开始延时计数标志 SIGNAL key_entry1 : std_logic。 确定有键按下曛 ? SIGNAL key_entry2 : std_logic。 确定有键按下标志 ////////////////////////////////////////////// CONSTANT div_par : std_logic_vector(15 DOWNTO 0) := 0000000101000101。 分频参 数,其值由对应的波特率计算而得,按此参数分频的时钟频率是波倍特率的 8 倍,此处值对应 9600 的波特率,即分频出的时钟频率是 9600*8 SIGNAL txd_xhdl3 : std_logic。 BEGIN en =111110。 7 段数码管使能信号赋值 txd_xhdl3 = txd_reg。 txd = txd_xhdl3。 PROCESS(clk,rst) BEGIN IF ( rst = 39。 139。 ) THEN 如果重新开始 t_delay = 00000000000000000000。 start_delayt = 39。 039。 ELSIF(clk39。 EVENT AND clk=39。 139。 )THEN 否则在时钟上升沿 IF (start_delayt = 39。 139。 ) THEN 每 800000 次,检测一次是否有按键按下 IF (t_delay /= 00001100001101010000) THEN t_delay = t_delay + 00000000000000000001。 每次时钟到来加 1 ELSE t_delay = 00000000000000000000。 start_delayt = 39。 039。 END IF。 ELSE IF (( key_input=39。 139。 ) AND (t_delay = 00000000000000000000)) THEN start_delayt = 39。 139。 END IF。 END IF。 END IF。 END PROCESS。 PROCESS(clk,rst) BEGIN IF ( rst = 39。 139。 ) THEN key_entry1 = 39。 039。 ELSIF(clk39。 EVENT AND clk=39。 139。 )THEN IF (key_entry2 = 39。 139。 ) THEN 如果 key2=1 key_entry1 = 39。 039。 有键输入。 ELSE 如果 key2=0, IF (t_delay = 00001100001101010000) THEN 检测键输入 IF (NOT key_input = 39。 139。 ) THEN 如果没有键输入 key_entry1 = 39。 139。 END IF。 END IF。 END IF。 END IF。 END PROCESS。 PROCESS(clk,rst) BEGIN IF ( rst = 39。 139。 ) THEN div_reg = 0000000000000000。 ELSIF(clk39。 EVENT AND clk=39。 139。 )THEN div_reg 是某个延时 IF (div_reg = div_par 0000000000000001) THEN div_reg = 0000000000000000。 ELSE div_reg = div_reg + 0000000000000001。 END IF。 END IF。 END PROCESS。 PROCESS(clk,rst) 分频得到 8倍波特率的时钟 BEGIN IF ( rst = 39。 139。 ) THEN clkbaud8x = 39。 039。 ELSIF(clk39。 EVENT AND clk=39。 139。 )THEN IF (div_reg = div_par 0000000000000001) THEN clkbaud8x = NOT clkbaud8x。 产生时钟脉冲 END IF。 END IF。 END PROCESS。 PROCESS(clkbaud8x,rst) BEGIN IF ( rst = 39。 139。 ) THEN div8_rec_reg = 000。 ELSE IF(clkbaud8x39。 EVENT。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。