【FPGA】ROM/EPROM的设计(使用case的方式初始化)

举报
李锐博恩 发表于 2021/07/15 03:31:34 2021/07/15
【摘要】 上篇博文:【FPGA】ROM/EPROM的设计(使用加载文件的方式初始化),提到了这篇博文中要用的方式初始化ROM,在代码中用case语句的方式,给一个地址,给一个数据。 很容易,通过异步的方式来给出代码设计: `timescale 1ns / 1ps//// Create Date: 2019/05/29 11:25:09// Design Name: // Modul...

上篇博文:【FPGA】ROM/EPROM的设计(使用加载文件的方式初始化),提到了这篇博文中要用的方式初始化ROM,在代码中用case语句的方式,给一个地址,给一个数据。

很容易,通过异步的方式来给出代码设计:


  
  1. `timescale 1ns / 1ps
  2. //
  3. // Create Date: 2019/05/29 11:25:09
  4. // Design Name:
  5. // Module Name: rom_using_case
  6. //
  7. module rom_using_case (
  8. input [3:0] address , // Address input
  9. output reg [7:0] data , // Data output
  10. input read_en , // Read Enable
  11. input ce // Chip Enable
  12. );
  13. always @ (ce or read_en or address)
  14. begin
  15. case (address)
  16. 0 : data = 10;
  17. 1 : data = 55;
  18. 2 : data = 244;
  19. 3 : data = 0;
  20. 4 : data = 1;
  21. 5 : data = 8'hff;
  22. 6 : data = 8'h11;
  23. 7 : data = 8'h1;
  24. 8 : data = 8'h10;
  25. 9 : data = 8'h0;
  26. 10 : data = 8'h10;
  27. 11 : data = 8'h15;
  28. 12 : data = 8'h60;
  29. 13 : data = 8'h90;
  30. 14 : data = 8'h70;
  31. 15 : data = 8'h90;
  32. endcase
  33. end
  34. endmodule

仿真波形如下:

给出RTL原理图:

可见,ce和read_en并没有用,所以可以去掉,经过测试:

//always @ (ce or read_en or address)
//always@(*)
always@(address)
begin
  case (address)
    0 : data = 10;
    1 : data = 55;
    2 : data = 244;
    3 : data = 0;
    4 : data = 1;
    5 : data = 8'hff;
    6 : data = 8'h11;
    7 : data = 8'h1;
    8 : data = 8'h10;
    9 : data = 8'h0;
    10 : data = 8'h10;
    11 : data = 8'h15;
    12 : data = 8'h60;
    13 : data = 8'h90;
    14 : data = 8'h70;
    15 : data = 8'h90;
  endcase
end

以上三种写法,仿真以及RTL图一样。

 

给出测试文件:


  
  1. `timescale 1ns / 1ps
  2. module rom_using_case_tb;
  3. reg [3:0] address;
  4. reg read_en, ce;
  5. wire [7:0] data;
  6. integer i;
  7. initial begin
  8. address = 0;
  9. read_en = 0;
  10. ce = 0;
  11. //#10 $monitor ("address = %h, data = %h, read_en = %b, ce = %b", address, data, read_en, ce);
  12. for (i = 0; i < 16; i = i + 1 ) begin
  13. #5
  14. address = i;
  15. read_en = 1;
  16. ce = 1;
  17. #5
  18. read_en = 0;
  19. ce = 0;
  20. address = 0;
  21. end
  22. end
  23. rom_using_case U_rom_case(
  24. .address(address) , // Address input
  25. .data(data) , // Data output
  26. .read_en(read_en) , // Read Enable
  27. .ce(ce) // Chip Enable
  28. );
  29. endmodule

参考链接:http://www.asic-world.com/examples/verilog/rom_eprom_eeprom.html


再给出一个与时钟相关的同步设计,参考链接:https://blog.csdn.net/ic7x24/article/details/89735950


  
  1. module mini_rom (
  2. input clk,
  3. input [ 7:0] addr,
  4. output reg [ 7:0] dout
  5. );
  6. always @(posedge clk) begin
  7. case(addr)
  8. 8'h00: dout <= 8'h0A;
  9. 8'h01: dout <= 8'h1A;
  10. 8'h02: dout <= 8'h2A;
  11. 8'h03: dout <= 8'h3A;
  12. 8'h04: dout <= 8'h4A;
  13. 8'h05: dout <= 8'h5A;
  14. 8'h06: dout <= 8'h6A;
  15. 8'h07: dout <= 8'h7A;
  16. 8'h08: dout <= 8'h8A;
  17. 8'h09: dout <= 8'h9A;
  18. 8'h0A: dout <= 8'hAA;
  19. 8'h0B: dout <= 8'hBA;
  20. 8'h0C: dout <= 8'hCA;
  21. 8'h0D: dout <= 8'hDA;
  22. 8'h0E: dout <= 8'hEA;
  23. 8'h0F: dout <= 8'hFA;
  24. 8'h10: dout <= 8'h50;
  25. 8'h11: dout <= 8'h51;
  26. 8'h12: dout <= 8'h52;
  27. 8'h13: dout <= 8'h53;
  28. 8'h14: dout <= 8'h54;
  29. 8'h15: dout <= 8'h55;
  30. 8'h16: dout <= 8'h56;
  31. 8'h17: dout <= 8'h57;
  32. 8'h18: dout <= 8'h58;
  33. 8'h19: dout <= 8'h59;
  34. 8'h1A: dout <= 8'h5A;
  35. 8'h1B: dout <= 8'h5B;
  36. 8'h1C: dout <= 8'h5C;
  37. 8'h1D: dout <= 8'h5D;
  38. 8'h1E: dout <= 8'h5E;
  39. 8'h1F: dout <= 8'h5F;
  40. default: dout <= 8'hff;
  41. endcase
  42. end
  43. endmodule

对其进行测试,易如反掌:

测试文件:


  
  1. `timescale 1ns / 1ps
  2. module mini_rom_tb;
  3. reg clk;
  4. reg [7:0] addr;
  5. wire [7:0] dout;
  6. integer i;
  7. initial begin
  8. clk = 0;
  9. forever
  10. #2 clk = ~clk;
  11. end
  12. initial begin
  13. addr = 0;
  14. //#10 $monitor ("addr = %h, data = %h, read_en = %b, ce = %b", addr, data, read_en, ce);
  15. for (i = 0; i < 256; i = i + 1 ) begin
  16. @(negedge clk)
  17. addr = i;
  18. end
  19. end
  20. mini_rom U_rom_case(
  21. .clk(clk),
  22. .addr(addr) , // addr input
  23. .dout(dout) // Data output
  24. );
  25. endmodule

互联网上有很多宝贵的资源,让人感动,我等也奉行开源的精神,让自己得益的同时,也发光发热。

 

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/90671204

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。