cmfjxga的个人空间 https://blog.eetop.cn/397280 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

ADC tirm 8bit

已有 24 次阅读| 2021-3-30 11:26 |系统分类:芯片设计

// verilogA for mu2803_cmf, adc_8bit, veriloga

`include "constants.vams"

`include "disciplines.vams"

`define MSB 7

`define LSB 0

`define MMASK 1

`define FULLSCALE (1<<(`MSB+1))


module adc_8bit(vd, vclk, vinp, vinn);  

output     [`MSB:`LSB] vd;  

electrical [`MSB:`LSB] vd;  

input      vclk;  

electrical vclk;  

input      vinp;  

electrical vinp;  

input      vinn;  

electrical vinn;  

parameter real    trise    = 1n from [0:inf);  

parameter real    tfall    = 1n from [0:inf);  

parameter real    tdel     = 0  from [0:inf);  

parameter real    vhi      = 3;  

parameter real    vlo      = 0;  

parameter real    vth      = 1.5;  

parameter real    vref     = 1.0;  

parameter integer bipolar  = 0 from [0:1];  

parameter integer sedge    = 1 from [-1:1];  

parameter integer freeRun  = 0 from [0:1];  

integer vid[`MSB:`LSB];  

integer i;  

integer digval;  

integer fullscale;  

integer index;  

real    lsb;  

real    digMin;  

real    digMax;  

real    vlsb [0: `FULLSCALE];  

real    vinint;  


Analog begin    

@(initial_step) begin      

fullscale = `FULLSCALE;       

lsb       = vref/fullscale;      


if (bipolar) begin        

digMin = -fullscale/2;        

digMax = (fullscale/2 - 1);      

end

else begin        

digMin = 0.0;        

digMax = (fullscale - 1);      

end // if bipolar      

vlsb[0] = digMin*lsb-0.5*lsb;      

for (i=1; i<=`FULLSCALE; i=i+1)        

vlsb[i] = vlsb[i-1] + lsb;    

end    


if (V(vinp,vinn) >= vref ) vinint = V(vinp,vinn) - vref;   

if (V(vinp,vinn) >= 0) vinint = V(vinp,vinn);    

else vinint = 128 - V(vinp,vinn);    

if(analysis("static", "pss")) begin      

digval = max(min(floor((vinint+0.5*lsb)/lsb), digMax), digMin);     

for (i = `MSB; i >= `LSB ; i = i - 1)         

vid[i]  =  ( ( digval  &  (`MMASK << i) ) == 0 ) ? vlo : vhi ;   

end    

index  = max(min(floor((vinint - digMin*lsb)/lsb), `FULLSCALE-1), 0);   

@(   cross((1-freeRun)*(V(vclk)       -  vth           ), sedge, 1n, 0.01*lsb)      

or cross(100*freeRun*(vinint - (vlsb[index+1]        )), +1  , 1n, 0.01*lsb)      

or cross(100*freeRun*(vinint - (vlsb[index+1]-lsb*0.5)),  0  , 1n, 0.01*lsb)       

or cross(100*freeRun*(vinint - (vlsb[index+0]        )), -1  , 1n, 0.01*lsb)      

) begin      


digval = max(min(floor((vinint+0.5*lsb)/lsb), digMax), digMin);     

for (i = `MSB; i >= `LSB ; i = i - 1)         

vid[i]  =  ( ( digval  &  (`MMASK << i) ) == 0 ) ? vlo : vhi ;    

end         


generate i (`MSB , `LSB)       

V(vd[i]) <+ transition( vid[i], tdel, trise, tfall );  

end

endmodule


点赞

全部作者的其他最新日志

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 1

    关注
  • 1

    粉丝
  • 2

    好友
  • 0

    获赞
  • 10

    评论
  • 398

    访问数
关闭

站长推荐 上一条 /1 下一条


小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-1-17 00:14 , Processed in 0.013490 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部