data_ram_display.v
`timescale 1ns / 1ps
//*************************************************************************
// > 文件名: data_ram_display.v
// > 描述 :数据存储器模块显示模块,调用FPGA板上的IO接口和触摸屏
// > 作者 : LOONGSON
// > 日期 : 2016-04-14
//*************************************************************************
module data_ram_display(
//时钟与复位信号
input clk,
input resetn, //后缀"n"代表低电平有效
//拨码开关,用于产生写使能和选择输入数
input [3:0] wen,
input [1:0] input_sel,
//led灯,用于指示写使能信号,和正在输入什么数据
output [3:0] led_wen,
output led_addr, //指示输入读写地址
output led_wdata, //指示输入写数据
output led_test_addr, //指示输入test地址
//触摸屏相关接口,不需要更改
output lcd_rst,
output lcd_cs,
output lcd_rs,
output lcd_wr,
output lcd_rd,
inout[15:0] lcd_data_io,
output lcd_bl_ctr,
inout ct_int,
inout ct_sda,
output ct_scl,
output ct_rstn
);
//-----{LED显示}begin
assign led_wen = wen;
assign led_addr = (input_sel==2'd0);
assign led_wdata = (input_sel==2'd1);
assign led_test_addr = (input_sel==2'd2);
//-----{LED显示}end
//-----{调用数据储存器模块}begin
//数据存储器多增加一个读端口,用于读出特定内存地址显示在触摸屏上
reg [31:0] addr;
reg [31:0] wdata;
wire [31:0] rdata;
reg [31:0] test_addr;
wire [31:0] test_data;
data_ram data_ram_module(
//真双口RAM
.clka(clk), // input wire clka
.wea(wen), // input wire [3 : 0] wea
.addra({3'b0,addr[6:2]}), // input wire [7 : 0] addra,
.dina(wdata), // input wire [31 : 0] dina
.douta(rdata), // output wire [31 : 0] douta
.web(~wen),
.clkb(clk), // input wire clkb
.addrb({3'b0,test_addr[6:2]}), // input wire [7 : 0] addrb
.doutb(test_data) // output wire [31 : 0] doutb
);
//-----{调用寄存器堆模块}end
//---------------------{调用触摸屏模块}begin--------------------//
//-----{实例化触摸屏}begin
//此小节不需要更改
reg display_valid;
reg [39:0] display_name;
reg [31:0] display_value;
wire [5 :0] display_number;
wire input_valid;
wire [31:0] input_value;
lcd_module lcd_module(
.clk (clk ), //10Mhz
.resetn (resetn ),
//调用触摸屏的接口
.display_valid (display_valid ),
.display_name (display_name ),
.display_value (display_value ),
.display_number (display_number),
.input_valid (input_valid ),
.input_value (input_value ),
//lcd触摸屏相关接口,不需要更改
.lcd_rst (lcd_rst ),
.lcd_cs (lcd_cs ),
.lcd_rs (lcd_rs ),
.lcd_wr (lcd_wr ),
.lcd_rd (lcd_rd ),
.lcd_data_io (lcd_data_io ),
.lcd_bl_ctr (lcd_bl_ctr ),
.ct_int (ct_int ),
.ct_sda (ct_sda ),
.ct_scl (ct_scl ),
.ct_rstn (ct_rstn )
);
//-----{实例化触摸屏}end
//-----{从触摸屏获取输入}begin
//根据实际需要输入的数修改此小节,
//建议对每一个数的输入,编写单独一个always块
//当input_sel为2'b00时,表示输入数为读写地址,即addr
always @(posedge clk)
begin
if (!resetn)
begin
addr <= 32'd0;
end
else if (input_valid && input_sel==2'd0)
begin
addr[31:2] <= input_value[31:2];
end
end
//当input_sel为2'b01时,表示输入数为写数据,即wdata
always @(posedge clk)
begin
if (!resetn)
begin
wdata <= 32'd0;
end
else if (input_valid && input_sel==2'd1)
begin
wdata <= input_value;
end
end
//当input_sel为2'b10时,表示输入数为test地址,即test_addr
always @(posedge clk)
begin
if (!resetn)
begin
test_addr <= 32'd0;
end
else if (input_valid && input_sel==2'd2)
begin
test_addr[31:2] <= input_value[31:2];
end
end
//-----{从触摸屏获取输入}end
//-----{输出到触摸屏显示}begin
//根据需要显示的数修改此小节,
//触摸屏上共有44块显示区域,可显示44组32位数据
//44块显示区域从1开始编号,编号为1~44,
always @(posedge clk)
begin
case(display_number)
6'd1:
begin
display_valid <= 1'b1;
display_name <= "ADDR ";
display_value <= addr;
end
6'd2:
begin
display_valid <= 1'b1;
display_name <= "WDATA";
display_value <= wdata;
end
6'd3:
begin
display_valid <= 1'b1;
display_name <= "RDATA";
display_value <= rdata;
end
6'd5:
begin
display_valid <= 1'b1;
display_name <= "T_ADD";
display_value <= test_addr;
end
6'd6:
begin
display_valid <= 1'b1;
display_name <= "T_DAT";
display_value <= test_data;
end
default :
begin
display_valid <= 1'b0;
display_name <= 40'd0;
display_value <= 32'd0;
end
endcase
end
//-----{输出到触摸屏显示}end
//----------------------{调用触摸屏模块}end---------------------//
endmodule
tb.v
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2021/10/05 22:19:41
// Design Name:
// Module Name: tb
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module tb;
//inputs
reg clk;
reg [3:0] wen;//写使能
reg [31:0] addr;
reg [31:0] wdata;
reg [31:0] test_addr;
wire [31:0] rdata;
wire [31:0] test_data;
data_ram uut (//调用IP核,自定义名字uut,IP核本身为同步读写
.clka(clk), // input wire clka
.wea(wen), // input wire [3 : 0] wea
.addra({3'b0,addr[6:2]}), // input wire [7 : 0] addra
.dina(wdata), // input wire [31 : 0] dina
.douta(rdata), // output wire [31 : 0] douta
.clkb(clk), // input wire clkb
.web(~wen),
.addrb({3'b0,test_addr[6:2]}), // input wire [7 : 0] addrb
.dinb(32'b0),
.doutb(test_data) // output wire [31 : 0] doutb
);
initial begin
clk = 0;
wen=0;
addr=0;
wdata=0;
test_addr=0;
#100
wen=1;
addr=8'd32;
test_addr=8'd32;
wdata=32'd16;
#100
addr=8'd64;
wdata=32'd12;
#100
test_addr=8'd64;
end
always #5 clk = ~clk;
endmodule
inst_rom_display.v
`timescale 1ns / 1ps
//*************************************************************************
// > 文件名: inst_rom_display.v
// > 描述 :异步指令存储器显示模块,调用FPGA板上的IO接口和触摸屏
// > 作者 : LOONGSON
// > 日期 : 2016-04-14
//*************************************************************************
module inst_rom_display(
//时钟与复位信号
input clk,
input resetn, //后缀"n"代表低电平有效
//触摸屏相关接口,不需要更改
output lcd_rst,
output lcd_cs,
output lcd_rs,
output lcd_wr,
output lcd_rd,
inout[15:0] lcd_data_io,
output lcd_bl_ctr,
inout ct_int,
inout ct_sda,
output ct_scl,
output ct_rstn
);
//-----{调用数据储存器模块}begin
//数据存储器多增加一个读端口,用于读出特定内存地址显示在触摸屏上
reg [31:0] addr;
wire [31:0] inst;
inst_rom inst_rom_module(
.clka (clk),
.addra ({3'b0,addr[6:2]}),
.douta (inst[31:0])
);
//-----{调用寄存器堆模块}end
//---------------------{调用触摸屏模块}begin--------------------//
//-----{实例化触摸屏}begin
//此小节不需要更改
reg display_valid;
reg [39:0] display_name;
reg [31:0] display_value;
wire [5 :0] display_number;
wire input_valid;
wire [31:0] input_value;
lcd_module lcd_module(
.clk (clk ), //10Mhz
.resetn (resetn ),
//调用触摸屏的接口
.display_valid (display_valid ),
.display_name (display_name ),
.display_value (display_value ),
.display_number (display_number),
.input_valid (input_valid ),
.input_value (input_value ),
//lcd触摸屏相关接口,不需要更改
.lcd_rst (lcd_rst ),
.lcd_cs (lcd_cs ),
.lcd_rs (lcd_rs ),
.lcd_wr (lcd_wr ),
.lcd_rd (lcd_rd ),
.lcd_data_io (lcd_data_io ),
.lcd_bl_ctr (lcd_bl_ctr ),
.ct_int (ct_int ),
.ct_sda (ct_sda ),
.ct_scl (ct_scl ),
.ct_rstn (ct_rstn )
);
//-----{实例化触摸屏}end
//-----{从触摸屏获取输入}begin
//根据实际需要输入的数修改此小节,
//建议对每一个数的输入,编写单独一个always块
always @(posedge clk)
begin
if (!resetn)
begin
addr <= 32'd0;
end
else if (input_valid)
begin
addr[31:2] <= input_value[31:2];
end
end
//-----{从触摸屏获取输入}end
//-----{输出到触摸屏显示}begin
//根据需要显示的数修改此小节,
//触摸屏上共有44块显示区域,可显示44组32位数据
//44块显示区域从1开始编号,编号为1~44,
always @(posedge clk)
begin
case(display_number)
6'd1:
begin
display_valid <= 1'b1;
display_name <= "ADDR ";
display_value <= addr;
end
6'd2:
begin
display_valid <= 1'b1;
display_name <= "INST ";
display_value <= inst;
end
default :
begin
display_valid <= 1'b0;
display_name <= 40'd0;
display_value <= 32'd0;
end
endcase
end
//-----{输出到触摸屏显示}end
//----------------------{调用触摸屏模块}end---------------------//
endmodule
tb.v
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2021/11/07 20:57:41
// Design Name:
// Module Name: tb
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module tb();
reg clk;
reg [31:0]addr;
wire [31:0]inst;
inst_rom inst_rom_module(
.clka (clk),
.addra ({3'b0,addr[6:2]}),//赋值范围4-64对应addra:8-256,转换成十六进制0008-0100
.douta (inst[31:0])
);
initial begin
clk=0;
addr=0;
#100//4对应1,8对应2,16对应4,范围4-64
addr=4;
#100
addr=8;
end
always #5 clk = ~clk;
endmodule