?? adc.v
字號:
//-------------------- adc.v ------------------------
module adc (nconvst, nbusy, data);
input nconvst; // A/D 啟動脈沖ST,即上圖中
output nbusy; // A/D 工作標志,即上圖中
output data; // 數據總線,從AD.DATA文件中讀取數據后經端口輸出
reg[7:0] databuf,i; // 內部寄存器
reg nbusy;
wire[7:0] data;
reg[7:0] data_mem[0:255];
reg link_bus;
integer tconv,
t5,
t8,
t9,
t12;
integer wideth1,
wideth2,
wideth;
//時間參數定義(依據AD7886手冊):
always @(negedge nconvst)
begin
tconv =9500+{$random}%500; //(type 950, max 1000)Conversion Time
t5 ={$random}%1000; //(max 100) CONVST to BUSY Propagation Dlay
// CL = 10pf
t8 = 200; //(min 20) CL=20pf Data Setup Time Prior to BUSY
//(min 10) CL=100pf
t9 = 100+{$random}%900; //(min 10, max 100) Bus Relinquish Time After CONVST
t12 = 2500; //(type) BUSY High to CONVST Low, SHA Acquisition Time
end
initial
begin
$readmemh("adc.data",data_mem); //從數據文件adc.data中讀取數據
i = 0;
nbusy = 1;
link_bus = 0;
end
assign data = link_bus? databuf:8'bzz; //三態總線
/*----------------------------------------------------------------------------
在信號nconvst的負跳降沿到來后,隔t5秒nbusy信號置為低,tconv是AD將模擬信號轉換為數字信號的時間,在信號nconvst的正跳降沿到來后經過tconv時間后,輸出nbusy信號變為高。
---------------------------------------------------------------------------*/
always @(negedge nconvst)
fork
#t5 nbusy =0;
@(posedge nconvst)
begin
#tconv nbusy=1;
end
join
/*--------------------------------------------------------------------------
nconvst信號的下降沿觸發,經過t9 延時后,把數據總線輸出關閉置為高阻態,如圖示。
nconvst信號的上升沿到來后,經過(tconv - t8)時間,輸出一個字節(8位數據)到databuf,該數據來自于data_mem。而data_mem中的數據是初始化時從數據文件AD.DATA中讀取的。此時應啟動總線的三態輸出。
---------------------------------------------------------------------------*/
always @(negedge nconvst)
begin
@(posedge nconvst)
begin
#(tconv-t8) databuf=data_mem[i];
end
if(wideth <10000 && wideth>500)
begin
if(i==255) i=0;
else i=i+1;
end
else i = i;
end
//在模數轉換期間關閉三態輸出,轉換結束時啟動三態輸出
always @(negedge nconvst)
fork
#t9 link_bus = 1'b0; //關閉三態輸出,不允許總線輸出
@(posedge nconvst)
begin
#(tconv-t8) link_bus=1'b1;
end
join
/*------------------------------------------------------------------------
當nconvst輸入信號的下一個轉換的下降沿與nbusy信號上升沿之間時間延遲小于t12時,
將會出現警告信息,通知設計者請求轉換的輸入信號頻率太快,A/D器件轉換速度跟不上。
仿真模型不僅能夠實現硬件電路的輸出功能,同時能夠對輸入信號進行檢測,
當輸入信號不符合手冊要求時,顯示警告信息。
-------------------------------------------------------------------------*/
// 檢查A/D啟動信號的頻率是否太快
always @(posedge nbusy)
begin
#t12;
if (!nconvst)
begin
$display("Warning! SHA Acquisition Time is too short!");
end
// else $display(" SHA Acquisition Time is enough! ");
end
// 檢查A/D啟動信號的負脈沖寬度是否足夠和太寬
always @(negedge nconvst)
begin
wideth=$time;
@(posedge nconvst) wideth=$time-wideth;
if (wideth<=500 || wideth > 10000)
begin
$display("nCONVST Pulse Width = %d",wideth);
$display("Warning! nCONVST Pulse Width is too narrow or too wide!");
//$stop;
end
end
endmodule
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -