0

SDI-12プロトコルのコードを書こうとしています

SDI-12のバイトフレームフォーマットは

  • 1スタートビット
  • 7データビット、最下位ビットが最初に送信されます
  • 1パリティビット、偶数パリティ
  • 1ストップビット

24ビットのデータを送信したい、つまり100001101011001010000100

フレームに配置すると次のようになります

start、1000011、P、stop、start、0101100、P、stop、start、1010000、P、stop、start、100_ _ _ _、P、stop

ここで、Pはパリティビットです。

問題は:

  • 最後の4ビットでどのデータを送信する必要がありますか。つまり、_ _ _ _
  • 送信するデータが完了したことをどのように知る必要がありますか?

コード:

 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;
4

2 に答える 2

0

最後のビットでどのデータを送信する必要があるか、つまり_ _ _ _

次の 7 データ ビットの倍数まで、入力データを 0 で埋めてみませんか?

于 2012-08-21T11:03:46.287 に答える
0

あなたのアプローチは正しくありません。SDI-12 のバイト フレーム形式は理解していますが、SDI-12 センサーに送信する SDI-12 コマンドについても理解する必要があります。

すべての SDI-12 コマンドは ASCII 文字で構成され、1 スタート ビット、7 データ ビット、1 パリティ ビット (偶数)、および 1 ストップ ビットのバイト フレーム フォーマットを使用して送信されます。

「C、P」と追加の 3 ビットを SDI-12 センサーに送信しようとしているようです。SDI-12 仕様では、これは無効です。余分な 3 ビット (何のために?) を 4 ビットでパディングして 7 ビットにするのは意味がなく、「C,P」は有効な SDI-12 コマンドではありません (センサー アドレスが「C」であり、 ",P" は SDI-12 拡張コマンドです。これは別のトピックです)。

有効な SDI-12 コマンドを SDI-12 センサーに送信する必要があります。

SDI-12 コマンドの最初の文字は常にセンサー アドレスであり、これは単一の印刷可能な ASCII 文字です。SDI-12 コマンドの最後の文字は「!」です。(ASCII 33 10 進数)。

センサーからの応答は、キャリッジ リターン/ライン フィードのペア (10 進数の ASCII 13 + 10 進数の ASCII 10) で終了します。

最も単純な SDI-12 コマンドは、Acknowledge Active コマンドです。このコマンドは、特定のセンサーが SDI-12 バスに接続されているかどうかを確認するために使用されます。

たとえば、センサーのアドレスが「0」(AS​​CII 32 10 進数) の場合、Acknowledge Active コマンドは次のようになります。

0!

これが SDI-12 仕様の電気的要件に準拠した 1200 ボーの適切なバイト フレーム フォーマットで SDI-12 センサーに転送され、アドレスが「0」のセンサーが相手側にある場合、センサーから次の応答を取得します。

0<CR><LF>

SDI-12 仕様には、有効な SDI-12 コマンドがすべてリストされています。www.sdi-12.orgでコピーを入手できます 。

于 2014-02-11T17:07:38.170 に答える