FPGA選定 *
とりあえず回路を書いてみないとどの程度の規模のヤツが必要かわからないので、ざっくり設計。
Verilog HDLがはやっているようだけど、VHDLしか分かりません。
| library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity pwmc is
port(
SCS : in std_logic;
SIN : in std_logic;
SCLK : in std_logic;
PWM : out std_logic_vector(0 to 47);
CLK : in std_logic;
RESET : in std_logic
);
end pwmc;
architecture Behavioral of pwmc is
signal DeltaWave : integer range 0 to 63;
type PWMDatatype is array (0 to 3) of integer range 0 to 64;
constant PWMData : PWMDatatype :=(0, 1, 8, 64);
type RAMDATAtype is array (0 to 47) of integer range 0 to 3;
signal PWMValue : RAMDATAtype;
signal PWMValueBuf : std_logic_vector(0 to 1);
signal PWMValuePos : integer range 0 to 95;
begin
FORgen: for I in 0 to 47 generate
PWM(I) <= '1' when (PWMData(PWMValue(I)) > DeltaWave) else '0';
end generate;
process(SCLK, SCS, SIN, RESET) begin
if(RESET = '0') then
for I in 0 to 47 loop
PWMValue(I) <= 0;
end loop;
elsif(SCS = '0') then
PWMValuePos <= 0;
elsif(SCLK'event and SCLK = '1') then
PWMValuePos <= PWMValuePos + 1;
PWMValueBuf(1) <= PWMValueBuf(0);
PWMValueBuf(0) <= SIN;
if PWMValuePos mod 2 = 0 then
PWMValue(PWMValuePos / 2) <= CONV_INTEGER(PWMValueBuf);
end if;
end if;
end process;
process(CLK, RESET) begin
if(RESET = '0') then
DeltaWave <= 0;
elsif(CLK'event and CLK = '1') then
DeltaWave <= DeltaWave + 1;
end if;
end process;
end Behavioral;
|
XilinxのCPLDにFitさせるためには、マクロセルが160個必要になるらしい。
ダブルバッファにするなら、200個以上かぁ。
CPLDにFitすれば最高なんだけどなぁ...FPGAって規模じゃないよね
マイコンでも *
マイコン野郎になるためには、FPGAを使わず全部マイコンでって言う手もあるのかな