アトム-サイト
[ アトム-サイト ] - 管理人さんのページです。
feed-icon RSS2.0   feed-icon Atom
[ DIY ] 一覧へ
二足歩行
管理人さんのブログ 2007-03-26 17:45:47

何年か前、趣味で2足歩行への興味がわき、電子工作を少々…。
パーツ探しに秋葉原へよく行ったもんだ。

操作しているのが、サーボモーター4つバージョン。

デジタルICと抵抗・コンデンサやらを組み合わせただけの初号機。
弐号機を倒しているところ

左がCPLDで、右がFPGA。
VHDLを書いてオリジナルチップを作り、PCでのサーボモーター制御とかして楽しんでいた。
DIY 二足歩行 (.jpg)

…で、プログラムがこれ。
初期の屈伸くらいまではCPLDでやってました。
CPLD版(12個のサーボモータを屈伸する様にしてたはず)
添付ファイル
CPLDでは収まらなくなったので、途中からFPGAに切り替え。
FPGA版(PCのRS232Cから信号送っての各サーボモーター制御)
添付ファイル
勝手に使っていいです(使用後、ここに色々コメントしてくれるという条件にします)。

弐号機の機体がこれ↓
DIY 二足歩行 (.jpg)
サーボモーター12個バージョン。

DIY 二足歩行 (.jpg)

当時作ったVHDLを貼り付けておこう。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_SIGNED.ALL;

-- Uncomment the following lines to use the declarations that are
-- provided for instantiating Xilinx primitive components.
--library UNISIM;
--use UNISIM.VComponents.all;


entity Robot is


port (
CLK : in std_logic;
RESET : in std_logic;
LEDRedOut : out std_logic;
LEDGreenOut : out std_logic;
RS232CIn : in std_logic;
RS232COut : out std_logic;
--12個のサーボ出力
PWM : out std_logic_vector(11 downto 0) );
--memo:(outの物はセンシビリティリストに追加できない為、signalで別途用意する必要あり)

end Robot;


architecture Behavioral of Robot is


signal TotalCounter : std_logic_vector(24 downto 0) := (others => '0'); --1秒の周期には3byteくらい必要

signal PWMServo00 : std_logic_vector(17 downto 0); -- := "000101011001100110"; --1.5msになったらPWMを0Vにする1.5ms*14.7456MHz = 22118(5666h)
signal PWMServo01 : std_logic_vector(17 downto 0); -- := "000101011001100110"; --1.5msになったらPWMを0Vにする1.5ms*14.7456MHz = 22118(5666h)
signal PWMServo02 : std_logic_vector(17 downto 0); -- := "000101011001100110"; --1.5msになったらPWMを0Vにする1.5ms*14.7456MHz = 22118(5666h)
signal PWMServo03 : std_logic_vector(17 downto 0); -- := "000101011001100110"; --1.5msになったらPWMを0Vにする1.5ms*14.7456MHz = 22118(5666h)
signal PWMServo04 : std_logic_vector(17 downto 0); -- := "000101011001100110"; --1.5msになったらPWMを0Vにする1.5ms*14.7456MHz = 22118(5666h)
signal PWMServo05 : std_logic_vector(17 downto 0); -- := "000101011001100110"; --1.5msになったらPWMを0Vにする1.5ms*14.7456MHz = 22118(5666h)
signal PWMServo06 : std_logic_vector(17 downto 0); -- := "000101011001100110"; --1.5msになったらPWMを0Vにする1.5ms*14.7456MHz = 22118(5666h)
signal PWMServo07 : std_logic_vector(17 downto 0); -- := "000101011001100110"; --1.5msになったらPWMを0Vにする1.5ms*14.7456MHz = 22118(5666h)
signal PWMServo08 : std_logic_vector(17 downto 0); -- := "000101011001100110"; --1.5msになったらPWMを0Vにする1.5ms*14.7456MHz = 22118(5666h)
signal PWMServo09 : std_logic_vector(17 downto 0); -- := "000101011001100110"; --1.5msになったらPWMを0Vにする1.5ms*14.7456MHz = 22118(5666h)
signal PWMServo10 : std_logic_vector(17 downto 0); -- := "000101011001100110"; --1.5msになったらPWMを0Vにする1.5ms*14.7456MHz = 22118(5666h)
signal PWMServo11 : std_logic_vector(17 downto 0); -- := "000101011001100110"; --1.5msになったらPWMを0Vにする1.5ms*14.7456MHz = 22118(5666h)
signal PWMTotalCounterCopy : std_logic_vector(17 downto 0); --符号付き比較の為のコピー(最上位0セット用)
signal PWMServoCalcCopy00 : std_logic_vector(17 downto 0); --計算桁合わせ用
signal PWMServoCalcCopy01 : std_logic_vector(17 downto 0); --計算桁合わせ用
signal PWMServoCalcCopy02 : std_logic_vector(17 downto 0); --計算桁合わせ用
signal PWMServoCalcCopy03 : std_logic_vector(17 downto 0); --計算桁合わせ用
signal PWMServoCalcCopy04 : std_logic_vector(17 downto 0); --計算桁合わせ用
signal PWMServoCalcCopy05 : std_logic_vector(17 downto 0); --計算桁合わせ用
signal PWMServoCalcCopy06 : std_logic_vector(17 downto 0); --計算桁合わせ用
signal PWMServoCalcCopy07 : std_logic_vector(17 downto 0); --計算桁合わせ用
signal PWMServoCalcCopy08 : std_logic_vector(17 downto 0); --計算桁合わせ用
signal PWMServoCalcCopy09 : std_logic_vector(17 downto 0); --計算桁合わせ用
signal PWMServoCalcCopy10 : std_logic_vector(17 downto 0); --計算桁合わせ用
signal PWMServoCalcCopy11 : std_logic_vector(17 downto 0); --計算桁合わせ用

