⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rbuf.vhd

📁 一个有关于UART开发的自己的一个VHDL代码
💻 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 + -