私は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
これらのスニペットをMCVEに変換します。あなたのサンプル値を定数として使用し、ポートを必要とせず、空のエンティティと宣言とアーキテクチャの単純なプロセスを使用することもできます。 MCVEとは何ですか? http:// stackoverflow。com/help/mcve –
@BrianDrummond完了 – Xinq
このコードでは、基本的なバインドチェックの失敗があります...どのようにシミュレーションしましたか?どのシミュレータで?ザイリンクスISIMでは、実行時チェックをオンにする必要がありますが、デフォルトではオフになっています。これはシミュレータでは賢明な選択です。 –