- UID
- 852722
|
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; |
|