ModelSim是Model Technology(Mentor Graphics的子公司)的HDL硬件描述語(yǔ)言的仿真軟件。該軟件可以用來實(shí)現(xiàn)對(duì)設(shè)計(jì)的VHDL、Verilog HDL 或是兩種語(yǔ)言混合的程序進(jìn)行仿真。這里的仿真是對(duì)設(shè)計(jì)進(jìn)行功能仿真(也稱之為前仿真),其目的是驗(yàn)證電路功能是否符合設(shè)計(jì)要求。
本篇主要是對(duì)I2C_Controller模塊進(jìn)行功能仿真。test_bench的核心是模擬FPGA給出數(shù)據(jù)24'h729803,同時(shí)也模擬I2C外設(shè)來接收該數(shù)據(jù)并給出應(yīng)答反饋。

1. 首先用Quartus打開HDMI_block_move工程(HDMI_block_move工程下載鏈接:https://pan.baidu.com/s/1XxFFj-3UTfB_Er-yz0f_Cg提取碼: tera),然后在該工程路徑下新建一個(gè)Verilog test bench仿真文件。右擊File——New, 選擇Verilog HDL File,然后點(diǎn)擊OK:

2. 將下面代碼拷貝到新建的.v文件當(dāng)中:
`timescale 1ns/1ps module tb_I2C_Controller(); // 輸出信號(hào)定義 regCLOCK; reg [23:0]I2C_DATA; regGO; regRESET; // 雙向信號(hào)定義(I2C_SDAT需要上拉電阻模擬總線特性) wireI2C_SDAT; reg sdat_drive; // 用于模擬從機(jī)應(yīng)答的驅(qū)動(dòng)信號(hào) // 輸入信號(hào)定義 wireI2C_SCLK; wireEND; wireACK; // 上拉電阻模擬(I2C總線默認(rèn)高電平) assignI2C_SDAT=sdat_drive?1'bz :1'b0; // 例化被測(cè)試模塊 I2C_Controlleruut ( .CLOCK(CLOCK), .I2C_DATA(I2C_DATA), .GO(GO), .RESET(RESET), .I2C_SDAT(I2C_SDAT), .I2C_SCLK(I2C_SCLK), .END(END), .ACK(ACK) ); reg [7:0] cnt_I2Cclk; // 時(shí)鐘生成(100MHz,周期10ns) initial begin CLOCK=0; forever #5CLOCK=~CLOCK; end // 主仿真過程 initial begin // 初始化信號(hào) I2C_DATA=24'h729803; // 待寫入的目標(biāo)數(shù)據(jù) GO=0; RESET=0; sdat_drive=1; // 初始釋放總線(上拉為高) // 復(fù)位過程 #20RESET=1; // 20ns后釋放復(fù)位 // 等待模塊進(jìn)入空閑狀態(tài) #50; // 啟動(dòng)I2C寫入過程 GO=1; #10GO=0; // 提供一個(gè)時(shí)鐘周期的GO脈沖 cnt_I2Cclk=0; // 模擬從機(jī)應(yīng)答(在每個(gè)字節(jié)傳輸?shù)牡?個(gè)時(shí)鐘周期拉低SDA) // 監(jiān)控時(shí)鐘線,在需要應(yīng)答時(shí)拉低SDA forever @(negedgeI2C_SCLK) begin cnt_I2Cclk<=?cnt_I2Cclk?+1?; ? ??if?(cnt_I2Cclk?==?29) begin ? ? ??$stop; ? ? end ? ??if?(uut.CNT?==?8) begin ?// 第9位傳輸時(shí) ? ? ? sdat_drive?=?0; ?// 產(chǎn)生應(yīng)答信號(hào)(低電平) ? ? end? ? ??else?begin ? ? ? sdat_drive?=?1; ?// 其他時(shí)間釋放總線 ? ? end ? end ? ? ? ? end endmodule
3. 點(diǎn)擊Save按鈕,將文件保存為tb_I2C_Controller.v。
4. 安裝Quartus軟件的時(shí)候也記得安裝Modelsim 工具(這些安裝步驟在后期文章里面會(huì)發(fā)布),接下來要將Modelsim 的安裝路徑設(shè)置一下就才可以在仿真時(shí)自動(dòng)調(diào)用指定的仿真工具。首先是在Tools菜單下面找到Options:

5. 在彈出的對(duì)話框中選擇EDA Tool Options ,點(diǎn)擊...指定軟件路徑: D:intelFPGA_lite17.1modelsim_asewin32aloem:

6. 接下來設(shè)置仿真文件路徑。點(diǎn)擊Assignments——Settings:

7. 點(diǎn)擊 Simulation,仿真工具選擇ModelSim-Altera, 然后點(diǎn)選Compile test bench圓圈,點(diǎn)擊Test Benches...

8. 點(diǎn)擊New...

9. 然后填寫Test bench name 名稱為tb_I2C_Controller,接著點(diǎn)擊File name處對(duì)應(yīng)的...按鈕:

10. 選擇tb_I2C_Controller.v文件,然后點(diǎn)擊Open:

11. 接著點(diǎn)擊Add將仿真文件添加到Test Bench,依次點(diǎn)擊OK、OK、Apply和 OK退出窗口:



12. 在仿真之前要先點(diǎn)擊Start Analysis&Synthesis按鈕進(jìn)行分析和綜合:

13. 再點(diǎn)擊Tools——Run Simulation Tool_RTL Simulation進(jìn)行仿真:

14. 點(diǎn)擊Zoom Full按鈕將顯示全部波形。

15. 最后波形生成如下:

通過波形可以看到,用于觸發(fā)I2C寫操作的GO信號(hào)拉高一個(gè)時(shí)鐘周期后,I2C開始寫數(shù)據(jù)的操作?,F(xiàn)在要寫的數(shù)據(jù)是24'h729803,二進(jìn)制是0111_0010_1001_1000_0000_0011, 將波形放大分三段截圖將看到如下內(nèi)容:



數(shù)據(jù)發(fā)送的狀態(tài)循環(huán)是ST=2 → ST=3 → ST=4 → ST=5 → ST=2,這個(gè)循環(huán)發(fā)送1位數(shù)據(jù),共循環(huán)9次(8位數(shù)據(jù)+ACK),第9位(1'b1)是確保在第9個(gè)時(shí)鐘周期主機(jī)釋放SDA總線。
-
FPGA
+關(guān)注
關(guān)注
1660文章
22412瀏覽量
636357 -
I2C
+關(guān)注
關(guān)注
28文章
1556瀏覽量
131242 -
ModelSim
+關(guān)注
關(guān)注
5文章
175瀏覽量
49289 -
仿真軟件
+關(guān)注
關(guān)注
21文章
281瀏覽量
31848
原文標(biāo)題:6-DE10-Nano的HDMI方塊移動(dòng)案例——使用Modelsim仿真I2C控制器
文章出處:【微信號(hào):友晶FPGA,微信公眾號(hào):友晶FPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
基于FPGA的I2C SLAVE模式總線的設(shè)計(jì)方案
新手求助,I2C總線從機(jī)的應(yīng)答信號(hào)不能用modelsim仿真出?
實(shí)現(xiàn)I2C總線控制器的VHDL源代碼
LM3S系列微控制器I2C應(yīng)用文檔
基于Verilog的I2C控制器的設(shè)計(jì)與綜合
I2C總線控制器的工作原理及EEPROM的Linux驅(qū)動(dòng)程序的設(shè)計(jì)
淺談PCA9564 I2C 總線控制器評(píng)估板
硬件I2C與模擬I2C
Linux I2C驅(qū)動(dòng)入門知識(shí)科普
I2C控制器驅(qū)動(dòng)介紹
I2C子系統(tǒng)SW Architecture
如何使用Modelsim仿真I2C控制器
評(píng)論