2016-10-25 12 views
1

私はMS5541Cの圧力/温度センサー用のドライバを作成しようとしていますが、私のようには見えません。 データシートにいくつかの計算がありました。それらをExcelに入れればかなりうまくいくようです。 しかし、私はそれのVHDLコードを書いて、7segment表示でそれを表示しようとすると動作しません。提供タイプ変換VHDL

計算は次のとおり

C5はPROM

から読み出されたキャリブレーションデータである
UT1 = 8 * C5 + 10000 

dT = D2 - UT1 
D2はDAC

TEMP = 200 + dT*(C6+100)/2^11 

から読み出さ温度で

場合TEMPが希望実際の温度は0.1℃であり、C6もまた較正温度である。

私の場合、C5 = 2223(dec)、D2 = 28144(dec)、C6 = 53です。 これらの数値を使って、私は22.7度の温度を得ます。

IはVHDLで使用コード(MCVE)である:

LIBRARY IEEE; 
USE IEEE.STD_LOGIC_1164.ALL; 

use ieee.numeric_std.all; 

ENTITY MS5541C_CONVERTER IS 

PORT(
     CLK  : IN STD_LOGIC; 
    RST  : IN STD_LOGIC; 

    T_OUT : OUT STD_LOGIC_VECTOR(15 DOWNTO 0) 
); 
END ENTITY; 

ARCHITECTURE MS5541C_CONVERTER OF MS5541C_CONVERTER IS 

Constant C5  : STD_LOGIC_VECTOR(11 DOWNTO 0) := "100010101111"; -- Reference temperature 
Constant C6  : STD_LOGIC_VECTOR(6 DOWNTO 0) := "0110101"; -- Temp coefficient of the temperature 

Constant D2  : STD_LOGIC_VECTOR(15 DOWNTO 0) := x"6df0"; -- temperature 

BEGIN 

PROCESS (CLK,RST) 
    VARIABLE UT1 : SIGNED(33 DOWNTO 0); 
    VARIABLE dT  : SIGNED(33 DOWNTO 0); 
    VARIABLE TEMPE : SIGNED(33 DOWNTO 0); 
    VARIABLE C5_s : SIGNED(33 DOWNTO 0); 
    VARIABLE C6_s : SIGNED(33 DOWNTO 0); 
BEGIN 
    C5_s := RESIZE(signed(C5),33); 
    C6_s := RESIZE(signed(C6),33); 
    IF RST = '1' THEN 

    ELSIF rising_edge(CLK) THEN 
     UT1 := 8 * C5_s + 10000; 
     dT := RESIZE(signed(D2),33) - UT1; 
     TEMPE := 200 + dT*(C6_s + 100)/ 2048; 
     T_OUT <= STD_LOGIC_VECTOR(RESIZE(TEMPE,16)); 
    END If; 
END PROCESS; 
END ARCHITECTURE; 

この結果は、2674(DEC)またはA72(16進数)これらがあるので(実際の数値は、Excelから少し異なる場合があります2つの測定値ですが、これは近くではありません)

私は計算を数回読み返しましたが、異なるアプローチを試しましたが、結果は決して正確ではありません。私はそれが型の変換に関連していると仮定しますが、私は何がわかりません。

p.s.データシートを読みたい人のための :

http://media.digikey.com/pdf/Data%20Sheets/Measurement%20Specialties%20PDFs/MS5541-CM.pdf

+0

これらのスニペットをMCVEに変換します。あなたのサンプル値を定数として使用し、ポートを必要とせず、空のエンティティと宣言とアーキテクチャの単純なプロセスを使用することもできます。 MCVEとは何ですか? http:// stackoverflow。com/help/mcve –

+0

@BrianDrummond完了 – Xinq

+0

このコードでは、基本的なバインドチェックの失敗があります...どのようにシミュレーションしましたか?どのシミュレータで?ザイリンクスISIMでは、実行時チェックをオンにする必要がありますが、デフォルトではオフになっています。これはシミュレータでは賢明な選択です。 –

答えて

0

少なくとも一つの問題は、あなたが、この負のを拡張2223、あなたはC5のために署名した変換を行うときに、あなたが-4984で残っているということではありません33ビット幅の数。

これが唯一の問題だった場合、最終結果は4534のようなものになる可能性があります。別の問題がありますが、符号付きに変換する他の定数には先頭に'1'がありません。

C5、C6、D2は実際に符号付き数字ですか?彼らは実際にはプロムから読んで12/7/16ビット幅ですか?

私は実際のシステムでこれを使用しようと思っていますが、あなたの時計が非常に遅いか、これが合成用ではないことを願っています。この種の数学は、信号の代わりに変数を使用すると、1クロックサイクルですべてを実行するための非常に長いパスを持ちます。 33ビットオペランド(ワイド側)はこの問題を悪化させます。あなたが最大値に保持し、適当な長さを使用する各計算とオペランドを見つけ出す場合

オペランド長といえば、あなたの数学は、より効率的になります。オプティマイザはこれを修正する可能性がありますが、必ずしも完全ではありません。

+0

ありがとう、それは確かに署名部分でした!今結果は226です! 私は現在50MHzクロックを使用しています。あなたは、変数の代わりに信号を使うべきだと提案しますか? Cxのタイプは32ビットにキャストしました。私は仕事をして、後ですべてがうまくいくと幅について心配していたからです。 – Xinq

+0

だから私はそれを修正したと思いますか?あなたの数字は10度に戻っ​​ているようですので、226(22.6)は22.7の予想温度とかなりよく一致します。 また、(TEMP = 200 + dT *(C6 + 100)2^11 + 1000')あなたが挙げた温度計算はVHDLで行っているものと一致しません。私は、 "2^11"の前に分割スラッシュがないと推測していますが、 "+ 1000"がどこに来るのか分かりません。 あなたは50MHzでも問題ありませんが、少なくとも、ツールの提案fmaxが50MHzを超えていることを確認してください(ツールは、制約を与えないとツールを推測しようとします)。 – QuantumRipple

+0

私は通常、明示的なDSPを使ってこのような数学を約10クロックサイクルにパイプライン化しますが、私は500MHzで動かすことができます。パイプライニングをしないのが大丈夫かもしれません。 – QuantumRipple

関連する問題