DAC芯片TLC5620verilog代码.docx

上传人:b****8 文档编号:9783665 上传时间:2023-02-06 格式:DOCX 页数:9 大小:153.39KB
下载 相关 举报
DAC芯片TLC5620verilog代码.docx_第1页
第1页 / 共9页
DAC芯片TLC5620verilog代码.docx_第2页
第2页 / 共9页
DAC芯片TLC5620verilog代码.docx_第3页
第3页 / 共9页
DAC芯片TLC5620verilog代码.docx_第4页
第4页 / 共9页
DAC芯片TLC5620verilog代码.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

DAC芯片TLC5620verilog代码.docx

《DAC芯片TLC5620verilog代码.docx》由会员分享,可在线阅读,更多相关《DAC芯片TLC5620verilog代码.docx(9页珍藏版)》请在冰豆网上搜索。

DAC芯片TLC5620verilog代码.docx

DAC芯片TLC5620verilog代码

DAC芯片TLC5620-verilog代码

DAC芯片TLC5620Verilog代码

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]RNG0:

参考电压到地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;      //按键

  else

     low_sw_r<=low_sw;

wire[3:

0]led_ctrl=low_sw_r&(~low_sw);

reg[10:

0]rData;

always@(posedgeclkornegedgerst_n)

    if(!

rst_n)                                           

    rData<=11'd255;

  elsebegin                                                

   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@(posedgeclkornegedgerst_n)

if(!

rst_n)begin

    div_cnt<=6'd0;

div_clk<=1'bz;

end

elsebegin

        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@(posedgeclkornegedgerst_n)       //时序进程

if(!

rst_n)

    current_state<=DAC_Idle;

else

    current_state<=next_state;

always@(current_stateordiv_clkordat_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@(posedgeclkornegedgerst_n)begin

if(!

rst_n)

    bit_cnt<=5'd0;

elseif(bit_cnt_rst)

    bit_cnt<=5'd0;

elseif(div_clk)

    bit_cnt<=bit_cnt+1'b1;

end

assigndat_send_done=(bit_cnt==5'd24);

/*************************************************************************************************/

reg  rDac_data;

always@(bit_cnt[4:

1]orrData)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

/*************************************************************************************************/

assigndac_clk=rDac_clk;

assigndac_data=rDac_data;

assigndac_load=rDac_load;

/**************************************************************************************************/

/**************************************************************************************************

**数码管显示部分

**说明:

数码管1显示通道数码管2显示RNG值

**         数码管3和4显示CODE值

**************************************************************************************************/

reg   [3:

0]   cs;                                            //片选信号

reg   [16:

0]  cnt2;                                          //计数寄存器2,确定扫描间隔

reg   [3:

0]   submsk;                                        //保存要显示的数据

always@(posedgeclkornegedgerst_n)

if(!

rst_n)

     begin

    cnt2<=17'd0;                                       //计数器2置零

  cs   <=4'b0111;

  end

elsebegin

         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

         elseif(cs==4'b1110)

           begin     

           cs     <=4'b1101;                         //选择第三个数码管

        submsk<=rData[7:

4];        //显示CODE高4位

        end

               elseif(cs==4'b1101)    

                 begin

       cs    <=4'b1011;       //选择第二个数码管

     submsk<={3'b000,rData[8]};    //显示RNG值

     end

    elseif(cs==4'b1011)

     begin

       cs     <=4'b0111;          //选择第一个数码管

       submsk<={2'b00,rData[10:

9]}+1'b1;  //显示通道

     end

    end

  end

reg   [7:

0]   digit_o;                                       //数码管输出寄存器

always@(submsk)

case(submsk)

   4'h0:

      digit_o<=MSK_0;

   4'h1:

      digit_o<=MSK_1;

   4'h2:

      digit_o<=MSK_2;

   4'h3:

      digit_o<=MSK_3;

   4'h4:

      digit_o<=MSK_4;

   4'h5:

      digit_o<=MSK_5;

   4'h6:

      digit_o<=MSK_6;

   4'h7:

      digit_o<=MSK_7;

   4'h8:

      digit_o<=MSK_8;

   4'h9:

      digit_o<=MSK_9;

   4'hA:

      digit_o<=MSK_A;

   4'hB:

      digit_o<=MSK_B;

   4'hC:

      digit_o<=MSK_C;

   4'hD:

      digit_o<=MSK_D;

   4'hE:

      digit_o<=MSK_E;

   4'hF:

      digit_o<=MSK_F;

   default:

   digit_o<=MSK_8;

   endcase

endmodule

//End

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1