?? signal.v
字號:
/****************************************************************************
模塊名稱:Signal 文件名:signal.v
模塊功能:用于產(chǎn)生測試信號,對所設(shè)計的EEPROM_WR模塊進(jìn)行測試。Signal模塊
能對被測試模塊產(chǎn)生的ack信號產(chǎn)生響應(yīng),發(fā)出模仿MCU的數(shù)據(jù)、地址信號
和讀/寫信號。被測試的模塊在接收到信號后會發(fā)出寫/讀EEPROM虛擬模塊
的信號。
模塊說明:本模塊為行為模塊,不可綜合為門級網(wǎng)表。而且本模塊為教學(xué)目的做了許
多簡化,功能不完整,不能用做商業(yè)目的。
****************************************************************************/
// 信號源模型:
`timescale 1ns/1ns
`define timeslice1 200
`define CheckByteNum 16
module Signal(RESET,CLK,RD,WR,ADDR,ACK,DATA);
output RESET; //復(fù)位信號
output CLK; //時鐘信號
output RD,WR; //讀寫信號
output[10:0] ADDR; //11位地址信號
input ACK; //讀寫周期的應(yīng)答信號
inout[7:0] DATA; //數(shù)據(jù)線
reg RESET;
reg CLK;
reg RD,WR;
reg W_R; //低位:寫操作;高位:讀操作
reg[10:0] ADDR;
reg[7:0] data_to_eeprom;
reg[10:0] addr_mem[0:255];
reg[7:0] data_mem[0:255];
reg[7:0] ROM[0:2047];
integer i,j;
integer OUTFILE;
assign DATA = (W_R) ? 8'bz : data_to_eeprom ;
//------------------------------------時鐘信號輸入------------------------------
always #(`timeslice1/2)
CLK = ~CLK;
//----------------------------------- 讀寫信號輸入------------------------------
initial
begin
RESET = 1;
i = 0;
j =0;
W_R = 0;
CLK = 0;
RD = 0;
WR = 0;
#1000 ;
RESET = 0;
repeat(`CheckByteNum) //連續(xù)寫15次數(shù)據(jù),調(diào)試成功后可以增加到全部地址覆蓋測試
begin
# (5 * `timeslice1);
WR = 1;
# (`timeslice1);
WR = 0;
@ (posedge ACK); //EEPROM_WR轉(zhuǎn)換模塊請求寫數(shù)據(jù)
end
#(10 * `timeslice1);
W_R = 1; //開始讀操作
repeat(`CheckByteNum) //連續(xù)讀15次數(shù)據(jù)
begin
# (5 * `timeslice1);
RD = 1;
# ( `timeslice1 );
RD = 0;
@ (posedge ACK); //EEPROM_WR轉(zhuǎn)換模塊請求讀數(shù)據(jù)
end
end
//-----------------------------------------寫操作-----------------------------
initial
begin
$display("writing-----writing-----writing-----writing");
# (2*`timeslice1);
for(i=0;i<=`CheckByteNum-1;i=i+1)
begin
ADDR = addr_mem[i]; //輸出寫操作的地址
data_to_eeprom = data_mem[i]; //輸出需要轉(zhuǎn)換的平行數(shù)據(jù)
$fdisplay(OUTFILE,"@%0h %0h",ADDR, data_to_eeprom);
//把輸出的地址和數(shù)據(jù)記錄在已經(jīng)打開的eeprom.dat文件中
@(posedge ACK) ; //EEPROM_WR轉(zhuǎn)換模塊請求寫數(shù)據(jù)
end
end
//----------------------------------------讀操作----------------------------
initial
@(posedge W_R)
begin
ADDR = addr_mem[0];
$fclose (OUTFILE); //關(guān)閉已經(jīng)打開的eeprom.dat文件
$readmemh("./eeprom.dat",ROM); //把數(shù)據(jù)文件的數(shù)據(jù)讀到ROM中
$display("Begin READING-----READING-----READING-----READING");
for(j = 0; j <=`CheckByteNum; j = j+1) // 檢查的寫到eeprom中的字節(jié)是否正確,先檢查15個字節(jié)
begin
ADDR = addr_mem[j];
if (j<=15)
begin
@(posedge ACK);
if(DATA == ROM[ADDR]) //比較并顯示發(fā)送的數(shù)據(jù)和接收到的數(shù)據(jù)是否一致
$display("DATA %0h == ROM[%0h]---READ RIGHT",DATA,ADDR);
else
$display("DATA %0h != ROM[%0h]---READ WRONG",DATA,ADDR);
end
else
$display ("All the bytes written in eeprom have been checked!!");
end
$stop;
end
initial
begin
OUTFILE = $fopen("./eeprom.dat"); // 打開一個名為eeprom.dat的文件備用
$readmemh("./addr.dat",addr_mem); // 把地址數(shù)據(jù)存入地址存儲器
$readmemh("./data.dat",data_mem); // 把準(zhǔn)備寫入EEPROM的數(shù)據(jù)存入數(shù)據(jù)存儲器
end
endmodule
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -