首页 DAC芯片TLC5620 verilog代码

DAC芯片TLC5620 verilog代码

举报
开通vip

DAC芯片TLC5620 verilog代码DAC芯片TLC5620 Verilog代码 TLC5620是TI公司的DA转换芯片, 下面的代码实现的简单的DA转换功能。 说明:数码管1显示通道, 数码管2显示RNG值,数码管3和4显示CODE值。按键1切换通道,按键2改变RNG值(0或1),按键3改变CODE值,按键4未使用。 /************************************************************************************************** ** DAC11位数据输入说...

DAC芯片TLC5620 verilog代码
DAC芯片TLC5620 Verilog代码 TLC5620是TI公司的DA转换芯片, 下面的代码实现的简单的DA转换功能。 说明:数码管1显示通道, 数码管2显示RNG值,数码管3和4显示CODE值。按键1切换通道,按键2改变RNG值(0或1),按键3改变CODE值,按键4未使用。 /************************************************************************************************** ** DAC11位数据输入说明:Bit[10:9] 通道选择00:CHA; 01:CHB; 10:CHC; 11:CHD Bit[8] RNG 0:参考电压到地 1:两倍参考电压到地 Bit[7:0] DAC转换代码,范围0~255. 输出电压Vo=REF*(CODE/256)*(1+RNG) **************************************************************************************************/ module       dac( clk, rst_n, dac_clk, dac_data, dac_load, sw1_n,sw2_n,sw3_n,sw4_n, digit_o, cs ); input    clk;            // 输入时钟50MHz input    rst_n;            // 复位 input    sw1_n,sw2_n,sw3_n,sw4_n;       // 按键 output    dac_clk;           // DAC时钟 MAX=1MHz output    dac_data;           // DAC数据输出 output    dac_load;           // 加载信号 // 电路图中LDAC已经接地,因此略去 output [7:0] digit_o;           // 数码管输出 output [3:0]   cs;             // 数码管片选 parameter   DAC_Idle = 3'b001,        // 状态参数 DAC_Send = 3'b010, DAC_Store = 3'b100; //================================================================================================= parameter                                                       // 字模 MSK_0       = 8'hC0,       // '0' MSK_1       = 8'hF9,       // '1' MSK_2       = 8'hA4,       // '2' MSK_3       = 8'hB0,       // '3' MSK_4       = 8'h99,       // '4' MSK_5       = 8'h92,       // '5' MSK_6       = 8'h82,       // '6' MSK_7       = 8'hF8,       // '7' MSK_8       = 8'h80,       // '8' MSK_9       = 8'h90,       // '9' MSK_A       = 8'h88,       // 'A' MSK_B       = 8'h83,       // 'B' MSK_C       = 8'hC6,       // 'C' MSK_D       = 8'hA1,       // 'D' MSK_E       = 8'h86,       // 'E' MSK_F       = 8'h8E;       // 'F' //================================================================================================= /************************************************************************************************** ** 按键部分 **************************************************************************************************/ reg [3:0] key_rst;                                             // 保存按键前一个状态 always @(posedge clk or negedge rst_n) if (!rst_n) key_rst <= 4'b1111; else key_rst <= {sw4_n,sw3_n,sw2_n,sw1_n}; reg[3:0] key_rst_r;                                        // 保存按键下一个状态 always @(posedge clk or negedge rst_n) if (!rst_n) key_rst_r <= 4'b1111; else key_rst_r <= key_rst; wire[3:0] key_val = key_rst_r & (~key_rst);              // 检测 工程第三方检测合同工程防雷检测合同植筋拉拔检测方案传感器技术课后答案检测机构通用要求培训 是否有1到0跳变 reg[19:0] cnt;                                             // 计数器 always @(posedge clk or negedge rst_n) if (!rst_n) cnt <= 20'd0; else if (key_val)                                      // 有按键按下(由1变为0)计数器开始计时 20ms cnt <= 20'd0; else cnt <= cnt + 1'b1; // 去抖动后的按键检测,仍然用两级寄存器 reg[3:0] low_sw; always @(posedge clk or negedge rst_n) if (!rst_n) low_sw <= 4'b1111; else if (cnt == 20'hfffff)                            // 20ms后的按键状态锁存到low_sw中 low_sw <= {sw4_n,sw3_n,sw2_n,sw1_n}; reg[3:0] low_sw_r; always @(posedge clk or negedge rst_n) if (!rst_n) low_sw_r <= 4'b1111; else low_sw_r <= low_sw; wire[3:0] led_ctrl = low_sw_r & (~low_sw); reg [10:0] rData; always @(posedge clk or negedge rst_n) if (!rst_n)                                            rData <= 11'd255; else begin                                                 if (led_ctrl[0] == 1)         // S1键按下 rData[10:9] <= rData[10:9] + 1'b1;     // 通道切换 if (led_ctrl[1] == 1)         // S2键按下 rData[8] <= ~rData[8];        // RNG位变化 if (led_ctrl[2] == 1)         // S3键按下 rData[7:0] <= rData[7:0] + 8'd8;              // CODE变化 end /*************************************************************************************************/ /************************************************************************************************** ** DAC控制部分 **************************************************************************************************/ reg [5:0]   div_cnt;           // 分频计数器 64分频 reg     div_clk;           // 分频时钟 注意不是DAC输入时钟 always @(posedge clk or negedge rst_n) if (!rst_n) begin div_cnt <= 6'd0; div_clk <= 1'bz; end else begin div_cnt <= div_cnt + 1'b1; if (div_cnt == 6'd63) div_clk <= 1'b1; else div_clk <= 1'b0; end /*************************************************************************************************/ reg [2:0]   current_state,next_state; reg     rDac_load; reg     bit_cnt_rst;          // 位计数器复位信号 wire    dat_send_done; always @(posedge clk or negedge rst_n)        // 时序进程 if (!rst_n) current_state <= DAC_Idle; else current_state <= next_state; always @(current_state or div_clk or dat_send_done) begin   // 组合进程 rDac_load   <= 1'b1; bit_cnt_rst <= 1'b0; next_state <= DAC_Idle; case (current_state) DAC_Idle: begin bit_cnt_rst <= 1'b1; next_state <= DAC_Send;             // 空闲时直接进入send状态 end DAC_Send: begin if (dat_send_done)           // 数据发送完成 next_state <= DAC_Store; else next_state <= DAC_Send; end DAC_Store: begin bit_cnt_rst <= 1'b1; rDac_load   <= 1'b0;           // LOAD变低进行锁存 if (div_clk) next_state <= DAC_Idle; else next_state <= DAC_Store; end endcase end /*************************************************************************************************/ reg [4:0] bit_cnt;            // 位计数器 对div_clk计数 always @(posedge clk or negedge rst_n) begin if (!rst_n) bit_cnt <= 5'd0; else if (bit_cnt_rst) bit_cnt <= 5'd0; else if (div_clk) bit_cnt <= bit_cnt + 1'b1; end assign dat_send_done = (bit_cnt == 5'd24); /*************************************************************************************************/ reg   rDac_data; always @(bit_cnt[4:1] or rData) begin case (bit_cnt[4:1])             // 从高到低发送11位数据 4'd1 : rDac_data <= rData[10]; 4'd2 : rDac_data <= rData[9]; 4'd3 : rDac_data <= rData[8]; 4'd4 : rDac_data <= rData[7]; 4'd5 : rDac_data <= rData[6]; 4'd6 : rDac_data <= rData[5]; 4'd7 : rDac_data <= rData[4]; 4'd8 : rDac_data <= rData[3]; 4'd9 : rDac_data <= rData[2]; 4'd10: rDac_data <= rData[1]; 4'd11: rDac_data <= rData[0]; default : rDac_data <= 1'b0; endcase end /*************************************************************************************************/ reg   rDac_clk; always @(bit_cnt) begin            // DAC_CLK输出时钟的产生 period=2560ns if ((bit_cnt >= 2) && (bit_cnt <24)) rDac_clk <= ~bit_cnt[0];          // 在时钟下降沿数据要有效 else rDac_clk <= 1'b0; end /*************************************************************************************************/ assign dac_clk = rDac_clk; assign dac_data = rDac_data; assign dac_load = rDac_load; /**************************************************************************************************/ /************************************************************************************************** ** 数码管显示部分 ** 说明:数码管1显示通道 数码管2显示RNG值 **          数码管3和4显示CODE值 **************************************************************************************************/ reg    [3:0]    cs;                                             // 片选信号 reg    [16:0]   cnt2;                                           // 计数寄存器2,确定扫描间隔 reg    [3:0]    submsk;                                         // 保存要显示的数据 always @(posedge clk or negedge rst_n) if (!rst_n) begin cnt2 <= 17'd0;                                        // 计数器2置零 cs    <= 4'b0111; end else begin cnt2 <= cnt2 + 1'b1;                                // 计数器2开始计数 if (cnt2 == 17'd0)                                   // 溢出了,又从0开始   begin if (cs == 4'b0111) begin cs      <= 4'b1110;                          // 选择第四个数码管 submsk <= rData[3:0];                       // 显示CODE低4位 end else if (cs == 4'b1110) begin      cs      <= 4'b1101;                          // 选择第三个数码管 submsk <= rData[7:4];         // 显示CODE高4位 end else if (cs == 4'b1101)     begin cs     <= 4'b1011;        // 选择第二个数码管 submsk <= {3'b000,rData[8]};     // 显示RNG值 end else if (cs == 4'b1011) begin cs      <= 4'b0111;            // 选择第一个数码管 submsk <= {2'b00,rData[10:9]} + 1'b1;   // 显示通道 end end end 继续阅读
本文档为【DAC芯片TLC5620 verilog代码】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_654168
暂无简介~
格式:doc
大小:27KB
软件:Word
页数:11
分类:互联网
上传时间:2019-02-20
浏览量:21