首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

VHDL串口通信程序设计(下)

VHDL串口通信程序设计(下)

PROCESS(Clkbaud8x,Rst)

   BEGIN

      IF (NOT Rst = ’1’) THEN

         Div8_tras_reg <= "000";   

      ELSE IF(Clkbaud8x’EVENT AND Clkbaud8x = ’1’) THEN

         IF (Trasstart = ’1’) THEN

            Div8_tras_reg <= Div8_tras_reg + "001";发送开始后,时隙数在8倍波特率的时钟下加1循环   

         END IF;

    END IF;

      END IF;

   END PROCESS;



   PROCESS(Div8_rec_reg)

   BEGIN

      IF (Div8_rec_reg = "111") THEN

         Clkbaud_rec <= ’1’; -在第7个时隙,接收  

      ELSE

         Clkbaud_rec <= ’0’;   

      END IF;

   END PROCESS;



   PROCESS(Div8_tras_reg)

   BEGIN

      IF (Div8_tras_reg = "111") THEN

         Clkbaud_tras <= ’1’;  在第7个时隙,发送使能信号有效,将数据发出  

      ELSE

         Clkbaud_tras <= ’0’;   

      END IF;

   END PROCESS;



   PROCESS(Clkbaud8x,Rst)

   BEGIN

      IF (NOT Rst = ’1’) THEN

         Txd_reg <= ’1’;   

         Trasstart <= ’0’;   

         Txd_buf <= "00000000";   

         State_tras <= "0000";   

         Send_state <= "000";   

         Key_entry2 <= ’0’;   

      ELSE IF(Clkbaud8x’EVENT AND Clkbaud8x = ’1’) THEN

         IF (NOT Key_entry2 = ’1’) THEN

            IF (Key_entry1 = ’1’) THEN

               Key_entry2 <= ’1’;   

               Txd_buf <= "01110111";   "W"

            END IF;

         ELSE

            CASE State_tras IS

               WHEN "0000" =>  发送起始位

                        IF ((NOT Trasstart=’1’) AND (Send_state < "111") ) THEN

                           Trasstart <= ’1’;   

                        ELSE

                           IF (Send_state < "111") THEN

                              IF (Clkbaud_tras = ’1’) THEN

                                 Txd_reg <= ’0’;   

                                 State_tras <= State_tras + "0001";   

                              END IF;

                           ELSE

                              Key_entry2 <= ’0’;   

                              State_tras <= "0000";   

                           END IF;

                        END IF;

               WHEN "0001" => 发送第1位

                        IF (Clkbaud_tras = ’1’) THEN

                           Txd_reg <= Txd_buf(0);   

                           Txd_buf(6 DOWNTO 0) <= Txd_buf(7 DOWNTO 1);   

                           State_tras <= State_tras + "0001";   

                        END IF;

               WHEN "0010" =>  发送第2位

                        IF (Clkbaud_tras = ’1’) THEN

                           Txd_reg <= Txd_buf(0);   

                           Txd_buf(6 DOWNTO 0) <= Txd_buf(7 DOWNTO 1);   

                           State_tras <= State_tras + "0001";   

                        END IF;

               WHEN "0011" =>  发送第3位

                        IF (Clkbaud_tras = ’1’) THEN

                           Txd_reg <= Txd_buf(0);   

                           Txd_buf(6 DOWNTO 0) <= Txd_buf(7 DOWNTO 1);   

                           State_tras <= State_tras + "0001";   

                        END IF;

               WHEN "0100" => 发送第4位

                        IF (Clkbaud_tras = ’1’) THEN

                           Txd_reg <= Txd_buf(0);   

                           Txd_buf(6 DOWNTO 0) <= Txd_buf(7 DOWNTO 1);   

                           State_tras <= State_tras + "0001";   

                        END IF;

               WHEN "0101" => 发送第5位

                        IF (Clkbaud_tras = ’1’) THEN

                           Txd_reg <= Txd_buf(0);   

                           Txd_buf(6 DOWNTO 0) <= Txd_buf(7 DOWNTO 1);   

                           State_tras <= State_tras + "0001";   

                        END IF;

               WHEN "0110" => 发送第6位

                        IF (Clkbaud_tras = ’1’) THEN

                           Txd_reg <= Txd_buf(0);   

                           Txd_buf(6 DOWNTO 0) <= Txd_buf(7 DOWNTO 1);   

                           State_tras <= State_tras + "0001";   

                        END IF;

               WHEN "0111" => 发送第7位

                        IF (Clkbaud_tras = ’1’) THEN

                           Txd_reg <= Txd_buf(0);   

                           Txd_buf(6 DOWNTO 0) <= Txd_buf(7 DOWNTO 1);   

                           State_tras <= State_tras + "0001";   

                        END IF;

               WHEN "1000" =>  发送第8位

                        IF (Clkbaud_tras = ’1’) THEN

                           Txd_reg <= Txd_buf(0);   

                           Txd_buf(6 DOWNTO 0) <= Txd_buf(7 DOWNTO 1);   

                           State_tras <= State_tras + "0001";   

                        END IF;

               WHEN "1001" =>  发送停止位

                        IF (Clkbaud_tras = ’1’) THEN

                           Txd_reg <= ’1’;   

                           Txd_buf <= "01010101";   

                           State_tras <= State_tras + "0001";   

                        END IF;

               WHEN "1111" =>

                        IF (Clkbaud_tras = ’1’) THEN

                           State_tras <= State_tras + "0001";   

                           Send_state <= Send_state + "001";   

                           Trasstart <= ’0’;   

                           CASE Send_state IS

                              WHEN "000" =>

                                       Txd_buf <= "01100101"; "E"   

                              WHEN "001" =>

                                       Txd_buf <= "01101100"; "L"   

                              WHEN "010" =>

                                       Txd_buf <= "01100011";  "C"  

                              WHEN "011" =>

                                       Txd_buf <= "01101111"; "O"  

                              WHEN "100" =>

                                       Txd_buf <= "01101101";  "M"  

                              WHEN "101" =>

                                       Txd_buf <= "01100101"; "E"   

                              WHEN OTHERS  =>

                                       Txd_buf <= "00000000";  




                           END CASE;

                        END IF;

               WHEN OTHERS  =>

                        IF (Clkbaud_tras = ’1’) THEN

                           State_tras <= State_tras + "0001";   

                           Trasstart <= ’1’;   

                        END IF;




            END CASE;

         END IF;

      END IF;

