欢迎点击关注我
今天为“IIC总线介绍及FPGA编程”的第七章“FPGA代码通读"讲解。
视频中文字内容:
之后我们通读一遍程序代码lb2iic_module.vhd:
建立最顶层,树形结构是这样的:
顶层程序的写法:单字节写 测试程序:
S_clk_40M)
begin
if I_rst = '0' then
S_cs_n <= '1';
S_wr_n <= '1';
S_rd_n <= '1';
ST_wr <= M_idle;
elsif S_clk_40M'event and S_clk_40M = '1' then
<= S_busy;
<= S_busy_bufs(0);
--单字节写
case ST_wr is
when M_idle =>
if I_key_start = '0' then
ST_wr <= M_wr;
end if;
when M_wr =>
S_cs_n <= '0';
S_wr_n <= '0';
S_addr <= x"15";
S_data_in <= x"5a";
S_byte_num <= 1;
if S_abyte = '1' then
S_cs_n <= '1';
S_wr_n <= '1';
end if;
when others =>
ST_wr <= M_idle;
end case;
end if;
end process;
连续写:测试程序:
process(I_rst, S_clk_40M)
begin
if I_rst = '0' then
S_cs_n <= '1';
S_wr_n <= '1';
S_rd_n <= '1';
ST_wr <= M_idle;
elsif S_clk_40M'event and S_clk_40M = '1' then
S_busy_bufs(0) <= S_busy;
S_busy_bufs(1) <= S_busy_bufs(0);
--连续写
case ST_wr is
when M_idle =>
if I_key_start = '0' then
S_cs_n <= '0';
S_wr_n <= '0';
S_addr <= x"15";
S_data_in <= x"5a";
S_byte_num <= 8;
ST_wr <= M_wr;
end if;
when M_wr =>
if S_abyte = '1' then
S_data_in <= S_data_in + '1';
end if;
if S_busy_bufs(1) = '1' and S_busy_bufs(0) = '0' then
S_cs_n <= '1';
S_wr_n <= '1';
end if;
when others =>
ST_wr <= M_idle;
end case;
end if;
end process;
单字节读 测试程序:
S_clk_40M)
begin
if I_rst = '0' then
S_cs_n <= '1';
S_wr_n <= '1';
S_rd_n <= '1';
ST_wr <= M_idle;
elsif S_clk_40M'event and S_clk_40M = '1' then
<= S_busy;
<= S_busy_bufs(0);
--单字节读
case ST_wr is
when M_idle =>
if I_key_start = '0' then
S_cs_n <= '0';
S_rd_n <= '0';
S_addr <= x"15";
S_byte_num <= 1;
ST_wr <= M_wr;
end if;
when M_wr =>
if S_busy_bufs(1) = '1' and S_busy_bufs(0) = '0' then
S_cs_n <= '1';
S_rd_n <= '1';
S_data_reg <= S_data_out;
end if;
when others =>
ST_wr <= M_idle;
end case;
end if;
end process;
连续读 测试程序:
process(I_rst, S_clk_40M)
begin
if I_rst = '0' then
S_cs_n <= '1';
S_wr_n <= '1';
S_rd_n <= '1';
ST_wr <= M_idle;
elsif S_clk_40M'event and S_clk_40M = '1' then
S_busy_bufs(0) <= S_busy;
S_busy_bufs(1) <= S_busy_bufs(0);
--连续读
case ST_wr is
when M_idle =>
if I_key_start = '0' then
S_cs_n <= '0';
S_rd_n <= '0';
S_addr <= x"15";
S_byte_num <= 8;
ST_wr <= M_wr;
end if;
when M_wr =>
if S_abyte = '1' then
S_data_reg <= S_data_out;
end if;
if S_busy_bufs(1) = '1' and S_busy_bufs(0) = '0' then
S_cs_n <= '1';
S_rd_n <= '1';
end if;
when others =>
ST_wr <= M_idle;
end case;
end if;
end process;
欢迎点击“点赞、收藏、在看”,分享给更多人看到
往期文章
|
联系我可以加我微信ykdwdd,或者扫描下方二维码。