signal LEDCounterCopy0 : std_logic_vector(12 downto 0); --符号付き比較の為のコピー(最上位0セット用)
signal LEDCounterCopy1 : std_logic_vector(12 downto 0); --符号付き比較の為のコピー(最上位0セット用)

signal RS232CReadStartFlag : std_logic := '0';
signal RS232CWriteStartFlag : std_logic := '0';
signal RS232CReadTimingCounter : std_logic_vector(11 downto 0) := (others => '0'); --10bit分(1byte)の転送には11桁(符号で+1bit)くらい必要(14.7456MHz)/(115200bps/10bit)=1280(0x500<0x7ff) )
signal RS232CWriteTimingCounter : std_logic_vector(11 downto 0) := (others => '0'); --10bit分(1byte)の転送には11桁(符号で+1bit)くらい必要(14.7456MHz)/(115200bps/10bit)=1280(0x500<0x7ff) )
signal RS232CReadByteBuffer : std_logic_vector(7 downto 0) := (others => '0');
signal RS232CWriteByteBuffer : std_logic_vector(7 downto 0) := (others => '0');
signal RS232CReadStackByteBuffer00 : std_logic_vector(7 downto 0) := (others => '0'); --読み込んだ値はここにストックする
signal RS232CReadStackByteBuffer01 : std_logic_vector(7 downto 0) := (others => '0'); --読み込んだ値はここにストックする
signal RS232CReadStackByteBuffer02 : std_logic_vector(7 downto 0) := (others => '0'); --読み込んだ値はここにストックする
signal RS232CReadStackByteBuffer03 : std_logic_vector(7 downto 0) := (others => '0'); --読み込んだ値はここにストックする
signal RS232CReadStackByteBuffer04 : std_logic_vector(7 downto 0) := (others => '0'); --読み込んだ値はここにストックする
signal RS232CReadStackByteBuffer05 : std_logic_vector(7 downto 0) := (others => '0'); --読み込んだ値はここにストックする
signal RS232CReadStackByteBuffer06 : std_logic_vector(7 downto 0) := (others => '0'); --読み込んだ値はここにストックする
signal RS232CReadStackByteBuffer07 : std_logic_vector(7 downto 0) := (others => '0'); --読み込んだ値はここにストックする
signal RS232CReadStackByteBuffer08 : std_logic_vector(7 downto 0) := (others => '0'); --読み込んだ値はここにストックする
signal RS232CReadStackByteBuffer09 : std_logic_vector(7 downto 0) := (others => '0'); --読み込んだ値はここにストックする
signal RS232CReadStackByteBuffer10 : std_logic_vector(7 downto 0) := (others => '0'); --読み込んだ値はここにストックする
signal RS232CReadStackByteBuffer11 : std_logic_vector(7 downto 0) := (others => '0'); --読み込んだ値はここにストックする
signal RS232CReadStackByteBuffer12 : std_logic_vector(7 downto 0) := (others => '0'); --読み込んだ値はここにストックする
signal RS232CReadStackByteBuffer13 : std_logic_vector(7 downto 0) := (others => '0'); --読み込んだ値はここにストックする
signal RS232CReadStackByteBuffer14 : std_logic_vector(7 downto 0) := (others => '0'); --読み込んだ値はここにストックする
signal RS232CReadStackByteBuffer15 : std_logic_vector(7 downto 0) := (others => '0'); --読み込んだ値はここにストックする
signal RS232CReadStackByteBuffer16 : std_logic_vector(7 downto 0) := (others => '0'); --読み込んだ値はここにストックする
signal RS232CReadStackByteBuffer17 : std_logic_vector(7 downto 0) := (others => '0'); --読み込んだ値はここにストックする
signal RS232CReadCountNumber : std_logic_vector(7 downto 0) := (others => '0'); --何byte目を読み込んでいるのか
signal RS232CReadCountMax : std_logic_vector(7 downto 0) := (others => '0'); --何byte目まで読み込むのか

--test的
-- signal PWMAddSub : std_logic_vector(17 downto 0);

begin


--電源LEDをON(Lowで点灯)
LEDRedOut <= '0';


--プロセス開始(memo:プロセスは出力したい物毎には作らないと、各プロセスで違う出力を取りえる事がある)


--TestでTotalCounterを細工して屈伸させてやる
-- process(TotalCounter) begin --信号に変化のあった時の必要なセンシビリティリストを(else時も考慮して)キチンと記入する事

