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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity config_example is
port(
reset: in std_logic;
mclk: in std_logic;
sdat: out std_logic;
sclk: out std_logic);
end entity;
architecture rtl of config_example is
signal mcnt,mnct1: std_logic_vector(6 downto 0);
signal bcnt: std_logic_vector(3 downto 0);
signal wdata: std_logic_vector(8 downto 0);
signal part: std_logic_vector(1 downto 0);
signal mm_reg: std_logic_vector(4 downto 0);
signal mm: std_logic_vector(4 downto 0);
signal addr: std_logic_vector(7 downto 0);
signal data: std_logic_vector(7 downto 0);
constant wr : std_logic := '0';
constant device : std_logic_vector(7 downto 0) := x"55";
type config_data_type is array (7 downto 1) of std_logic_vector(7 downto 0);
constant data_reg : config_data_type:=(X"03",X"02",X"08",X"11",X"33",X"12",X"18");
type WRSTATE is (T0,T1,T2);
signal config_st: WRSTATE;
begin
fenp:process(reset,mclk)
begin
if(reset = '1')then
mcnt <= (others => '0');
elsif(mclk'event and mclk = '1')then
mcnt <= mcnt + '1';
end if;
end process;
mm_reg <= mm;
process(reset,mclk) --
begin
if(reset = '1')then
wdata <= (others => '0');
bcnt <= (others => '0');
part <= "00";
mm <= "10000";
config_st <= T0;
data <= x"00";
addr <= x"08";
elsif(rising_edge(mclk))then
if mcnt = "1111111" then
case config_st is
when T0 => config_st <= T1;bcnt <= (others => '0');
data <= x"00";
case part is
when "00" => addr <= x"08"; mm <= "10000";
when "01" => addr <= x"40"; mm <= "11000";
when "10" => addr <= x"0e"; mm <= "00110"; data <= data_reg(6);--
when others => addr <= x"08"; mm <= "00001"; data <=data_reg(7);
end case;
wdata <= device(6 downto 0) & wr & '0';
when T1 =>
if bcnt = "1000" then
bcnt <= (others => '0');
wdata <= addr & '0';
config_st <= T2;
else
bcnt <= bcnt + '1';
end if;
when T2 =>
if bcnt = "1000" then
bcnt <= (others => '0');
wdata <= data & '0';
config_st <= T0;
else
bcnt <= bcnt + '1';
config_st <= T0;
config_st <= T1; -----error1
end if;
-- when others => config_st <= T0; -----error2
end case;
end if;
end if;
end process;
sdat <= '0'; -----error3
process(reset,mclk) -----error4
begin
if(reset ='1')then
sclk <= '0';
sdat <= '0';
end if;
end process;
process(reset,mclk)
--process(reset,mclk,config_st) -----error5
--process(mclk) -----error6
begin
if(reset ='1')then
sclk <= '0';
sdat <= '0';
elsif(rising_edge(mclk))then
sclk <= mcnt(6);
case config_st is
when T0 =>
if mcnt < "1100000" then
sdat <= '1';
else
sdat <= '0';
end if;
when T1 => sclk <= '0'; sdat <= '0';
when others =>
if mcnt= "0100000" then
sdat <= wdata(8-conv_integer(bcnt));
end if;
end case;
end if;
end process;
end rtl;
|