Verilog中单口 ROM的代码实现

ROM 是用来存储数据的,可以按照下列代码形式初始化 ROM,但这种方法处理大容量的ROM 就比较麻烦,建议用 FPGA 自带的 ROM IP 核实现,并添加初始化文件。

代码实现:

(CSDN代码块不支持Verilog,代码复制到notepad++编辑器中,语言选择Verilog,看得更清楚)

module top 
(
 input [3:0] addr,
 input clk,
 output reg [7:0] q 
);
reg [7:0] rom [15:0] ; //declare rom 
always @(addr)
begin
 case(addr)
 4'd0 : rom[addr] = 8'd15 ;
 4'd1 : rom[addr] = 8'd24 ;
 4'd2 : rom[addr] = 8'd100 ;
 4'd3 : rom[addr] = 8'd78 ;
 4'd4 : rom[addr] = 8'd98 ;
 4'd5 : rom[addr] = 8'd105 ;
 4'd6 : rom[addr] = 8'd86 ;
 4'd7 : rom[addr] = 8'd254 ;
 4'd8 : rom[addr] = 8'd76 ;
 4'd9 : rom[addr] = 8'd35 ;
 4'd10 : rom[addr] = 8'd120 ;
 4'd11 : rom[addr] = 8'd85 ;
 4'd12 : rom[addr] = 8'd37 ;
 4'd13 : rom[addr] = 8'd19 ;
 4'd14 : rom[addr] = 8'd22 ;
 4'd15 : rom[addr] = 8'd67 ;
 endcase
end
always @(posedge clk)
begin
 q <= rom[addr] ;
end
endmodule

激励文件如下:

`timescale 1 ns/1 ns 
module top_tb() ;
reg [3:0] addr ;
reg clk ;
wire [7:0] q ;
initial
begin
 addr = 0 ;
 clk = 0 ;
end
always #10 clk = ~clk ;
always @(posedge clk)
begin
 addr <= addr + 1'b1 ;
end
top t0(.addr(addr),
 .clk(clk),
 .q(q)) ;
endmodule

  • 16
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

king_machine design

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值