END IF;

   END PROCESS;

[Apge]



   PROCESS(Clkbaud8x,Rst)  接受PC机的数据

   BEGIN

      IF (NOT Rst = ’1’) THEN

         Rxd_reg1 <= ’0’;   

         Rxd_reg2 <= ’0’;   

         Rxd_buf <= "00000000";   

         State_rec <= "0000";   

         Recstart <= ’0’;   

         Recstart_tmp <= ’0’;   

      ELSE IF(Clkbaud8x’EVENT AND Clkbaud8x = ’1’) THEN

         Rxd_reg1 <= Rxd;   

         Rxd_reg2 <= Rxd_reg1;   

         IF (State_rec = "0000") THEN

            IF (Recstart_tmp = ’1’) THEN

               Recstart <= ’1’;   

               Recstart_tmp <= ’0’;   

               State_rec <= State_rec + "0001";   

            ELSE

               IF ((NOT Rxd_reg1 AND Rxd_reg2) = ’1’) THEN 检测到起始位的下降沿,进入接受状态

                  Recstart_tmp <= ’1’;   

               END IF;

            END IF;

         ELSE

            IF (State_rec >= "0001" AND State_rec<="1000") THEN

               IF (Clkbaud_rec = ’1’) THEN

                  Rxd_buf(7) <= Rxd_reg2;   

                  Rxd_buf(6 DOWNTO 0) <= Rxd_buf(7 DOWNTO 1);   

                  State_rec <= State_rec + "0001";   

               END IF;

            ELSE

               IF (State_rec = "1001") THEN

                  IF (Clkbaud_rec = ’1’) THEN

                     State_rec <= "0000";   

                     Recstart <= ’0’;   

                  END IF;

               END IF;

            END IF;

         END IF;

      END IF;

END IF;

   END PROCESS;



   PROCESS(Rxd_buf)   将接受的数据用数码管显示出来

   BEGIN

      CASE Rxd_buf IS

         WHEN "00110000" =>

                  Seg_data <= "00000011"; 0   

         WHEN "00110001" =>

                  Seg_data <= "10011111"; 1  

         WHEN "00110010" =>

                  Seg_data <= "00100101"; 2  

         WHEN "00110011" =>

                  Seg_data <= "00001101"; 3      

         WHEN "00110100" =>

                  Seg_data <= "10011001"; 4   

&Nbs P;        WHEN "00110101" =>

                  Seg_data <= "01001001"; 5  

         WHEN "00110110" =>

                  Seg_data <= "01000001"; 6   

         WHEN "00110111" =>

                  Seg_data <= "00011111"; 7   

         WHEN "00111000" =>

                  Seg_data <= "00000001"; 8   

         WHEN "00111001" =>

                  Seg_data <= "00001001"; 9   

         WHEN "01000001" =>

                  Seg_data <= "00010001"; A   

         WHEN "01000010" =>

                  Seg_data <= "11000001"; B   

         WHEN "01000011" =>

                  Seg_data <= "01100011"; C   

         WHEN "01000100" =>

                  Seg_data <= "10000101"; D  

         WHEN "01000101" =>

                  Seg_data <= "01100001"; E   

         WHEN "01000110" =>

                  Seg_data <= "01110001"; F   

         WHEN OTHERS  =>

                  Seg_data <= "11111111";         

      END CASE;

   END PROCESS;

END Arch;
返回列表