Verilog HDL 訓練】第 03 天">【Verilog HDL 訓練】第 03 天
1116
2025-04-01
存儲器。
1. rom,ram,flash,ddr,sram,dram,mram..列舉并解釋一下這些名詞。
2. 用verilog實現一個深度為16,位寬8bit的單端口SRAM。搭建一個仿真環境,完成初始化,讀取,寫入的操作。
3. 接第2題,如果同時對一個地址進行讀和寫操作,會怎樣?實際中應該如何處理?
4. 使用單端口SRAM構造一個雙端口同步FIFO。
解答:
1. rom,ram,flash,ddr,sram,dram,mram..列舉并解釋一下這些名詞。
ROM、PROM、EPROM、EEPROM、RAM、SRAM、DRAM的區別
ROM內部的資料是在ROM的制造工序中,在工廠里用特殊的方法被燒錄進去的,其中的內容只能讀不能改,一旦燒錄進去,用戶只能驗證寫入的資料是否正確,不能再作任何修改。如果發現資料有任何錯誤,則只有舍棄不用,重新訂做一份。ROM是在生產線上生產的,由于成本高,一般只用在大批量應用的場合。
由于ROM制造和升級的不便,后來人們發明了PROM(Programmable ROM,可編程ROM)。最初從工廠中制作完成的PROM內部并沒有資料,用戶可以用專用的編程器將自己的資料寫入,但是這種機會只有一次,一旦寫入后也無法修改,若是出了錯誤,已寫入的芯片只能報廢。PROM的特性和ROM相同,但是其成本比ROM高,而且寫入資料的速度比ROM的量產速度要慢,一般只適用于少量需求的場合或是ROM量產前的驗證。
EPROM(Erasable Programmable ROM,可擦除可編程ROM)芯片可重復擦除和寫入,解決了PROM芯片只能寫入一次的弊端。EPROM芯片有一個很明顯的特征,在其正面的陶瓷封裝上,開有一個玻璃窗口,透過該窗口,可以看到其內部的集成電路,紫外線透過該孔照射內部芯片就可以擦除其內的數據,完成芯片擦除的操作要用到EPROM擦除器。
鑒于EPROM操作的不便,后來出的主板上的BIOS ROM芯片大部分都采用EEPROM(Electrically Erasable Programmable ROM,電可擦除可編程ROM)。EEPROM的擦除不需要借助于其它設備,它是以電子信號來修改其內容的,而且是以Byte為最小修改單位,不必將資料全部洗掉才能寫入,徹底擺脫了EPROM Eraser和編程器的束縛。
FLASH ROM則屬于真正的單電壓芯片,在使用上很類似EPROM,因此,有些書籍上便把FLASH ROM作為EPROM的一種。事實上,二者還是有差別的。FLASH ROM在擦除時,也要執行專用的刷新程序,但是在刪除資料時,并非以Byte為基本單位,而是以Sector(又稱Block)為最小單位,Sector的大小隨廠商的不同而有所不同;只有在寫入時,才以Byte為最小單位寫入;FLASH ROM芯片的讀和寫操作都是在單電壓下進行,不需跳線,只利用專用程序即可方便地修改其內容;FLASH ROM的存儲容量普遍大于EPROM,約為512K到至8M KBit,由于大批量生產,價格也比較合適,很適合用來存放程序碼,近年來已逐漸取代了EPROM,廣泛用于主板的BIOS ROM,也是CIH攻擊的主要目標。
隨機訪問內存(RAM)相當于PC機上的移動存儲,用來存儲和保存數據的。在任何時候都可以讀寫,RAM通常用作操作系統或其他正在運行的程序的臨時存儲介質(可稱作系統內存)。不過,當電源關閉時時RAM不能保留數據,如果需要保存數據,就必須把它們寫入到一個長期的存儲器中(例如硬盤)。正因為如此,有時也將RAM稱作"可變存儲器"。RAM內存可以進一步分為靜態RAM(SRAM)和動態內存(DRAM)兩大類。
靜態隨機存取存儲器(Static?Random-Access?Memory,SRAM)是隨機存取存儲器的一種。所謂的“靜態”,是指這種存儲器只要保持通電,里面儲存的數據就可以恒常保持。相對之下,動態隨機存取存儲器(DRAM)里面所儲存的數據就需要周期性地更新。然而,當電力供應停止時,SRAM儲存的數據還是會消失(被稱為volatile memory),這與在斷電后還能儲存資料的ROM或閃存是不同的。
SRAM不需要刷新電路即能保存它內部存儲的數據。而DRAM(Dynamic Random Access Memory)每隔一段時間,要刷新充電一次,否則內部的數據即會消失,因此SRAM具有較高的性能,但是SRAM也有它的缺點,即它的集成度較低,功耗較DRAM大???,相同容量的DRAM內存可以設計為較小的體積,但是SRAM卻需要很大的體積。同樣面積的硅片可以做出更大容量的DRAM,因此SRAM顯得更貴。
參考文獻:百度百科
2. 用verilog實現一個深度為16,位寬8bit的單端口SRAM。搭建一個仿真環境,完成初始化,讀取,寫入的操作。
方式一:手寫代碼
參考:Verilog極簡教程
module mini_sp_ram #(
parameter ADDR_BITS=4
)(
input clk,
input [ 7:0] addr,
input [ 7:0] din,
input ce,
input we,
output reg [ 7:0] dout
);
localparam MEM_DEPTH= 1< reg [7:0] mem[MEM_DEPTH-1:0]; // synopsys_translate_off integer i; initial begin for(i=0; i mem[i] = 8'h00; end end // synopsys_translate_on always @(posedge clk) begin if(ce & we) begin mem[addr] <= din; end end always @(posedge clk) begin if(ce && (!we)) begin dout <= mem[addr]; end end endmodule 這段代碼有一段: // synopsys_translate_off integer i; initial begin for(i=0; i mem[i] = 8'h00; end end // synopsys_translate_on 可能會讓人疑惑,這能綜合嗎? 后來特意查了下,原來是我等太為淺薄: 引導語句“// synopsys translate_off” 以前一直沒弄懂,以為就是個簡單的注釋完事,原來還可以用來引導綜合過程: 設計者在寫設計代碼時,有時可能針對仿真寫一些語句,這些語句可能是不為DC所接受,也不希望DC接受;設計者如果不對這些語句進行特殊說明,DC讀入設計代碼時就會產生語法錯誤。 另一種情況是,設計者在寫設計代碼,有些設計代碼是為專有的對象寫的(如公司內部),這些專有的設計代碼可能不希望被綜合。 Synopsys提供了引導語句,設計者可以使用這些引導語句控制DC綜合的對象。 在設計代碼中,引導語句“// synopsys translate_off”后直到“// synopsys translate_on”之間的語句被DC忽略。 參考鏈接:引導語句“// synopsys translate_off” 測試文件(參考:https://halftop.github.io/post/verilog-day13/): `timescale 1ns / 1ps // // Company: // Create Date: 2019/05/16 21:04:57 // Design Name: // Module Name: SRAM_tb // module sram_tb( ); reg [3 : 0] addr; reg [7 : 0]data_in; reg clk; reg we; reg ce; wire [7 : 0] data_out; integer i; //clock generation initial begin clk = 0; forever #4 clk = ~clk; end initial begin ce = 1'b0; we = 1'b0; addr = 4'd0; data_in = 8'h00; #20 @(negedge clk)//read ce = 1'b1; for (i = 0; i<16; i=i+1) begin @(negedge clk) addr = i; end @(negedge clk)//write we = 1'b1; for (i = 0; i<16; i=i+1) begin @(negedge clk) begin addr = i; data_in = data_in + 'h01; end end @(negedge clk)//read we = 1'b0; for (i = 0; i<16; i=i+1) begin @(posedge clk) addr = i; end @(negedge clk) ce = 1'b0; //#100 $finish; #100 $stop; end sram #( .ADDR_BITS(4) ) u_sram( .clk(clk), .ce(ce), .we(we), .addr(addr), .din(data_in), .dout(data_out) ); endmodule 行為仿真時序圖: 方式二(用FPGA的IP核生成): 可以采用Distributed RAM以及Block RAM生成,這里采用Distributed RAM生成: 生成的模板: SRAM your_instance_name ( .a(a), ? ? ?// input wire [3 : 0] a .d(d), ? ? ?// input wire [7 : 0] d .clk(clk), ?// input wire clk .we(we), ? ?// input wire we .spo(spo) ?// output wire [7 : 0] spo ); 仿真文件: `timescale 1ns / 1ps // // Company: // Create Date: 2019/05/16 21:04:57 // Design Name: // Module Name: SRAM_tb // module SRAM_tb( ); reg [3 : 0] addr; reg [7 : 0]data_in; reg clk; reg we; wire [7 : 0] data_out; integer i; //clock generation initial begin clk = 0; forever #4 clk = ~clk; end initial begin we = 1'b0; addr = 4'd0; data_in = 8'h00; #20 @(negedge clk)//read for (i = 0; i<16; i=i+1) begin @(negedge clk) addr = i; end @(negedge clk)//write we = 1'b1; for (i = 0; i<16; i=i+1) begin @(negedge clk) begin addr = i; data_in = data_in + 'h01; end end @(negedge clk)//read we = 1'b0; for (i = 0; i<16; i=i+1) begin @(posedge clk) addr = i; end // #100 $finish; #100 $stop; end SRAM U0_SRAM ( .a(addr), // input wire [3 : 0] a .d(data_in), // input wire [7 : 0] d .clk(clk), // input wire clk .we(we), // input wire we .spo(data_out) // output wire [7 : 0] spo ); endmodule 3. 接第2題,如果同時對一個地址進行讀和寫操作,會怎樣?實際中應該如何處理? 單端口SRAM,不能同時讀寫! 但第4題用單端口SRAM構造一個雙端口同步FIFO,可以同時讀寫。 4. 使用單端口SRAM構造一個雙端口同步FIFO。 使用單端口SRAM制作雙端口FIFO 算了吧,暫時實力不足,時間也不允許這樣搞,費點資源搞直接點。 機器學習
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。