guruguru123’s diary

かなり雑な作業日記です。

Papilio Pro基板上SDRAMの利用(8)

とりあえずこんな感じに組み込んでみた。今回はあまり速度は考えず、一秒間隔で書き込み、そのままそのアドレスを読み出しをする。読み出しが終わったらRS232Cのブロックにデータを渡してPCと通信させる。コンパイルまで終わったが、シリアルコンソールに出力がされなかった。そこで別々にどこが動いていないのか確認してみた。

f:id:guruguru123:20160930180940p:plain

まず前に作ったRS232C通信機構を崩して作成したRS232C送信ブロック。16bitの0000010100000101をデータとして入力すると以下のように表示された。よってここは問題ない。

f:id:guruguru123:20160930180947p:plain

今回は、ここまでの確認で終了。おそらく、時間経過しているのにSDRAMのリフレッシュがされていないのが原因だと思う。

以下RS232C通信部分。

 

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
--use ieee.numeric_std.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
--ボーレート230400:137
--115200:276
--9600:3332
entity rs232c is
port(
--resetb : in std_logic;
clk : in std_logic;
--tx : in std_logic;
rx : out std_logic;
txd : in std_logic_vector(15 downto 0);
state : in std_logic
);
end rs232c;

architecture Behavioral of rs232c is
signal data : std_logic_vector(15 downto 0):= (others => '0');
signal counter : std_logic_vector(11 downto 0):=(others => '0');
signal current_bit : std_logic_vector(4 downto 0):=(others => '0');

signal state2 : std_logic;
signal start : std_logic;

begin
--data <= txd;
process(clk,state)
begin
if falling_edge(state) then
start <= '1';
end if;

--if start = '1' then
if rising_edge(clk) then
if counter = 3332 then
counter <= (others => '0');
if current_bit = "10100" then
current_bit <= "00000";
start <= '0';
else
current_bit <= current_bit + '1';
end if;
else
case current_bit is
when "00000" => rx <= '0';
when "00001" => rx <= data(8);
when "00010" => rx <= data(9);
when "00011" => rx <= data(10);
when "00100" => rx <= data(11);
when "00101" => rx <= data(12);
when "00110" => rx <= data(13);
when "00111" => rx <= data(14);
when "01000" => rx <= data(15);
when "01001" => rx <= '1';
when "01010" => rx <= '0';
when "01011" => rx <= data(0);
when "01100" => rx <= data(1);
when "01101" => rx <= data(2);
when "01110" => rx <= data(3);
when "01111" => rx <= data(4);
when "10000" => rx <= data(5);
when "10001" => rx <= data(6);
when "10010" => rx <= data(7);
when "10011" => rx <= '1';
when others => null;
end case;
counter <= counter + 1;
end if;
end if;
--end if;
end process;

process(state) begin
if rising_edge(state) then
data <= "0000010100000101";--txd;
end if;
end process;

end Behavioral;