Verilog HDL 訓練】第 13 天(存儲器、SRAM)

      網友投稿 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;

      【Verilog HDL 訓練】第 13 天(存儲器、SRAM)

      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小時內刪除侵權內容。

      上一篇:excel表格如何計算減法
      下一篇:取消合并單元格后Excel2007如何快速簡單填充空值(合并單元格取消后怎么把空的格填滿)
      相關文章
      国产亚洲精品国产| 国产亚洲精品拍拍拍拍拍| 亚洲AV一宅男色影视| 黑人大战亚洲人精品一区| 亚洲精品亚洲人成在线观看下载| 国产精品亚洲综合一区在线观看| 亚洲精品无码永久在线观看男男 | 伊人久久亚洲综合| 亚洲伊人久久综合影院| 亚洲成?v人片天堂网无码| 亚洲天堂在线视频| 精品亚洲一区二区三区在线观看| 亚洲日本中文字幕天堂网| 亚洲不卡无码av中文字幕| 亚洲综合区小说区激情区| 中文字幕无码精品亚洲资源网| 国产成人亚洲综合| 亚洲国产成人一区二区精品区| 亚洲国产精品无码久久SM| 亚洲av无码无在线观看红杏| 亚洲欧洲日产国码久在线观看| 亚洲另类激情综合偷自拍| 亚洲精品资源在线| 精品亚洲成在人线AV无码| 久久久久亚洲国产| 国产亚洲人成在线播放| 亚洲高清无码综合性爱视频| 亚洲最大AV网站在线观看| 亚洲AV人人澡人人爽人人夜夜| 亚洲电影免费观看| 亚洲成a人片在线观看精品| 亚洲精品无码成人片久久不卡| 国产精品亚洲天堂| 国产亚洲精aa成人网站| 久久久亚洲精品国产| 亚洲国产综合精品| 亚洲欧美日韩自偷自拍| 亚洲国产成人乱码精品女人久久久不卡| 亚洲色偷偷综合亚洲AV伊人| 亚洲AV日韩AV天堂一区二区三区 | 国产成人亚洲综合无|