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