找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3085|回复: 1
打印 上一主题 下一主题
收起左侧

我的数字电位器FPGA verilog i2c控制设计 含源码文档原理图

[复制链接]
跳转到指定楼层
楼主
ID:429897 发表于 2019-2-14 14:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
数字电位器的型号是tpl0102
我所做的内容是用iSe14.7设计一个i2c,来控制它输出电阻的大小;
总阻值是100KΩ;
  1. `timescale 1ns / 1ns
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date:    08:59:53 02/12/2019
  7. // Design Name:
  8. // Module Name:    IIC
  9. // Project Name:
  10. // Target Devices:
  11. // Tool versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //////////////////////////////////////////////////////////////////////////////////
  21. module IIC(
  22.                 clk_sys,
  23.                 rst_n,
  24.                 //key_wr,
  25.                 //key_rd,
  26.                 eeprom_scl,
  27.                 //led,
  28.                 eeprom_sda
  29. );

  30. input clk_sys;
  31. input rst_n;
  32. //input key_rd;
  33. //input key_wr;

  34. output reg eeprom_scl;
  35. //output [3:0] led;                        

  36. //output reg [7:0] result; //256
  37. //output reg led;

  38. inout  eeprom_sda;

  39. //reg [3:0] led;
  40. reg clk;
  41. reg [7:0] cnt;//256
  42. reg [7:0] state;//256
  43. reg [3:0] counter;//16
  44. reg link_sda;
  45. reg wr;
  46. //reg rd;
  47. reg sda_buf;

  48. reg [7:0] data;
  49. //reg [24:0] Cl; // C1 延时计数器
  50. //wire C1_Clk;   // 产生一个脉动时钟
  51. //assign Cl_Clk = (Cl == 25'd24999999 ) ? 1 : 0;
  52. assign eeprom_sda = (link_sda)?sda_buf:1'hz;
  53. always @ ( negedge clk_sys or negedge rst_n)
  54.         begin
  55.                 if(!rst_n)
  56.                         begin       
  57.                                 clk <= 0;
  58.                                 cnt <= 0;
  59.                                 //Cl  <= 0;
  60.                         end
  61.                 else
  62.                         begin
  63.                                 if(cnt<249)
  64.                                         cnt <= cnt + 1'b1;
  65.                                 else
  66.                                         begin
  67.                                                 clk <= ~clk;
  68.                                                 cnt <= 0;
  69.                                         end
  70.                                 //if(Cl<25'd24999999)Cl <= Cl + 1'b1;
  71.                                 //else Cl <= 25'd0;
  72.                         end
  73.         end//250*20ns=5000ns=5us=200KHZ;5us*2=10Us=100KHZ;
  74.        
  75. always @(negedge clk or negedge rst_n)
  76.         begin
  77.                 if(!rst_n)
  78.                         begin
  79.                                 eeprom_scl <= 0;
  80.                         end
  81.                 else
  82.                         eeprom_scl <= ~eeprom_scl;
  83.         end//50KHz=20us=20000ns
  84.        
  85. always @ (posedge clk or negedge rst_n)
  86.         begin
  87.                 if(!rst_n)
  88.                         begin
  89.                                 state <= 0;
  90.                                 link_sda <= 0;
  91.                                 sda_buf <= 0;
  92.                                 counter <= 0;
  93.                                 wr <= 1;
  94.                                 //led = 1;
  95.                                 //rd <= 0;
  96.                                 //result <= 0;
  97.                                 data <= 0;
  98.                                 //led <= 4'b0001;
  99.                         end
  100.                 else
  101.                         begin
  102.                                         case(state)
  103.                                                 0:begin
  104.                                                                 wr <= 1;
  105.                                                         if(!eeprom_scl)
  106.                                                                 begin
  107.                                                                         link_sda <= 1;
  108.                                                                         sda_buf <= 1;
  109.                                                                         state <= 1;
  110.                                                                 end
  111.                                                 end
  112.                                                
  113.                                                 1:begin
  114.                                                         if(eeprom_scl)
  115.                                                                 begin
  116.                                                                         sda_buf <= 0;
  117.                                                                         state <= 2;
  118.                                                                         data <= 8'b10100000;
  119.                                                                        
  120.                                                                 end
  121.                                                 end
  122.                                                
  123.                                                 2:begin
  124.                                                         if((counter<8)&&(!eeprom_scl))
  125.                                                                 begin
  126.                                                                         counter <= counter + 1'b1;
  127.                                                                         data <= {data[6:0],data[7]};
  128.                                                                         sda_buf <= data[7];
  129.                                                                 end
  130.                                                         else if((counter == 8)&&(!eeprom_scl))
  131.                                                                 begin
  132.                                                                         counter <= 0;
  133.                                                                         state <= 3;
  134.                                                                         link_sda <= 0;
  135.                                                                 end
  136.                                                         end
  137.                                                        
  138.                                                 3:begin
  139.                                                         if(eeprom_scl)
  140.                                                                 begin
  141.                                                                         if(!eeprom_sda)
  142.                                                                                 begin
  143.                                                                                         state <= 4;
  144.                                                                                         data <= 8'h00;//μ??·
  145.                                                                                 end
  146.                                                                 end
  147.                                                        
  148.                                                 end
  149.                                                
  150.                                                 4:begin
  151.                                                         link_sda <= 1;
  152.                                                         if((counter < 8)&&(!eeprom_scl))
  153.                                                                 begin
  154.                                                                         counter <= counter + 1'b1;
  155.                                                                         data <= {data[6:0],data[7]};
  156.                                                                         sda_buf <= data[7];
  157.                                                                 end
  158.                                                         else if ((counter == 8)&&(!eeprom_scl))
  159.                                                                 begin
  160.                                                                                         counter <= 0;
  161.                                                                                         state <= 5;
  162.                                                                                         link_sda <= 0;
  163.                                                                                         sda_buf <= 1;
  164.                                                                 end
  165.                                                 end//
  166.                                                
  167.                                                 5:begin
  168.                                                         if(eeprom_scl)
  169.                                                                 begin
  170.                                                                         if(!eeprom_sda)
  171.                                                                                 begin
  172.                                                                                         if(wr == 1)
  173.                                                                                        
  174.                                                                                         begin
  175.                                                                                                 state <= 6;
  176.                                                                                         end
  177.                                                                                         data <= 8'b00000101;//
  178.                                                                                 end
  179.                                                                 end
  180.                                                 end
  181.                                                
  182.                                                 6:begin
  183.                                                         link_sda <= 1;
  184.                                                         if((counter < 8)&&(!eeprom_scl))
  185.                                                                 begin
  186.                                                                         counter <= counter + 1'b1;
  187.                                                                    data <= {data[6:0], data[7]};
  188.                                                                         sda_buf <= data[7];
  189.                                                                 end
  190.                                                         else if((counter == 8)&&(!eeprom_scl))
  191.                                                                         begin
  192.                                                                                 counter <= 0;
  193.                                                                                 state <= 7;
  194.                                                                                 link_sda <= 0;
  195.                                                                         end
  196.                                            end
  197.                                                
  198.                                                 7:begin
  199.                                                         if(eeprom_scl)
  200.                                                                 begin
  201.                                                                         if(!eeprom_sda)
  202.                                                                                 state <= 8;
  203.                                                                 end
  204.                                                                                
  205.                                                 end
  206.                                                
  207.                                                 8:begin
  208.                                                         link_sda <= 1;
  209.                                                         sda_buf <= 0;//先拉低,再拉高;
  210.                                                         if(eeprom_scl)
  211.                                                          begin
  212.                                                                 //led <= 0;
  213.                                                                 sda_buf <= 1;
  214.                                                                 state <= 0;
  215.                                                                    //wr <= 0;
  216.                                                                 //led <= 4'b0100;
  217.                                                                 //led[0] <= 1;
  218.                                                                 //led[1] <= 0;
  219.                                                          end
  220.                                                          //if(Cl_Clk)led[3] <= ~led[3];
  221.                                                 end
  222.                                         default : state <= 0;
  223.                                         endcase
  224.                                 end
  225.                 end
  226. endmodule       
复制代码



tpl0102-ep.pdf

1.07 MB, 下载次数: 24, 下载积分: 黑币 -5

炼狱传奇-IIC之战.pdf

934.5 KB, 下载次数: 22, 下载积分: 黑币 -5

IIC.zip

232.27 KB, 下载次数: 30, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:15726 发表于 2020-9-13 19:31 | 只看该作者
学习一下IIC知识,感谢分享。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表