列表

详情


VL23. ROM的简单实现

描述

实现一个深度为8,位宽为4bit的ROM,数据初始化为0,2,4,6,8,10,12,14。可以通过输入地址addr,输出相应的数据data。

接口信号图如下:

      

使用Verilog HDL实现以上功能并编写testbench验证。



输入描述

clk:系统时钟
rst_n:异步复位信号,低电平有效
addr:8bit位宽的无符号数,输入到ROM的地址

输出描述

data:4bit位宽的无符号数,从ROM中读出的数据

原站题解

Verilog 解法, 执行用时: 0ms, 内存消耗: 0KB, 提交时间: 2022-08-06

`timescale 1ns/1ns
module rom(
    input clk,
    input rst_n,
    input [7:0]addr,
     
    output [3:0]data
);
    reg [3:0] rom_data [7:0];
     
    assign data = rom_data[addr];
//保持ROM中的数据不变  
    always @(posedge clk or negedge rst_n)
        if (!rst_n) 
            begin
                rom_data[0] <= 4'd0;
                rom_data[1] <= 4'd2;
                rom_data[2] <= 4'd4;
                rom_data[3] <= 4'd6;      
                rom_data[4] <= 4'd8;
                rom_data[5] <= 4'd10;
                rom_data[6] <= 4'd12;
                rom_data[7] <= 4'd14;
            end
        else 
            begin
                rom_data[0] <= rom_data[0];
                rom_data[1] <= rom_data[1];
                rom_data[2] <= rom_data[2];
                rom_data[3] <= rom_data[3];       
                rom_data[4] <= rom_data[4];
                rom_data[5] <= rom_data[5];
                rom_data[6] <= rom_data[6];
                rom_data[7] <= rom_data[7];
            end
endmodule

Verilog 解法, 执行用时: 0ms, 内存消耗: 0KB, 提交时间: 2022-08-06

`timescale 1ns/1ns
module rom(
	input clk,
	input rst_n,
	input [7:0]addr,
	
	output [3:0]data
);
	reg [3:0] rom_data [7:0];  
// 要实现ROM,首先要声明数据的存储空间,
//变量名称rom之前的[3:0]表示每个数据具有多少位,指位宽;变量名称rom之后的[7:0]表示需要多少个数据,指深度
	
	assign data = rom_data[addr];
//保持ROM中的数据不变	
	always @(posedge clk or negedge rst_n)//声明存储变量之后,需要对rom进行初始化,写入数据,然后将输入地址作为rom的索引值,将索引值对应的数据输出。
		if (!rst_n) 
			begin
				rom_data[0] <= 4'd0;
				rom_data[1] <= 4'd2;
				rom_data[2] <= 4'd4;
				rom_data[3] <= 4'd6;		
				rom_data[4] <= 4'd8;
				rom_data[5] <= 4'd10;
				rom_data[6] <= 4'd12;
				rom_data[7] <= 4'd14;
			end
		else 
			begin
				rom_data[0] <= rom_data[0];
				rom_data[1] <= rom_data[1];
				rom_data[2] <= rom_data[2];
				rom_data[3] <= rom_data[3];		
				rom_data[4] <= rom_data[4];
				rom_data[5] <= rom_data[5];
				rom_data[6] <= rom_data[6];
				rom_data[7] <= rom_data[7];
			end

endmodule

Verilog 解法, 执行用时: 0ms, 内存消耗: 0KB, 提交时间: 2022-08-06

`timescale 1ns/1ns
module rom(
	input clk,
	input rst_n,
	input [7:0]addr,
	
	output [3:0]data
);
    reg [3:0]rom_data[7:0];

    always @ (posedge clk or negedge rst_n) begin
        if (~rst_n) begin
            rom_data[0] <= 4'd0;
            rom_data[1] <= 4'd2;
            rom_data[2] <= 4'd4;
            rom_data[3] <= 4'd6;
            rom_data[4] <= 4'd8;
            rom_data[5] <= 4'd10;
            rom_data[6] <= 4'd12;
            rom_data[7] <= 4'd14;
        end
        else begin
            rom_data[0] <= 4'd0;
            rom_data[1] <= 4'd2;
            rom_data[2] <= 4'd4;
            rom_data[3] <= 4'd6;
            rom_data[4] <= 4'd8;
            rom_data[5] <= 4'd10;
            rom_data[6] <= 4'd12;
            rom_data[7] <= 4'd14;
        end
    end
    assign data = rom_data[addr];
endmodule

Verilog 解法, 执行用时: 0ms, 内存消耗: 0KB, 提交时间: 2022-08-06

`timescale 1ns/1ns
module rom(
	input clk,
	input rst_n,
	input [7:0]addr,
	
	output [3:0]data
);
    
    reg [3:0] data_reg [7:0];
    reg [3:0] data_out_reg;
    initial begin
        data_reg[0] = 4'd0;
        data_reg[1] = 4'd2;
        data_reg[2] = 4'd4;
        data_reg[3] = 4'd6;
        data_reg[4] = 4'd8;
        data_reg[5] = 4'd10;
        data_reg[6] = 4'd12;
        data_reg[7] = 4'd14;
    end

    
    assign data = data_reg[addr];
    

endmodule

Verilog 解法, 执行用时: 0ms, 内存消耗: 0KB, 提交时间: 2022-08-06

`timescale 1ns/1ns
module rom(
    input clk,
    input rst_n,
    input [7:0]addr,
     
    output [3:0]data
);
    reg [3:0] myROM [7:0];
    always@(posedge clk or negedge rst_n) begin
        if(~rst_n) begin
            myROM[0] <= 0;
            myROM[1] <= 2;
            myROM[2] <= 4;
            myROM[3] <= 6;
            myROM[4] <= 8;
            myROM[5] <= 10;
            myROM[6] <= 12;
            myROM[7] <= 14;
        end
        else begin
            myROM[0] <= myROM[0];
            myROM[1] <= myROM[1];
            myROM[2] <= myROM[2];
            myROM[3] <= myROM[3];
            myROM[4] <= myROM[4];
            myROM[5] <= myROM[5];
            myROM[6] <= myROM[6];
            myROM[7] <= myROM[7];
        end
    end
     
    assign data = myROM[addr];
endmodule

上一题