--実際には700us-2300usの値(10321.92(0x2851)-33914.99(0x847A))
--1度の値は、((2300us-700us)/180度)*14.7456MHz = 131.072(0x83)
--まず動作角度分の0x2000をTotalCounterから作ってやる

-- PWMAddSub(17 downto 13) <= "00000";
-- for i in 0 to 12 loop
-- if(TotalCounter(23) = '0') then
-- PWMAddSub(i) <= TotalCounter(i + 10);
-- else
-- PWMAddSub(i) <= not TotalCounter(i + 10);
-- end if;
-- end loop;

-- PWMServo00 <= "000101011001100110" + PWMAddSub;
-- PWMServo01 <= "000101011001100110" - PWMAddSub;
-- PWMServo02 <= "000010100001010001" + (PWMAddSub * "010"); --0度に足す("10"だとマイナスなので注意)
-- PWMServo03 <= "000101011001100110" + PWMAddSub;
-- PWMServo04 <= "000101011001100110" - PWMAddSub;
-- PWMServo05 <= "001000010001111010" - (PWMAddSub * "010"); --180度から引く("10"だとマイナスなので注意)

-- end process;


-- --TestでTotalCounterを細工して角度指定を入れてやる(全部同時に動作させる)
-- process(TotalCounter) begin --信号に変化のあった時の必要なセンシビリティリストを(else時も考慮して)キチンと記入する事
-- --実際には700us-2300usの値(10321.92(0x2851)-33914.99(0x847A))
-- --1度の値は、((2300us-700us)/180度)*14.7456MHz = 131.072(0x83)
-- --とりあえず、1.0ms-2.0msの値を入れる(14745.6(0x3999)-29491.2(0x7333))
-- --適当なので、0x4000-0x8000までを入れる事にする
-- PWMServo00(17 downto 14) <= "0001";
-- PWMServo01(17 downto 14) <= "0001";
-- PWMServo02(17 downto 14) <= "0001";
-- PWMServo03(17 downto 14) <= "0001";
-- PWMServo04(17 downto 14) <= "0001";
-- PWMServo05(17 downto 14) <= "0001";
-- PWMServo06(17 downto 14) <= "0001";
-- PWMServo07(17 downto 14) <= "0001";
-- PWMServo08(17 downto 14) <= "0001";
-- PWMServo09(17 downto 14) <= "0001";
-- PWMServo10(17 downto 14) <= "0001";
-- PWMServo11(17 downto 14) <= "0001";
-- for i in 0 to 13 loop
-- if(TotalCounter(22) = '0') then
-- PWMServo00(i) <= TotalCounter(i + 8);
-- PWMServo01(i) <= not TotalCounter(i + 8);
-- PWMServo02(i) <= TotalCounter(i + 8);
-- PWMServo03(i) <= not TotalCounter(i + 8);
-- PWMServo04(i) <= TotalCounter(i + 8);
-- PWMServo05(i) <= not TotalCounter(i + 8);
-- PWMServo06(i) <= TotalCounter(i + 8);
-- PWMServo07(i) <= not TotalCounter(i + 8);
-- PWMServo08(i) <= TotalCounter(i + 8);
-- PWMServo09(i) <= not TotalCounter(i + 8);
-- PWMServo10(i) <= TotalCounter(i + 8);
-- PWMServo11(i) <= not TotalCounter(i + 8);
-- else
-- PWMServo00(i) <= not TotalCounter(i + 8);
-- PWMServo01(i) <= TotalCounter(i + 8);
-- PWMServo02(i) <= not TotalCounter(i + 8);
-- PWMServo03(i) <= TotalCounter(i + 8);
-- PWMServo04(i) <= not TotalCounter(i + 8);
-- PWMServo05(i) <= TotalCounter(i + 8);
-- PWMServo06(i) <= not TotalCounter(i + 8);
-- PWMServo07(i) <= TotalCounter(i + 8);
-- PWMServo08(i) <= not TotalCounter(i + 8);
-- PWMServo09(i) <= TotalCounter(i + 8);
-- PWMServo10(i) <= not TotalCounter(i + 8);
-- PWMServo11(i) <= TotalCounter(i + 8);
-- end if;
-- end loop;
-- end process;


--信号に変化のあった時の必要なセンシビリティリストを(else時も考慮して)キチンと記入する事
process(RESET, CLK) begin

