DAC芯片TLC5620-verilog代码.doc_第1页
DAC芯片TLC5620-verilog代码.doc_第2页
DAC芯片TLC5620-verilog代码.doc_第3页
DAC芯片TLC5620-verilog代码.doc_第4页
DAC芯片TLC5620-verilog代码.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

DAC芯片TLC5620 Verilog代码 TLC5620是TI公司的DA转换芯片,下面的代码实现的简单的DA转换功能。说明:数码管1显示通道, 数码管2显示RNG值,数码管3和4显示CODE值。按键1切换通道,按键2改变RNG值(0或1),按键3改变CODE值,按键4未使用。/* DAC11位数据输入说明:Bit10:9 通道选择00:CHA; 01:CHB; 10:CHC; 11:CHD Bit8 RNG 0:参考电压到地 1:两倍参考电压到地 Bit7:0 DAC转换代码,范围0255. 输出电压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; / 输入时钟50MHzinput rst_n; / 复位input sw1_n,sw2_n,sw3_n,sw4_n; / 按键output dac_clk; / DAC时钟 MAX=1MHzoutput dac_data; / DAC数据输出output dac_load; / 加载信号 / 电路图中LDAC已经接地,因此略去output 7:0 digit_o; / 数码管输出output 3:0 cs; / 数码管片选parameter DAC_Idle = 3b001, / 状态参数 DAC_Send = 3b010, DAC_Store = 3b100;/=parameter / 字模 MSK_0 = 8hC0, / 0 MSK_1 = 8hF9, / 1 MSK_2 = 8hA4, / 2 MSK_3 = 8hB0, / 3 MSK_4 = 8h99, / 4 MSK_5 = 8h92, / 5 MSK_6 = 8h82, / 6 MSK_7 = 8hF8, / 7 MSK_8 = 8h80, / 8 MSK_9 = 8h90, / 9 MSK_A = 8h88, / A MSK_B = 8h83, / B MSK_C = 8hC6, / C MSK_D = 8hA1, / D MSK_E = 8h86, / E MSK_F = 8h8E; / F/=/* 按键部分*/reg 3:0 key_rst; / 保存按键前一个状态always (posedge clk or negedge rst_n) if (!rst_n) key_rst = 4b1111; else key_rst = sw4_n,sw3_n,sw2_n,sw1_n;reg3:0 key_rst_r; / 保存按键下一个状态always (posedge clk or negedge rst_n) if (!rst_n) key_rst_r = 4b1111; else key_rst_r = key_rst;wire3:0 key_val = key_rst_r & (key_rst); / 检测是否有1到0跳变reg19:0 cnt; / 计数器always (posedge clk or negedge rst_n) if (!rst_n) cnt = 20d0; else if (key_val) / 有按键按下(由1变为0)计数器开始计时 20ms cnt = 20d0; else cnt = cnt + 1b1;/ 去抖动后的按键检测,仍然用两级寄存器 reg3:0 low_sw;always (posedge clk or negedge rst_n) if (!rst_n) low_sw = 4b1111; else if (cnt = 20hfffff) / 20ms后的按键状态锁存到low_sw中 low_sw = sw4_n,sw3_n,sw2_n,sw1_n; reg3:0 low_sw_r; always (posedge clk or negedge rst_n) if (!rst_n) low_sw_r = 4b1111; else low_sw_r = low_sw;wire3:0 led_ctrl = low_sw_r & (low_sw);reg 10:0 rData;always (posedge clk or negedge rst_n) if (!rst_n) rData = 11d255; else begin if (led_ctrl0 = 1) / S1键按下 rData10:9 = rData10:9 + 1b1; / 通道切换 if (led_ctrl1 = 1) / S2键按下 rData8 = rData8; / RNG位变化 if (led_ctrl2 = 1) / S3键按下 rData7:0 = rData7:0 + 8d8; / 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 = 6d0;div_clk = 1bz;endelse begin div_cnt = div_cnt + 1b1; if (div_cnt = 6d63) div_clk = 1b1; else div_clk = 1b0; 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 = 1b1;bit_cnt_rst = 1b0;next_state = DAC_Idle;case (current_state) DAC_Idle: begin bit_cnt_rst = 1b1; next_state = DAC_Send; / 空闲时直接进入send状态end DAC_Send: begin if (dat_send_done) / 数据发送完成 next_state = DAC_Store; else next_state = DAC_Send;endDAC_Store: begin bit_cnt_rst = 1b1; rDac_load = 1b0; / LOAD变低进行锁存 if (div_clk) next_state = DAC_Idle; else next_state = DAC_Store;endendcaseend/*/reg 4:0 bit_cnt; / 位计数器 对div_clk计数always (posedge clk or negedge rst_n) beginif (!rst_n) bit_cnt = 5d0;else if (bit_cnt_rst) bit_cnt = 5d0;else if (div_clk) bit_cnt = bit_cnt + 1b1;endassign dat_send_done = (bit_cnt = 5d24);/*/reg rDac_data;always (bit_cnt4:1 or rData) begincase (bit_cnt4:1) / 从高到低发送11位数据 4d1 : rDac_data = rData10; 4d2 : rDac_data = rData9; 4d3 : rDac_data = rData8; 4d4 : rDac_data = rData7; 4d5 : rDac_data = rData6; 4d6 : rDac_data = rData5; 4d7 : rDac_data = rData4; 4d8 : rDac_data = rData3; 4d9 : rDac_data = rData2; 4d10: rDac_data = rData1; 4d11: rDac_data = rData0; default : rDac_data = 2) & (bit_cnt 24) rDac_clk = bit_cnt0; / 在时钟下降沿数据要有效else rDac_clk = 1b0;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 = 17d0; / 计数器2置零 cs = 4b0111; endelse begin cnt2 = cnt2 + 1b1; / 计数器2开始计数 if (cnt2 = 17d0) / 溢出了,又从0开始 begin if (cs = 4b0111) begin cs = 4b1110; / 选择第四个数码管 submsk = rData3:0; / 显示CODE低4位 end else if (cs = 4b1110) begin cs = 4b1101; / 选择第三个数码管 submsk = rData7:4; / 显示CODE高4位 end else if (cs = 4b1101) begin cs = 4b1011; / 选择第二个数码管 submsk = 3b000,rData8; / 显示RNG值 end else if (cs = 4b1011) begin cs = 4b0111; / 选择第一个数码管 submsk = 2b00,rData10:9 + 1b1; / 显示通道 end end endreg 7:0 digit_o; / 数码管输出寄存器always (submsk)case (submsk) 4h0: digit_o = MSK_0; 4h1: digit_o = MSK_1; 4h2: digit_o = MSK_2; 4h3: digit_o = MSK_3; 4h4: digit_o = MSK_4; 4h5: digit_o = MSK_5; 4h6: digit_o = MSK_6; 4h

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论