搜索
bottom↓
回复: 3

德州da芯片tlv5618(12位串行输入,双通道输出) 的verilog代码

[复制链接]

出0入0汤圆

发表于 2011-12-20 10:19:28 | 显示全部楼层 |阅读模式
//大学时候写的,虽然很简单但是还是拿出来晒一下
/*/////////////////////////////////////////////////////////////
德州da芯片tlv5618(12位串行输入,双通道输出) 的verilog代码,
/////////////////////////////////////////////////////////////*/
module tlv5618(
sys_clk,       //系统时钟50M
da_rest,        //复位端
da_start,      //转换控制端
da_bus,         //da数据总线
/*输出端*/
da_out,        //接da串行数据输入端
da_clk,        //接da时钟输入端
da_cs          //接da片选输入端
);
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
input sys_clk,da_rest,da_start;
input [11:0]da_bus;
output da_out,da_clk,da_cs;

parameter idle=3'b001;
parameter load_d=3'b010;
parameter send=3'b100;
reg da_cs;
reg shift;
reg clear;
reg load;
reg [2:0] state;
reg [2:0] next_state;
reg [5:0] bit_counter;
reg [15:0] data_shfreg;
reg  da_clk_en;       
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////                                       
assign da_out=data_shfreg[15];
assign da_clk=da_clk_en?sys_clk:0;

reg[2:0]        da_start_reg;

always @ ( posedge sys_clk or negedge da_rest )  
   if(!da_rest)                                    
                da_start_reg <= 3'b000;
        else
                da_start_reg <= {da_start_reg[1:0],da_start};                           

wire                da_start_en;               
assign        da_start_en = ( da_start_reg[2:1] == 2'b01 ) ;

always@(state or bit_counter or da_start_en)
begin
load=0;
shift=0;

next_state=state;
case(state)
idle:   
            if(da_start_en==1)
                                        begin
                                                da_clk_en=0;
                                                da_cs=1;
                                                next_state=load_d;
                                        end
                                else
                                   begin
                                                da_clk_en=0;
                                                da_cs=1;
                                                next_state=idle;
                                        end
load_d:        
               begin
                                                load=1;
                                                da_cs=0;
                                               
                                                next_state=send;
                                        end
send:   
         if(bit_counter<=15)
              begin
                                                da_clk_en=1;
                                                shift=1;
                                  end
                        else
                                begin
                                        da_cs=1;
                                        da_clk_en=0;
                                        next_state=idle;
                                end
default next_state=idle;
endcase
end

always @(posedge sys_clk or negedge da_rest)
if(!da_rest)state<=idle;else state <=next_state;

always @(posedge sys_clk or negedge da_rest)
begin
        if(!da_rest)
                begin
                        data_shfreg<=0;
                        bit_counter<=0;
                end
        else
                begin
                        if(load)
                                begin
                                        data_shfreg<={4'b0100,da_bus[11:0]};
                                        bit_counter<=0;
                                end
         if(shift)
                                begin
                                        bit_counter<=bit_counter+1;
                                        data_shfreg<={data_shfreg[14:0],1'b0};
                                end
                end
end
endmodule

出0入0汤圆

发表于 2013-3-12 20:49:34 | 显示全部楼层
楼主辛苦了,有没有测试呀

出0入0汤圆

发表于 2013-7-19 23:10:18 | 显示全部楼层
楼主好棒

出0入0汤圆

发表于 2019-11-6 23:16:21 | 显示全部楼层
感觉你的代码风格,和我类似,但是和厂家模块里的还是不太一样。
如何去换行,空格等等
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-9 03:01

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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