--リセット時初期化
if(RESET='0') then --SWを押した時が0
TotalCounter <= (others => '1');
elsif(CLK'event and CLK='1') then
TotalCounter <= TotalCounter + '1';
end if;

end process;


--信号に変化のあった時の必要なセンシビリティリストを(else時も考慮して)キチンと記入する事
process(TotalCounter, PWMServo00, PWMServo01, PWMServo02, PWMServo03, PWMServo04, PWMServo05, PWMServo06, PWMServo07, PWMServo08, PWMServo09, PWMServo10, PWMServo11) begin

--符号無しで比較させる為
PWMTotalCounterCopy(16 downto 0)<=TotalCounter(16 downto 0);
PWMTotalCounterCopy(17)<='0';

--指定値に達したらPWMを0Vにする(18bit分で 0x40000: 0x40000/14.7456MHz=17.7777ms 約20msの周期として使える)
if(PWMTotalCounterCopy > PWMServo00) then --TotalCounterの18bit分を使う
PWM(0) <= '0';
else
PWM(0) <= '1';
end if;
if(PWMTotalCounterCopy > PWMServo01) then --TotalCounterの18bit分を使う
PWM(1) <= '0';
else
PWM(1) <= '1';
end if;
if(PWMTotalCounterCopy > PWMServo02) then --TotalCounterの18bit分を使う
PWM(2) <= '0';
else
PWM(2) <= '1';
end if;
if(PWMTotalCounterCopy > PWMServo03) then --TotalCounterの18bit分を使う
PWM(3) <= '0';
else
PWM(3) <= '1';
end if;
if(PWMTotalCounterCopy > PWMServo04) then --TotalCounterの18bit分を使う
PWM(4) <= '0';
else
PWM(4) <= '1';
end if;
if(PWMTotalCounterCopy > PWMServo05) then --TotalCounterの18bit分を使う
PWM(5) <= '0';
else
PWM(5) <= '1';
end if;
if(PWMTotalCounterCopy > PWMServo06) then --TotalCounterの18bit分を使う
PWM(6) <= '0';
else
PWM(6) <= '1';
end if;
if(PWMTotalCounterCopy > PWMServo07) then --TotalCounterの18bit分を使う
PWM(7) <= '0';
else
PWM(7) <= '1';
end if;
if(PWMTotalCounterCopy > PWMServo08) then --TotalCounterの18bit分を使う
PWM(8) <= '0';
else
PWM(8) <= '1';
end if;
if(PWMTotalCounterCopy > PWMServo09) then --TotalCounterの18bit分を使う
PWM(9) <= '0';
else
PWM(9) <= '1';
end if;
if(PWMTotalCounterCopy > PWMServo10) then --TotalCounterの18bit分を使う
PWM(10) <= '0';
else
PWM(10) <= '1';
end if;
if(PWMTotalCounterCopy > PWMServo11) then --TotalCounterの18bit分を使う
PWM(11) <= '0';
else
PWM(11) <= '1';
end if;

end process;


process(TotalCounter) begin --信号に変化のあった時の必要なセンシビリティリストを(else時も考慮して)キチンと記入する事

--LEDの処理(パルスによる点滅処理)
--上位と下位の同じビット数を比較して、パルス発生させるか決定する
--符号があるので、上位ビットを0にして比較しなければいけない
LEDCounterCopy0(11 downto 0)<=TotalCounter(23 downto 12);
LEDCounterCopy1(11 downto 0)<=TotalCounter(11 downto 0);
LEDCounterCopy0(12)<='0';
LEDCounterCopy1(12)<='0';
if(TotalCounter(24) = '1') then
if(LEDCounterCopy0 >= LEDCounterCopy1) then
LEDGreenOut <= '1';
else
LEDGreenOut <= '0';
end if;
else
if(LEDCounterCopy0 <= LEDCounterCopy1) then
LEDGreenOut <= '1';
else
LEDGreenOut <= '0';
end if;
end if;

end process;


--RS232C読み込みプロセス
process(CLK, RS232CReadStartFlag, RS232CIn, RS232CReadTimingCounter, RS232CReadCountNumber) begin --信号に変化のあった時の必要なセンシビリティリストを(else時も考慮して)キチンと記入する事

--最初のRS232Cがきたかどうか
if(RS232CIn='0' and RS232CReadStartFlag='0') then
RS232CReadStartFlag <= '1';
RS232CReadTimingCounter <= (others => '0');
elsif(CLK'event and CLK='1' and RS232CReadStartFlag='1') then
RS232CReadTimingCounter <= RS232CReadTimingCounter + '1';
case RS232CReadTimingCounter is
--最初のスタートビットのLowを検査(14.7456MHz/115200bpsの半分)
when "000001000000" =>
if(RS232CIn='1') then
RS232CReadStartFlag <= '0';
RS232CReadTimingCounter <= (others => '0');
end if;
--RS232C読み込み開始(14.7456MHz/115200bpsの1.5倍タイミング)
when "000011000000" =>
RS232CReadByteBuffer(0) <= RS232CIn;
--RS232C読み込み開始(14.7456MHz/115200bpsの2.5倍タイミング)
when "000101000000" =>
RS232CReadByteBuffer(1) <= RS232CIn;
--RS232C読み込み開始(14.7456MHz/115200bpsの3.5倍タイミング)
when "000111000000" =>
RS232CReadByteBuffer(2) <= RS232CIn;
--RS232C読み込み開始(14.7456MHz/115200bpsの4.5倍タイミング)
when "001001000000" =>
RS232CReadByteBuffer(3) <= RS232CIn;
--RS232C読み込み開始(14.7456MHz/115200bpsの5.5倍タイミング)
when "001011000000" =>
RS232CReadByteBuffer(4) <= RS232CIn;
--RS232C読み込み開始(14.7456MHz/115200bpsの6.5倍タイミング)
when "001101000000" =>
RS232CReadByteBuffer(5) <= RS232CIn;
--RS232C読み込み開始(14.7456MHz/115200bpsの7.5倍タイミング)
when "001111000000" =>
RS232CReadByteBuffer(6) <= RS232CIn;
--RS232C読み込み開始(14.7456MHz/115200bpsの8.5倍タイミング)
when "010001000000" =>
RS232CReadByteBuffer(7) <= RS232CIn;
--ストップビットのHighを検査(14.7456MHz/115200bpsの9.5倍タイミング)
when "010011000000" =>
if(RS232CIn='0') then
RS232CReadStartFlag <= '0';
RS232CReadTimingCounter <= (others => '0');
RS232CReadByteBuffer <= (others => '0');
end if;
--1byte分超えたら、読み取り終了(14.7456MHz)/(115200bps/10bit)
when "010100000000" =>
--1byte分終了
RS232CReadStartFlag <= '0';
RS232CReadTimingCounter <= (others => '0');
when others => null;
end case;
end if;

end process;


--RS232Cで読み込んだbyteをスタックに格納
process(RS232CReadStartFlag, RS232CReadCountNumber, RS232CReadCountMax, RS232CReadByteBuffer, PWMServoCalcCopy00, PWMServoCalcCopy01, PWMServoCalcCopy02, PWMServoCalcCopy03, PWMServoCalcCopy04, PWMServoCalcCopy05, PWMServoCalcCopy06, PWMServoCalcCopy07, PWMServoCalcCopy08, PWMServoCalcCopy09, PWMServoCalcCopy10, PWMServoCalcCopy11, RS232CReadStackByteBuffer00, RS232CReadStackByteBuffer01, RS232CReadStackByteBuffer02, RS232CReadStackByteBuffer03, RS232CReadStackByteBuffer04, RS232CReadStackByteBuffer05, RS232CReadStackByteBuffer06, RS232CReadStackByteBuffer07, RS232CReadStackByteBuffer08, RS232CReadStackByteBuffer09, RS232CReadStackByteBuffer10, RS232CReadStackByteBuffer11, RS232CReadStackByteBuffer12, RS232CReadStackByteBuffer13, RS232CReadStackByteBuffer14, RS232CReadStackByteBuffer15, RS232CReadStackByteBuffer16, RS232CReadStackByteBuffer17) begin

--最大18個のスタック
if(RS232CReadCountNumber > "00010001") then
RS232CReadCountNumber <= (others => '0');
--命令固有長
elsif(RS232CReadCountNumber > RS232CReadCountMax) then
RS232CReadCountNumber <= (others => '0');
case RS232CReadStackByteBuffer00 is
--0xFD
when "11111101" =>
--参考:700us-2300usの値(10321.92(0x2852)-33914.99(0x847A)) --1度の値は、((2300us-700us)/180度)*14.7456MHz = 131.072(0x83)
PWMServoCalcCopy00(17 downto 15) <= "000";
PWMServoCalcCopy00(14 downto 7) <= RS232CReadStackByteBuffer03;
PWMServoCalcCopy00(6 downto 0) <= "0000000";
-- PWMServoCalcCopy00 <= PWMServoCalcCopy00 * "010000011";
PWMServo00 <= PWMServoCalcCopy00 + "000010100101100110";
PWMServoCalcCopy01(17 downto 15) <= "000";
PWMServoCalcCopy01(14 downto 7) <= RS232CReadStackByteBuffer04;
PWMServoCalcCopy01(6 downto 0) <= "0000000";
-- PWMServoCalcCopy01 <= PWMServoCalcCopy01 * "010000011";
PWMServo01 <= PWMServoCalcCopy01 + "000010100101100110";
PWMServoCalcCopy02(17 downto 15) <= "000";
PWMServoCalcCopy02(14 downto 7) <= RS232CReadStackByteBuffer05;
PWMServoCalcCopy02(6 downto 0) <= "0000000";
-- PWMServoCalcCopy02 <= PWMServoCalcCopy02 * "010000011";
PWMServo02 <= PWMServoCalcCopy02 + "000010100101100110";
PWMServoCalcCopy03(17 downto 15) <= "000";
PWMServoCalcCopy03(14 downto 7) <= RS232CReadStackByteBuffer06;
PWMServoCalcCopy03(6 downto 0) <= "0000000";
-- PWMServoCalcCopy03 <= PWMServoCalcCopy03 * "010000011";
PWMServo03 <= PWMServoCalcCopy03 + "000010100101100110";
PWMServoCalcCopy04(17 downto 15) <= "000";
PWMServoCalcCopy04(14 downto 7) <= RS232CReadStackByteBuffer07;
PWMServoCalcCopy04(6 downto 0) <= "0000000";
-- PWMServoCalcCopy04 <= PWMServoCalcCopy04 * "010000011";
PWMServo04 <= PWMServoCalcCopy04 + "000010100101100110";
PWMServoCalcCopy05(17 downto 15) <= "000";
PWMServoCalcCopy05(14 downto 7) <= RS232CReadStackByteBuffer08;
PWMServoCalcCopy05(6 downto 0) <= "0000000";
-- PWMServoCalcCopy05 <= PWMServoCalcCopy05 * "010000011";
PWMServo05 <= PWMServoCalcCopy05 + "000010100101100110";
PWMServoCalcCopy06(17 downto 15) <= "000";
PWMServoCalcCopy06(14 downto 7) <= RS232CReadStackByteBuffer09;
PWMServoCalcCopy06(6 downto 0) <= "0000000";
-- PWMServoCalcCopy06 <= PWMServoCalcCopy06 * "010000011";
PWMServo06 <= PWMServoCalcCopy06 + "000010100101100110";
PWMServoCalcCopy07(17 downto 15) <= "000";
PWMServoCalcCopy07(14 downto 7) <= RS232CReadStackByteBuffer10;
PWMServoCalcCopy07(6 downto 0) <= "0000000";
-- PWMServoCalcCopy07 <= PWMServoCalcCopy07 * "010000011";
PWMServo07 <= PWMServoCalcCopy07 + "000010100101100110";
PWMServoCalcCopy08(17 downto 15) <= "000";
PWMServoCalcCopy08(14 downto 7) <= RS232CReadStackByteBuffer11;
PWMServoCalcCopy08(6 downto 0) <= "0000000";
-- PWMServoCalcCopy08 <= PWMServoCalcCopy08 * "010000011";
PWMServo08 <= PWMServoCalcCopy08 + "000010100101100110";
PWMServoCalcCopy09(17 downto 15) <= "000";
PWMServoCalcCopy09(14 downto 7) <= RS232CReadStackByteBuffer12;
PWMServoCalcCopy09(6 downto 0) <= "0000000";
-- PWMServoCalcCopy09 <= PWMServoCalcCopy09 * "010000011";
PWMServo09 <= PWMServoCalcCopy09 + "000010100101100110";
PWMServoCalcCopy10(17 downto 15) <= "000";
PWMServoCalcCopy10(14 downto 7) <= RS232CReadStackByteBuffer13;
PWMServoCalcCopy10(6 downto 0) <= "0000000";
-- PWMServoCalcCopy10 <= PWMServoCalcCopy10 * "010000011";
PWMServo10 <= PWMServoCalcCopy10 + "000010100101100110";
PWMServoCalcCopy11(17 downto 15) <= "000";
PWMServoCalcCopy11(14 downto 7) <= RS232CReadStackByteBuffer14;
PWMServoCalcCopy11(6 downto 0) <= "0000000";
-- PWMServoCalcCopy11 <= PWMServoCalcCopy11 * "010000011";
PWMServo11 <= PWMServoCalcCopy11 + "000010100101100110";
when others => null;
end case;
elsif(RS232CReadStartFlag'event and RS232CReadStartFlag='0') then
--読み込んだ1バイトを格納
case RS232CReadCountNumber is
when "00000000" =>
RS232CReadStackByteBuffer00 <= RS232CReadByteBuffer;
case RS232CReadByteBuffer is
--0xFD
when "11111101" =>
RS232CReadCountMax <= "00001111";
when others =>
RS232CReadCountMax <= (others => '0');
end case;
when "00000001" =>
RS232CReadStackByteBuffer01 <= RS232CReadByteBuffer;
when "00000010" =>
RS232CReadStackByteBuffer02 <= RS232CReadByteBuffer;
when "00000011" =>
RS232CReadStackByteBuffer03 <= RS232CReadByteBuffer;
when "00000100" =>
RS232CReadStackByteBuffer04 <= RS232CReadByteBuffer;
when "00000101" =>
RS232CReadStackByteBuffer05 <= RS232CReadByteBuffer;
when "00000110" =>
RS232CReadStackByteBuffer06 <= RS232CReadByteBuffer;
when "00000111" =>
RS232CReadStackByteBuffer07 <= RS232CReadByteBuffer;
when "00001000" =>
RS232CReadStackByteBuffer08 <= RS232CReadByteBuffer;
when "00001001" =>
RS232CReadStackByteBuffer09 <= RS232CReadByteBuffer;
when "00001010" =>
RS232CReadStackByteBuffer10 <= RS232CReadByteBuffer;
when "00001011" =>
RS232CReadStackByteBuffer11 <= RS232CReadByteBuffer;
when "00001100" =>
RS232CReadStackByteBuffer12 <= RS232CReadByteBuffer;
when "00001101" =>
RS232CReadStackByteBuffer13 <= RS232CReadByteBuffer;
when "00001110" =>
RS232CReadStackByteBuffer14 <= RS232CReadByteBuffer;
when "00001111" =>
RS232CReadStackByteBuffer15 <= RS232CReadByteBuffer;
when "00010000" =>
RS232CReadStackByteBuffer16 <= RS232CReadByteBuffer;
when "00010001" =>
RS232CReadStackByteBuffer17 <= RS232CReadByteBuffer;
when others => null ;
end case;
--読み込みカウントアップ
RS232CReadCountNumber <= RS232CReadCountNumber + '1';
end if;

end process;


--RS232C吐き出し処理
process(CLK, TotalCounter, RS232CWriteStartFlag) begin --信号に変化のあった時の必要なセンシビリティリストを(else時も考慮して)キチンと記入する事

--RS232CWriteTimingCounter生成
if(RS232CWriteStartFlag='0') then
RS232CWriteTimingCounter <= (others => '0');
elsif(CLK'event and CLK='1') then
RS232CWriteTimingCounter <= RS232CWriteTimingCounter + '1';
end if;
--RS232C吐き出し開始指令と停止処理
if(CLK'event and CLK='1') then
--開始
case TotalCounter is
when "0000000000000000000000000" =>
RS232CWriteByteBuffer <= PWMServo00(15 downto 8); --吐き出しバイトをRS232CWriteByteBufferにセット
-- RS232CWriteByteBuffer <= RS232CReadStackByteBuffer03; --吐き出しバイトをRS232CWriteByteBufferにセット
RS232CWriteStartFlag<='1'; --吐き出し開始指令
when "0000100000000000000000000" =>
RS232CWriteByteBuffer <= PWMServo01(15 downto 8); --吐き出しバイトをRS232CWriteByteBufferにセット
-- RS232CWriteByteBuffer <= RS232CReadStackByteBuffer04; --吐き出しバイトをRS232CWriteByteBufferにセット
RS232CWriteStartFlag<='1'; --吐き出し開始指令
when "0001000000000000000000000" =>
RS232CWriteByteBuffer <= PWMServo02(15 downto 8); --吐き出しバイトをRS232CWriteByteBufferにセット
-- RS232CWriteByteBuffer <= RS232CReadStackByteBuffer05; --吐き出しバイトをRS232CWriteByteBufferにセット
RS232CWriteStartFlag<='1'; --吐き出し開始指令
when "0001100000000000000000000" =>
RS232CWriteByteBuffer <= PWMServo03(15 downto 8); --吐き出しバイトをRS232CWriteByteBufferにセット
-- RS232CWriteByteBuffer <= RS232CReadStackByteBuffer06; --吐き出しバイトをRS232CWriteByteBufferにセット
RS232CWriteStartFlag<='1'; --吐き出し開始指令
when "0010000000000000000000000" =>
RS232CWriteByteBuffer <= PWMServo04(15 downto 8); --吐き出しバイトをRS232CWriteByteBufferにセット
-- RS232CWriteByteBuffer <= RS232CReadStackByteBuffer07; --吐き出しバイトをRS232CWriteByteBufferにセット
RS232CWriteStartFlag<='1'; --吐き出し開始指令
when "0010100000000000000000000" =>
RS232CWriteByteBuffer <= PWMServo05(15 downto 8); --吐き出しバイトをRS232CWriteByteBufferにセット
-- RS232CWriteByteBuffer <= RS232CReadStackByteBuffer08; --吐き出しバイトをRS232CWriteByteBufferにセット
RS232CWriteStartFlag<='1'; --吐き出し開始指令
when "0011000000000000000000000" =>
RS232CWriteByteBuffer <= PWMServo06(15 downto 8); --吐き出しバイトをRS232CWriteByteBufferにセット
-- RS232CWriteByteBuffer <= RS232CReadStackByteBuffer09; --吐き出しバイトをRS232CWriteByteBufferにセット
RS232CWriteStartFlag<='1'; --吐き出し開始指令
when "0011100000000000000000000" =>
RS232CWriteByteBuffer <= PWMServo07(15 downto 8); --吐き出しバイトをRS232CWriteByteBufferにセット
-- RS232CWriteByteBuffer <= RS232CReadStackByteBuffer10; --吐き出しバイトをRS232CWriteByteBufferにセット
RS232CWriteStartFlag<='1'; --吐き出し開始指令
when "0100000000000000000000000" =>
RS232CWriteByteBuffer <= PWMServo08(15 downto 8); --吐き出しバイトをRS232CWriteByteBufferにセット
-- RS232CWriteByteBuffer <= RS232CReadStackByteBuffer11; --吐き出しバイトをRS232CWriteByteBufferにセット
RS232CWriteStartFlag<='1'; --吐き出し開始指令
when "0100100000000000000000000" =>
RS232CWriteByteBuffer <= PWMServo09(15 downto 8); --吐き出しバイトをRS232CWriteByteBufferにセット
-- RS232CWriteByteBuffer <= RS232CReadStackByteBuffer12; --吐き出しバイトをRS232CWriteByteBufferにセット
RS232CWriteStartFlag<='1'; --吐き出し開始指令
when "0101000000000000000000000" =>
RS232CWriteByteBuffer <= PWMServo10(15 downto 8); --吐き出しバイトをRS232CWriteByteBufferにセット
-- RS232CWriteByteBuffer <= RS232CReadStackByteBuffer13; --吐き出しバイトをRS232CWriteByteBufferにセット
RS232CWriteStartFlag<='1'; --吐き出し開始指令
when "0101100000000000000000000" =>
RS232CWriteByteBuffer <= PWMServo11(15 downto 8); --吐き出しバイトをRS232CWriteByteBufferにセット
-- RS232CWriteByteBuffer <= RS232CReadStackByteBuffer14; --吐き出しバイトをRS232CWriteByteBufferにセット
RS232CWriteStartFlag<='1'; --吐き出し開始指令
when others => null;
end case;
--停止
--RS232Cストップビット後に停止(14.7456MHz/115200bpsの10倍まで)
if(RS232CWriteTimingCounter>"010100000000") then
RS232CWriteStartFlag<='0';
RS232CWriteByteBuffer <= (others => '0'); --吐き出しバイトクリア
end if;
end if;

end process;

--実際のTTL生成処理
process(RS232CWriteTimingCounter, RS232CWriteByteBuffer) begin --信号に変化のあった時の必要なセンシビリティリストを(else時も考慮して)キチンと記入する事

--なにも出力しない時はHigh
if(RS232CWriteTimingCounter="000000000000") then
RS232COut<='1';
--最初のスタートビットのLow(14.7456MHz/115200bpsまで)
elsif(RS232CWriteTimingCounter<"000010000000") then
RS232COut<='0';
--RS232C読み込み開始(14.7456MHz/115200bpsの2倍まで)
elsif(RS232CWriteTimingCounter<"000100000000") then
RS232COut<=RS232CWriteByteBuffer(0);
--RS232C読み込み開始(14.7456MHz/115200bpsの3倍まで)
elsif(RS232CWriteTimingCounter<"000110000000") then
RS232COut<=RS232CWriteByteBuffer(1);
--RS232C読み込み開始(14.7456MHz/115200bpsの4倍まで)
elsif(RS232CWriteTimingCounter<"001000000000") then
RS232COut<=RS232CWriteByteBuffer(2);
--RS232C読み込み開始(14.7456MHz/115200bpsの5倍まで)
elsif(RS232CWriteTimingCounter<"001010000000") then
RS232COut<=RS232CWriteByteBuffer(3);
--RS232C読み込み開始(14.7456MHz/115200bpsの6倍まで)
elsif(RS232CWriteTimingCounter<"001100000000") then
RS232COut<=RS232CWriteByteBuffer(4);
--RS232C読み込み開始(14.7456MHz/115200bpsの7倍まで)
elsif(RS232CWriteTimingCounter<"001110000000") then
RS232COut<=RS232CWriteByteBuffer(5);
--RS232C読み込み開始(14.7456MHz/115200bpsの8倍まで)
elsif(RS232CWriteTimingCounter<"010000000000") then
RS232COut<=RS232CWriteByteBuffer(6);
--RS232C読み込み開始(14.7456MHz/115200bpsの9倍まで)
elsif(RS232CWriteTimingCounter<"010010000000") then
RS232COut<=RS232CWriteByteBuffer(7);
--RS232CストップビットHigh以降
else
RS232COut<='1';
end if;

end process;


end Behavioral;


※ 『二足歩行』に繋がる関連物を 視覚的に探しだせるサイトを作ってみました(よろしければクリックしてみてくださいね)。

 月間ページ閲覧者数:10人

[ DIY ] 一覧へ


<< 2018年1月
2018年1月18日(木)
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

 最近の書き込み

SMTP
  <2016-04-06 12:03:21>
S.M.A.R.T.
  <2015-05-07 08:03:36>
POP
  <2015-04-21 11:33:37>
Linuxコマンド
  <2015-04-21 11:03:04>
アルバートオデッセイ
  <2014-08-04 23:12:12>
トイレ
  <2014-01-31 08:58:16>
(*)調光スイッチ
  <2013-09-30 10:46:11>
(*)調光スイッチ
  <2013-09-20 01:26:34>
(*)調光スイッチ
  <2013-09-17 12:21:11>
(*)調光スイッチ
  <2013-09-15 20:13:59>


 カテゴリー

おでかけ(83)
サッカー(45)
旅(45)
DIY(43)
 ・ トイレ
 ・ 蛇口
 ・ 肘掛け
 ・ 壁掛金具
 ・ 配線
 ・ 駐車場
 ・ 生垣
 ・ 接着剤
 ・ オイル
 ・ ジャンボエンチョー
 ・ ネジ
 ・ 塗装剥離
 ・ ガソリン携行缶
 ・
 ・ 蛍光灯交換
 ・ 草刈り
 ・ 網戸張替え
 ・ 塗装
 ・
 ・ 道具
 ・
 ・ 自転車小屋
 ・ 自転車小屋2
 ・ ドアノブ
 ・ 調光スイッチ
 ・ センサー付ライト
 ・ カーステ設置
 ・ 換気扇設置
 ・ 綿菓子
 ・ 玩具修理
 ・ 石組み水槽
 ・ 段ボールロボ
 ・ コケ取り棒
 ・ ガラスフィルム
 ・ 玄関網戸
 ・ 御影石
 ・ インターホン → TVドアホン
 ・ スピーカーのプラスマイナス
 ・ エアコン取付け
 ・ 電子部品
 ・ 車 リアスピーカー
 ・ 日産キューブ インパネ
 ・ 二足歩行
食べ物(39)
映画(36)
家(35)
季節(34)
健康(32)
地元(29)
本(29)
家族(29)
モバイル(23)
生物(23)
学校(22)
家電(21)
ドラマ(21)
風景(18)
Web(18)
PCハード(17)
通勤(16)
ゲーム(16)
Winアプリ(15)
ブログ(14)
Linux(13)
飲み物(13)
自転車(13)
ゴルフ(11)
ブラウザ(11)
ネットワーク(10)
javascript(10)
足技(9)
php(9)
会社(8)
感銘映像(8)
税金(6)
空想(5)
VMware(5)
Ruby(4)
データベース(3)
perl(1)