|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
問一個Verilog語法方面的問題?想不通了。。。。。。。。。 |
| 作者:wag 欄目:EDA技術(shù) |
請大蝦看看就是下面這點東西: 設(shè)計意圖是address=0x02讀入16位的低8位address=0x03讀入高8位同時合并輸出給數(shù)據(jù)總線data,address=0初始化總線允許讀,address=其他允許總線寫,在發(fā)送address=0x02和0x03前必須先允許寫。下面是相關(guān)代碼: always @(posedge clk) //寫入 begin case (address) 8'h01 : begin we=0; end 8'h02 : begin TEMP=databus; end 8'h03 : begin addr=addr+1; data={databus,TEMP}; end default : begin we=1; //TEMP=0; //問題就在這里加這條語句和不加得到不同的答案 addr=0; data=0; end endcase 我現(xiàn)在就對點被case模塊感到不清楚了,我仿真的感覺是模塊執(zhí)行的條件很亂,不是我認(rèn)為address=0x03就執(zhí)行 8'h03 : begin addr=addr+1; data={databus,TEMP}; end 是否還執(zhí)行了其他的呢?不懂,真的有點不懂? |
| 2樓: | >>參與討論 |
| 作者: canoeheu 于 2005/5/23 20:56:00 發(fā)布:
什么亂東東?? 建議你先找本書來看看,不但要知道基本語法還要知道實際的電路和語言之間有什么聯(lián)系。你的思維太亂了 |
|
| 3樓: | >>參與討論 |
| 作者: greenskie 于 2005/5/24 20:43:00 發(fā)布:
你的代碼經(jīng)過編譯器編譯已經(jīng)不是你想實現(xiàn)的電路了 我給你說兩個有關(guān)case segment的使用的問題: 第一,如果你沒有對default進行定義,那么在case中使用的寄存器將變成鎖存器輸出,而不是簡單的組合邏輯電路。 第二,你定義了default的情況下的電路實現(xiàn),但是在某種情況下,你對某些變量沒有做處理,編譯器將會把這個變量當(dāng)作鎖存器(latch)輸出,這正好可以解決default情形中的加TEMP=0和不加TEMP=0的區(qū)別,當(dāng)你在default中加了TEMP=0以后,那么在default情形下TEMP=0,沒加的情形就是TEMP保持先前一個狀態(tài)不變。 像你的address=0x03的情形由于we這個變量沒有在此情況下以及address=0x02和default情況下賦一個確定的值,編譯器就會把we當(dāng)成鎖存器,因此,在執(zhí)行address=0x03這種情況時,we仍然保持先前一個狀態(tài)的值,如果先前一個狀態(tài)we=0,那么你就沒有辦法將數(shù)據(jù)給data. 這只是我的理解,希望對你有幫助。 |
|
| 4樓: | >>參與討論 |
| 作者: WAG 于 2005/5/24 21:30:00 發(fā)布:
很感謝greenskie!再琢磨琢磨你的意見,,謝謝! |
|
| 5樓: | >>參與討論 |
| 作者: WAG 于 2005/5/24 21:42:00 發(fā)布:
對,你說得真確,Verilog語法應(yīng)該這樣,是我理解的問題? 問題應(yīng)該出在10K10 EAB的讀寫上,請看下面的內(nèi)容(我的這個帖子,圖片在這個帖子中有): “一個很沒有道理的程序Verilog,10K10 EAB的異步讀寫,附圖和Code!” //========================================================== 程序說明,以下是我寫的EAB讀寫完整的程序,程序的確很亂,不過通過了仿真,可是很多東西我自己都不明白為什么,如果哪位DX有時間可以仿真看看。 以下是不明白的地方: 這里我有兩個問題想先請教: 問題1: 為什么可以初始化addr而不能初始化data(最后的default分支也一樣) 8'h00 : begin we=1; addr=0; //data=0; end 問題2: 假如我把下面的分支從case分支中刪除,仿真結(jié)果也不一樣,我就不知道為什么,我看了verilog的語法是否這樣是沒有問題的,那究竟為什么呢? 8'h09: begin d3=bus_data; end //========================================================================== MODULE a (wr,bus422,bus_addr,bus_data,q,a1,a2,a3,led,d1,d2,d3); input wr; input [5:0] bus422; input [7:0] bus_addr; OUTPUT [15:0] q; OUTPUT [7:0] a1,a2,a3; OUTPUT led; OUTPUT [7:0] d1,d2,d3; input [7:0] bus_data; reg [7:0] TEMP; reg [15:0] data; wire [5:0] address; reg [5:0] addr; reg we; reg [7:0] a1,a2,a3; reg [7:0] d1,d2,d3; reg led; reg ab; assign address=we?addr:bus422; //讀出 lpm_ram_dq lpm_ram_dq_component (.address (address),.data (data),.we (we),.q (q)); defparam lpm_ram_dq_component.lpm_width = 16, lpm_ram_dq_component.lpm_widthad = 6, lpm_ram_dq_component.lpm_indata = "UNREGISTERED", lpm_ram_dq_component.lpm_address_control = "UNREGISTERED", lpm_ram_dq_component.lpm_outdata = "UNREGISTERED", lpm_ram_dq_component.lpm_hint = "USE_EAB=ON"; always @(posedge wr) //寫入 begin case (bus_addr) 8'h00 : begin we<=1; addr<=0; //data<=0; end 8'h01: begin led<=~led; end 8'h02 : begin TEMP<=bus_data; addr<=addr+1; end 8'h03 : begin data<={bus_data,TEMP}; //從單元1開始 end 8'h04: begin a1<=bus_data;ab=0; end 8'h05: begin a2<=bus_data;ab=1; end   |
|
| 6樓: | >>參與討論 |
| 作者: wag 于 2005/5/25 16:26:00 發(fā)布:
其實最關(guān)鍵的東西是,我在ALTERA公司上沒有找到EAB異步讀寫的時序 資料上只有異步讀寫不使用輸入寄存器的情況,但是使用了的就沒有. |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |