📄 rbuf.vhd
字号:
--下面是接收模块--- 这个串口接收模块 0为开始位1为停止位----和单片机的串口一样以16位波特率进行取样在取样的7上(并不是单片机的多数判决)做为判决电平----如果没有收到停止位那么就这一桢便不会再有可能回来了 也就是说丢了--clk 为时钟 out_en 为收到信号后的输出许可--这里还利用了一个条件当我们定义整型数据时如果加上range可以让它自动溢出也就是清空,,当然有一定的技巧这个--就少了不少的IF 呵呵好办法!!---同时这个接收器并没查最后是否收到了停止位,,而只是空待了个位的时间后输出library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity RBUF is port( clk,rx:in std_logic; out_en :out std_logic; buff:out std_logic_vector(7 downto 0); E_7SEG : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); E_7SEG_ALL : OUT STD_LOGIC ); end RBUF; architecture behav of RBUF istype states is (waite_for_start_bit,receive_start_bit,receive_data,receive_stop_bit);--定义各子状态--状态分别为:等待开始位--接收开始位--接收数据--接收停止位signal state:states:=waite_for_start_bit; begin process(clk) variable bit_count :integer range 0 to 8 ;--接收数据计数器 variable counter_16 :integer range 0 to 15;--16分频计数器 begin if clk'event and clk='1' then case state is when waite_for_start_bit=> --如果是在等待态就看是不是起始位 E_7SEG_ALL<='1'; E_7SEG<="0001"; if rx='0' then state<=receive_start_bit; counter_16:=0;--进入接收起始位的态并置位各计数器的初值 out_en<='0';--输出使不能 end if; when receive_start_bit=> --在接收起始位状态下是空待计数器到16就进入下一态 if counter_16>=15 then state<=receive_data; counter_16:=0; bit_count:=0;--复位位计数器和分频计数器 else counter_16:=counter_16+1; end if; when receive_data => --这时是处于数据接收态下 if counter_16 = 8 then buff(bit_count)<=rx; bit_count:=bit_count+1; counter_16:=counter_16+1; else if (counter_16 >= 15 and bit_count = 8) then --这个地方的到8并不是到8有9位了实际还是8位 state<=receive_stop_bit; counter_16:=counter_16+1; else counter_16:=counter_16+1;--这里没有清空的语句是因为会自动溢出复位 end if; end if; when receive_stop_bit => --这里是接收停止位 if counter_16 >= 15 then state<=waite_for_start_bit; counter_16:=0;out_en<='1';--输出使能 else counter_16:=counter_16+1; end if; when others => state<=waite_for_start_bit; out_en<='0';--输出使不能; end case ; end if; end process; end behav;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -