diff --git a/ReadMe.txt b/ReadMe.txt index 7c6c107..d7f457c 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -2,4 +2,6 @@ 2024.12.30 实现一个改变时钟电平的基本电路 - 每个时钟周期计数器加1 \ No newline at end of file + 每个时钟周期计数器加1 +2025.3.11 + 实现内存模块 \ No newline at end of file diff --git a/make.py b/make.py index f22c663..7c197cb 100644 --- a/make.py +++ b/make.py @@ -6,14 +6,25 @@ TARGET="wave" SRC = ["testbench.v"] -INC = [] +INC = ['verilog'] IVER="iverilog" VVP="vvp" GTKWAVE="gtkwave" +for i in range(len(INC)): + tmp=os.path.join(os.path.curdir,INC[i]) + tmp=os.path.abspath(tmp).replace('/','\\') + INC[i]='-I '+tmp + +for i in range(len(SRC)): + tmp=os.path.join(os.path.curdir,SRC[i]) + tmp=os.path.abspath(tmp).replace('/','\\') + SRC[i]=tmp + + def make(): - cmd=' '.join([IVER,'-o',TARGET]+SRC) + cmd=' '.join([IVER,'-o',TARGET]+INC+SRC) if(os.system(cmd)): sys.exit(-1) cmd=' '.join([VVP,'-n',TARGET,'lxt2']) diff --git a/testbench.v b/testbench.v index b2a02fb..5c64d40 100644 --- a/testbench.v +++ b/testbench.v @@ -2,44 +2,44 @@ // 时间尺度 以1ns为时钟单位 / 1ns为时钟精度 `timescale 1ns/1ns // 包含文件 main_module.v 编译的时候就不需要指定这个文件了 -`include "main_module.v" +`include "counter.v" +`include "mem.v" // 定义模块 此模块没有输入输出 module testbench(); + + // 输入给模块的变量用reg reg clk; reg rst; reg [7:0] data; - wire dout; + + // 接收模块的输出用wire wire [31:0] sum; - wire [7:0] data_addr; - // 定义一个存储空间 8位 256个字节 - reg [7:0] flash_mem[255:0]; + wire [7:0] read_data; + // 指定参数 parameter CYCLE = 2; parameter END_TIME = 200; // 实例化模块 - test mod( + counter counter_mod( .clk(clk), .rst(rst), - .data(data), - .dout(dout), - .data_addr(data_addr), - .sum(sum) + .count(sum) ); - // 初始化块 此块用于生成波形文件 - // initial 语句为仿真语句,通常在testbench中使用 - initial begin - $dumpfile("wave.vcd"); - $dumpvars(0,testbench); - // 把文件中的16进制数据填充到mem - $readmemh("flash_data.txt",flash_mem); - end + mem mem_mod( + .clk(clk), + .rst(rst), + .write_en(1'b1), + .read_en(1'b0), + .data_in(data), + .addr(sum[7:0]), + .data_out(read_data) + ); - //显示数组的10个值 - // initial begin - // $display("yyyyy %d: %h", 0, flash_mem[0]); - // end + always @(posedge clk) begin + data <= sum[7:0]; + end // 寄存器初始化,只有初始化之后才会产生波形 initial begin @@ -47,7 +47,7 @@ module testbench(); rst = 0; end initial begin - #5 rst = 1; + #1 rst = 1; end // 每隔一个时钟周期取反 @@ -55,10 +55,10 @@ module testbench(); #(CYCLE / 2) clk = ~clk; end + // 仿真语句 打印变量值 always @(posedge clk) begin - data <= flash_mem[data_addr]; - $display("yyyyy %d: %h", data_addr, flash_mem[data_addr]); -end + $display("yyyyy %d: %h", sum, read_data); + end // 在END_TIME个时钟周期之后结束 initial begin diff --git a/verilog/counter.v b/verilog/counter.v new file mode 100644 index 0000000..83435c4 --- /dev/null +++ b/verilog/counter.v @@ -0,0 +1,23 @@ + + + + +module counter ( + input clk, + input rst, + // 声明变量 如果不指定变量类型 则默认是wire类型 + output reg [31:0] count +); + + // 在时钟的上升沿开始计算 + // 对时钟上升沿或rst电平敏感 + always @(posedge clk or rst) begin + if(rst==0) begin + count <= 0; + end + else begin + count <= count+1; + end + end + +endmodule \ No newline at end of file diff --git a/verilog/mem.v b/verilog/mem.v new file mode 100644 index 0000000..cde512f --- /dev/null +++ b/verilog/mem.v @@ -0,0 +1,43 @@ + + +module mem( + input clk, + input rst, + input write_en, + input read_en, + input [7:0] data_in, + input [7:0] addr, + output reg [7:0] data_out +); + + reg [7:0] mem_array[255:0]; + + + // 初始化块 此块用于生成波形文件 + // initial 语句为仿真语句,通常在testbench中使用 + initial begin + $dumpfile("wave.vcd"); + $dumpvars(0,testbench); + // 把文件中的16进制数据填充到mem + $readmemh("flash_data.txt",mem_array); + end + + always @(posedge clk or rst) begin + if(rst==0) begin + data_out <= 0; + end + else begin + if(write_en) begin + mem_array[addr] <= data_in; + end + else if(read_en) begin + data_out <= mem_array[addr]; + end + end + end + + + + +endmodule +