FRAME上的DATA结束

时间:2012-08-21 07:24:41

标签: vhdl

我正在尝试为SDI-12协议编写代码

SDI-12的字节帧格式是

  • 1开始位
  • 7个数据位,首先发送的最低有效位
  • 1个奇偶校验位,偶校验
  • 1站位

我想传输24位数据,即100001101011001010000100

当在框架中排列时看起来像

开始,1000011,P,停止,开始,0101100,P,停止,开始,1010000,P,停止,开始,100_ _ _ _,P,停止

其中P是奇偶校验位

问题是:

  • 我应该在最后四位传输哪些数据,例如_,_ _ _
  • 我怎么知道要发送的数据已经完成?

CODE:

 library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
entity serialtx is
    generic (data_width : integer);
    port (clk, reset : in  std_logic;
           tx_data   : in  std_logic_vector(data_width-1 downto 0);
           tx_out    : out std_logic
    );    
end serialtx;
architecture behavioral of serialtx is
    type ofstate is (IDLE, START_bit, STOP_bit);
    signal state, nextstate      : ofstate;
    signal parity_bit, tx_enable : std_logic;
begin
    process
        variable count, p_val : integer := 0;
    begin
        if(clk'event and clk = '1' and tx_enable = '1')then
            if(reset = '1')then
                tx_out <= '0';
            else
                case state is
                    when IDLE =>
                        tx_out    <= '0';
                        nextstate <= START_bit;
                    when START_bit =>
                        count := count+1;
                        if(count >= 0 and count < 7)then
                            for b in p_val to data_width-1 loop
                                tx_out <= tx_data(p_val);
                            end loop;
                        elsif(count = 7)then
                            tx_out <= parity_bit;
                            p_val  := p_val+1;
                        elsif(count = 8) then
                            tx_out    <= '1';
                            nextstate <= STOP_bit;
                            count     := 0;
                        end if;
                    when STOP_bit =>
          --if--data to be sent is completed then    
                        tx_out    <= '1';
                        tx_enable <= '0';
          --else    
                        nextstate <= IDLE;
          --end if;    
                end case;
            end if;
        end if;
    end process;
end behavioral;

2 个答案:

答案 0 :(得分:0)

  

我应该在最后一位传输哪些数据,即_,_ _ _

为什么不用0填充输入数据,直到7个数据位的下一个倍数?

答案 1 :(得分:0)

您的方法不正确。您了解SDI-12的字节帧格式,但您还应该了解要传输到SDI-12传感器的SDI-12命令。

所有SDI-12命令都由ASCII字符组成,使用1个起始位的字节帧格式,7个数据位,1个奇偶校验位(偶数)和1个停止位进行传输。

您似乎正在尝试将“C,P”加3个额外位传输到SDI-12传感器。根据SDI-12规范,这是无效的。将4个额外位(它们用于什么?)填充4位以获得7位是没有意义的,“C,P”不是有效的SDI-12命令(除非传感器地址为“C”且“,P”是SDI-12扩展命令,这是另一个主题。)

您需要将有效的SDI-12命令发送到SDI-12传感器。

SDI-12命令的第一个字符始终是传感器地址,它是一个可打印的ASCII字符。 SDI-12命令的最后一个字符是“!” (ASCII十进制33)。

来自传感器的响应以回车符/换行符对终止(ASCII 13十进制+ ASCII十进制十进制)。

最简单的SDI-12命令是Acknowledge Active Command。此命令用于查看特定传感器是否连接到SDI-12总线。

例如,如果传感器的地址为“0”(ASCII 32十进制),则“确认激活”命令为:

0!

如果以正确的字节帧格式传输到SDI-12传感器,则为1200波特,符合SDI-12规范的电气要求,如果传感器的地址为“0”则位于另一端,您将从传感器获得此响应:

0<CR><LF>

SDI-12规范列出了所有有效的SDI-12命令。您可以在www.sdi-12.org找到它的副本。