sanmulouzhu 发表于 2011-12-20 10:19:28

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

//大学时候写的,虽然很简单但是还是拿出来晒一下
/*/////////////////////////////////////////////////////////////
德州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 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 state;
reg next_state;
reg bit_counter;
reg data_shfreg;
regda_clk_en;       
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////                                       
assign da_out=data_shfreg;
assign da_clk=da_clk_en?sys_clk:0;

reg        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,da_start};                           

wire                da_start_en;               
assign        da_start_en = ( da_start_reg == 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};
                                        bit_counter<=0;
                                end
         if(shift)
                                begin
                                        bit_counter<=bit_counter+1;
                                        data_shfreg<={data_shfreg,1'b0};
                                end
                end
end
endmodule

looke2 发表于 2013-3-12 20:49:34

楼主辛苦了,有没有测试呀

李宇轩 发表于 2013-7-19 23:10:18

楼主好棒

pengyuan0820 发表于 2019-11-6 23:16:21

感觉你的代码风格,和我类似,但是和厂家模块里的还是不太一样。
如何去换行,空格等等
页: [1]
查看完整版本: 德州da芯片tlv5618(12位串行输入,双通道输出) 的verilog代码