这个题没有说清楚:在时钟的下降沿,模块也要输出信号data。造成了我最开始一直报错,等到我发现问题在这里以后,内心奔腾而过........
三个输入:
1、时钟信号clk
2、复位信号rst_n
3、地址信号addr
一个输出:
数据信号data
不要被这个题干唬住,什么ROM、位宽深度都不用管。就是输入一个数,然后在时钟的跳变沿输出对应的结果。
说句题外话:现在ROM都是直接用厂家的IP核实现的,没有人再会用手写ROM了,这完全是为了出题而出题。
程序很简单,就一个简简单单的case,把输入和输出对应起来,就形成了所谓的“ROM”。
`timescale 1ns/1ns
module rom(
    input clk,
    input rst_n,
    input [7:0]addr,
     
    output [3:0]data
);
 
    reg [3:0] data_reg;
 
    always@(posedge clk or negedge clk or negedge rst_n)
    if(rst_n == 1'b0)
        data_reg <= 4'd0;
    else
        case(addr)
            8'd0:data_reg <= 4'd0;
            8'd1:data_reg <= 4'd2;
            8'd2:data_reg <= 4'd4;
            8'd3:data_reg <= 4'd6;
            8'd4:data_reg <= 4'd8;
            8'd5:data_reg <= 4'd10;
            8'd6:data_reg <= 4'd12;
            8'd7:data_reg <= 4'd14;
            default:data_reg <= 4'd0;
        endcase
 
assign data = data_reg;

endmodule