图4 在图4内里,我们本节仅仅关注红色框线所示的部分的代码。
从图4的红色框线的代码部分来看,在系统复位信号为低电平有效时,也就是在系统复位的时间,地址缓存变量【addr_buf】与数据缓存变量【data_buf】被非壅闭赋值为0值。而在平时,没有特殊条件的时间,【addr_buf】与【data_buf】会保持它的现有值不变。
而在内部控制信号总线变量【ctrl_sig_inner】的位2为1时,也就是控制中央发布了内存写使能信号的时间,【addr_buf】会缓存内部地址信号总线变量【addr_sig_inner】的值,【data_buf】会缓存内部数据信号总线变量【data_sig_inner】的值。
也就是说,【addr_buf】与【data_buf】的逻辑是,系统复位时,它俩都被赋予0值。接下来呢,在不思量别的条件的情况下,每次内部控制信号总线变量【ctrl_sig_inner】的位2为1时,这两个缓存变量,都来缓存一次对应的内部地址总线变量与内部数据信号总线变量的值。然后呢,寻常的时间,保持原值不变,直到再次检测到内部控制信号总线变量【ctrl_sig_inner】的位2为1时,再将【addr_buf】与【data_buf】非壅闭赋值为新的对应的内部地址信号总线变量与内部数据信号总线的值。
四. 内存读写模块内里,对 RAM IP 核的实例化代码
图5 图5,展示的是 RAM IP 核的实例化代码。对于 RAM IP 核的天生方法,我们本节不去细讲。想要相识本项目所使用的 RAM IP 核的天生方法与参数配置,请参考下述链接所示的文章。
调用IP核天生指令内存
点击了链接以后,请找到第二分节,在二号分节内里查察天生方法与参数配置。。
在确保你已经相识了本项目的 RAM IP 核的天生方法以后,你可以接着看下面的解说。
从图5的133行可以看到,我们的【rw_ram】模块所实例化的模块和模块名分别为【ram_256x16】和【ram_256x16_inst】。模块名中的【256x16】体现说,这个 RAM IP 核,包罗了256个内存单位,每个内存单位是16位,也就是2字节。
接下来,是信号连接部分。
对于内存写操纵来说,我们需要使用的信号连接,位于134行,135行,136行,137行和139行。
在134行内里,我们可以看到,在 RAM IP 内部,使用的复位信号的名称为【aclr】。它的英文全名是【asynchronous clear】。不外呢,这个 RAM IP 核内里的复位信号,它并不是低电平有效的,而是高电平有效。而我们的【rw_ram】模块的系统复位信号【sys_rst_n】是低电平有效的。所以呢,为了使连接到 RAM IP 核的异步复位信号能够精确地发挥作用,我们需要将【rw_ram】模块的系统复位信号,【sys_rst_n】,取反以后,再连接到 RAM IP 核内部的【aclr】信号上。
第136行,我们将【rw_ram】模块的系统时钟信号【sys_clk】连接到 RAM IP 核内部的【clock】信号上。
以上两个信号的连接,是系统时钟与系统复位信号与 RAM IP 核的内部信号的连接方法。
对于内存写操纵来说,真正起作用的,是写使能信号【wr_en】,待写数据【data_buf】与地址信号【addr_buf】。我们需要将待写数据【data_buf】的值,写入地址为【addr_buf】的内存单位中。开启写入操纵的机遇是,写使能信号【wr_en】为有效的高电平。
在这里,操纵时序,就起到作用了。我们回首一下,这些个变量,是怎样的时序变革。
当某一个时钟上升沿到临时,如果检测到内部控制信号总线变量的位2为1时,表明控制中央发布了内存写使能信号。这个时间,在非壅闭赋值阶段,将内部地址信号总线变量【addr_sig_inner】的值缓存到【addr_buf】内里,将内部数据信号总线变量【data_sig_inner】的值缓存到【data_buf】内里。
缓存了待写数据与待写地址信号以后,【addr_buf】与【data_buf】又分别在图5的135行与137行,与 RAM IP 核的内部信号连接了起来。而系统时钟与系统复位信号早就连接到 RAM IP 核上了。此时,有了待写数据与待写地址,所差的,就只剩下一个写使能信号了。
我们假定,当系统检测到【ctrl_sig_inner[2] == 1】条件满足的时间,所在的时钟跳变沿,为0号时钟上升沿。根据图2的代码,在0号上升沿之后的非壅闭赋值阶段,【write_time】被非壅闭赋值为1。
然后呢,在1号时钟上升沿的时间,系统会检测到【write_time == 1】条件满足。在1号上升沿之后的非壅闭赋值阶段,根据图3的代码,我们知道,【wr_en】被非壅闭赋值为1。
在2号时钟上升沿的时间,系统会检测到【wr_en == 1】条件满足。2号时钟上升沿使用的时钟信号,为系统时钟信号【sys_clk】。而 RAM IP 核使用的时钟信号,是由系统时钟信号【sys_clk】连接已往的。也就是,RAM IP 核使用的时钟信号,也是系统时钟信号【sys_clk】。
在图5的139行,我们看到,【rw_ram】模块的【wr_en】变量被连接到了 RAM IP 核的【wren】信号上。
【rw_ram】模块与 RAM IP 核使用相同的时钟信号,都使用了系统时钟【sys_clk】的节奏变革。而【rw_ram】模块的【wr_en】信号与 RAM IP 核的【wren】信号相连。这样,当在【rw_ram】模块中,在2号时钟上升沿内里,系统检测到【wr_en】信号为1的时间,此时,在 RAM IP 核内里,也会同时检测到内部的写使能信号【wren】变量为1。
当 RAM IP 核检测到内部的写使能信号为高电平的时间,就根据待写数据【data】与待写地址【address】,进行 ram 写操纵了,将【data】写入【address】地址单位中。
五. 发布完成信号给控制中央
在2号时钟上升沿时,系统会检测到【wr_en】为1,这个时间,RAM IP 核就会开始进行内存写操纵了。正常的话,应该是说,在3号时钟上升沿时,内存写操纵完成。不外,由于内存写操纵,并不需要从 RAM 中接收数据。我们可以在2号时钟上升沿时,向控制中央发布完成信号。
具体地,要怎么来发布呢?
我们先来看一看【write_time_d1】信号。其实,从名字上,大家应该可以猜到,它是一个节拍变量,比【write_time】延后一个时钟周期。我们来看看下面的代码。