【【FIFO to multiplier to RAM的 verilog 代码 和 testbnench 】】

news2025/7/23 5:57:26

FIFO to multiplier to RAM的 verilog 代码 和 testbnench

只完成了单个数据的传输 大数据需要修改 tb 或者基本连线
在这里插入图片描述

FIFO.v

//synchronous  fifo
module FIFO_syn #(
    parameter 		WIDTH		=	16,                    //  the fifo wide
    parameter 		DEPTH		=	1024,                  //  deepth
    parameter 		ADDR_WIDTH	=	clogb2(DEPTH)        //  bit wide
 //   parameter 		PROG_EMPTY	=	100,                   //  this what we set to empty
  //  parameter 		PROG_FULL	=	800                     //  this what we set to full
  )
  (
    input   sys_clk                    ,
    input   sys_rst_n                    ,
    input   wr_en                      ,
    input   rd_en                      ,
    input   [WIDTH-1: 0] din           ,
    output  reg  full                  ,
    output  reg  empty                 ,         ///  1 is  real empty  0 is no empty
    output  reg  [WIDTH-1:0]  dout     
  );

  //========================================================================================//
  //                              define parameter and internal signals                     //
  //======================================================================================//
  reg [WIDTH-1 : 0]          ram[DEPTH-1 : 0]   ;     // this we set a  15:0   total 1024 number ram
  reg [ADDR_WIDTH-1 : 0]     wr_addr            ;     // this is  write pointer
  reg [ADDR_WIDTH-1 : 0]     rd_addr            ;     // this is  read  pointer
  reg [ADDR_WIDTH-1 : 0]     fifo_cnt           ;

  //=========================================================================================//
  //                             next  is  main code                                           //
  //=========================================================================================//

  //  we  set a function  let me to  count    the number
  function integer clogb2;                     //  remember integer has  symbol  reg  has no symbol
    input[31:0]value;
    begin
      value=value-1;
      for(clogb2=0;value>0;clogb2=clogb2+1)
        value=value>>1;
    end
  endfunction
  //   this  you can see from the  PPT 5-74


  //===================================================  next  is used to read

  always@(posedge sys_clk or negedge sys_rst_n)
  begin
    if(sys_rst_n == 0)
      rd_addr		<=		{ADDR_WIDTH{1'b0}};
    else if(rd_en && !empty)
    begin
      rd_addr		<=		rd_addr+1'd1;
      dout		<=		ram[rd_addr];
    end
    else
    begin
      rd_addr		<=		rd_addr;
      dout		<=		dout;
    end
  end




  //===================================================  next  is used to write
  always@(posedge sys_clk  or negedge sys_rst_n)
  begin
    if(sys_rst_n == 0)
    begin
      wr_addr         <=    {ADDR_WIDTH{1'b0}}   ;         //  this  let pointer to zero
    end
    else if( wr_en  &&  !full )
    begin   // no full and  wr_en   and  whether to write prog_full there
      wr_addr          <=    wr_addr + 1'b1  ;
      ram[wr_addr]     <=    din             ;
    end
    else
      wr_addr          <=    wr_addr         ;
  end





  //==============================================================  next  is  used to set fifo_cnt
  always@(posedge sys_clk  or negedge sys_rst_n )
  begin
    if(sys_rst_n == 0)
    begin
      fifo_cnt  <=  {ADDR_WIDTH{1'b0}};
    end
    else if(wr_en &&  !full  &&  !rd_en)
    begin
      fifo_cnt  <=   fifo_cnt + 1'b1 ;
    end
    else if(rd_en && !empty && !wr_en)
    begin
      fifo_cnt  <=  fifo_cnt - 1'b1 ;
    end
    else
      fifo_cnt  <=  fifo_cnt ;
  end


  //==========================================================     next is empty
  //  we set  counter  so  when the count is zero  empty
  always@(posedge sys_clk  or negedge sys_rst_n)
  begin
    if(sys_rst_n == 0)
    begin
      empty <= 1'b1 ;      //  begin  we set empty to high
    end
    // there is  two possibilties first no write fifo_cnt is all zero
    //second is no write it will be change to zero  is just a will empty signal
    else
      empty <=  (!wr_en && (fifo_cnt[ADDR_WIDTH-1:1] == 'b0))&&((fifo_cnt[0] == 1'b0) || rd_en);
  end



  //============================================================  next is full

  always@(posedge sys_clk or negedge sys_rst_n)
  begin
    if(sys_rst_n == 0 )
      full	<=	1'b1;//reset:1
    else
      full	<=	(!rd_en	&&	(fifo_cnt[ADDR_WIDTH-1:1]=={(ADDR_WIDTH-1){1'b1}})) && ((fifo_cnt[0] == 1'b1) || wr_en);
  end

endmodule

multiplier.v

module uumultiplier #(
    parameter       NUMBER1      =      8                    ,
    parameter       NUMBER2      =      8                                                                                                                                                                                                      
  )(
    input  [NUMBER1-1 : 0]                  input1       ,
    input  [NUMBER2-1 : 0]                  input2       ,
    input                                   clk          ,
    input                                   rst_n        ,
    input                                   begin_en     ,
    output  reg                             finish_en    ,
    output  reg [NUMBER1+NUMBER2 : 0]       out
  );


  //======================================================================================\
  //                define parameter  and  internal signal                                \
  //======================================================================================\
  reg [1:0] LCD = 2'b10 ;
  reg [1:0] LCD1 ;

  //==========================================================================================\
  //                     next   is  main  code                                                 \\
  //===========================================================================================\\

always@(posedge clk or negedge rst_n) begin 

 if(rst_n == 0)
    begin
      out <= 0 ;
    end

    else  
       LCD1 <= LCD  ;
    end

  always@(posedge clk or negedge rst_n)
  begin
    if(rst_n == 0)
    begin
      out <= 0 ;
    end

    else  if(begin_en && finish_en )
    begin

      out <= input1 * input2 ;
      LCD <= {LCD[0],LCD[1]} ; 
    end
    else
      out <= out ;
  end

  always@(posedge clk or negedge rst_n)
  begin
    if(rst_n == 0)
    begin
      finish_en <= 1'b1 ;
    end
    else if(LCD == LCD1)
    begin
      finish_en <= 1'b1 ;
    end
    else
      finish_en <= 1'b0 ;
  end


endmodule

RAM.v

//DUal ended RAM 
module RAM #(
    parameter     WIDTH      =     8   ,
    parameter     DEPTH      =     16  ,
    parameter     ADD_WIDTH  =     clogb2(DEPTH) 
)(
    input                       wr_clk         ,
    input                       rd_clk         ,
    input                       wr_en          ,
    input                       rd_en          ,
    input      [WIDTH-1 : 0 ]      din         ,
    input      [ADD_WIDTH-1 : 0]   wr_address  ,
    output reg [WIDTH-1 : 0 ]      dout        ,
    input      [ADD_WIDTH-1 : 0]   rd_address  
);


//==================================================================================\\
//       define  parameter   and  internal   signal                                 \\
//==================================================================================\\

reg [WIDTH - 1 : 0 ] ram [DEPTH - 1 : 0] ; 





//==================================================================================\\
//                              next is  main code                                  \\
//==================================================================================\\


function integer clogb2  ;
input [31:0] value  ;
begin 
    value = value - 1 ;
    for(clogb2 = 0 ; value > 0 ; clogb2 = clogb2 + 1)
    value = value >> 1 ; 
end
endfunction 


// write  
always@(posedge wr_clk) 
begin 
    if(wr_en) begin 
        ram[wr_address] <= din ;
    end
end 

//read 
always@(posedge rd_clk) 
begin 
    if(rd_en) begin 
        dout <= ram[rd_address] ;
    end
end 
endmodule 

top.v

module dig_top #(
  parameter        FIFO_WIDTH        =        8                       ,
  parameter        FIFO_DEPTH        =        8                       ,
  parameter        FIFO_ADDR_WIDTH   =        clogb2(FIFO_DEPTH)      ,
  parameter        NUMBER1           =        8                       ,
  parameter        NUMBER2           =        2                       ,
  parameter        RAM_WIDTH         =        NUMBER1+NUMBER2+1       ,
  parameter        RAM_DEPTH         =        8                       ,
  parameter        RAM_ADDR_WIDTH    =        clogb2(RAM_DEPTH)
)(
  input                                       sys_clk                 ,
  input                                       sys_rst_n               ,
  input                                       wr_en                   ,
  input                                       rd_en                   ,
  input            [FIFO_WIDTH-1 : 0]         din                     ,
  input                                       RAM_rd_en               ,
  input            [RAM_ADDR_WIDTH-1 : 0]     wr_address              ,
  input            [RAM_ADDR_WIDTH-1 : 0]     rd_address              ,
  output    wire   [RAM_WIDTH-1 : 0]          dout 
);


//=============================================================================\
//       define parameter  and  internal  signals                              \
//=============================================================================\

wire     full  ;
wire   empty  ;
wire    [FIFO_WIDTH-1 : 0]   dout1 ;
wire     finish_en        ;
wire    [RAM_WIDTH-1 : 0 ]      dout2  ;





//===============================================================================\
//                next is main code                                               \
//=================================================================================\
function  integer clogb2  ;
    input [31:0] value  ;
    begin
      value = value - 1 ;
      for( clogb2 = 0 ; value > 0 ; clogb2 = clogb2 + 1)
        value = value >>1 ;
    end
  endfunction



FIFO_syn # (
    .WIDTH(FIFO_WIDTH),
    .DEPTH(FIFO_DEPTH),
    .ADDR_WIDTH(FIFO_ADDR_WIDTH)
  )
  FIFO_syn_inst (
    .sys_clk(sys_clk),
    .sys_rst_n(sys_rst_n),
    .wr_en(wr_en),
    .rd_en(rd_en),
    .din(din),
    .full(full),
    .empty(empty),
    .dout(dout1)
  );

  uumultiplier # (
    .NUMBER1(NUMBER1),
    .NUMBER2(2'b10)
  )
  uumultiplier_inst (
    .input1(dout1),
    .input2(2'b10),
    .clk(sys_clk),
    .rst_n(sys_rst_n),
    .begin_en(rd_en),
    .finish_en(finish_en),
    .out(dout2)
  );


  RAM # (
    .WIDTH(RAM_WIDTH),
    .DEPTH(RAM_DEPTH),
    .ADD_WIDTH(RAM_ADDR_WIDTH)
  )
  RAM_inst (
    .wr_clk(sys_clk),
    .rd_clk(sys_clk),
    .wr_en(finish_en),
    .rd_en(RAM_rd_en),
    .din(dout2),
    .wr_address(wr_address),
    .dout(dout),
    .rd_address(rd_address)
  );


endmodule 

top_tb.v

`timescale 1ns/1ns
module top_tb #(
  parameter        FIFO_WIDTH        =        4                       ,
  parameter        FIFO_DEPTH        =        8                       ,
  parameter        FIFO_ADDR_WIDTH   =        3      ,
  parameter        NUMBER1           =        4                       ,
  parameter        NUMBER2           =        2                       ,
  parameter        RAM_WIDTH         =        7       ,
  parameter        RAM_DEPTH         =        8                       ,
  parameter        RAM_ADDR_WIDTH    =        3
);
reg                                       sys_clk                ;
reg                                       sys_rst_n              ;
reg                                       wr_en                  ;
reg                                       rd_en                  ;
reg            [FIFO_WIDTH-1 : 0]         din                    ;
reg                                       RAM_rd_en              ;
reg            [RAM_ADDR_WIDTH-1 : 0]     wr_address             ;
reg            [RAM_ADDR_WIDTH-1 : 0]     rd_address             ;
wire           [RAM_WIDTH-1 : 0]          dout                   ;
reg          [11:0 ] cnt  ;


dig_top # (
    .FIFO_WIDTH(FIFO_WIDTH),
    .FIFO_DEPTH(FIFO_DEPTH),
    .FIFO_ADDR_WIDTH(FIFO_ADDR_WIDTH),
    .NUMBER1(NUMBER1),
    .NUMBER2(NUMBER2),
    .RAM_WIDTH(RAM_WIDTH),
    .RAM_DEPTH(RAM_DEPTH),
    .RAM_ADDR_WIDTH(RAM_ADDR_WIDTH)
  )
  dig_top_inst (
    .sys_clk(sys_clk),
    .sys_rst_n(sys_rst_n),
    .wr_en(wr_en),
    .rd_en(rd_en),
    .din(din),
    .RAM_rd_en(RAM_rd_en),
    .wr_address(wr_address),
    .rd_address(rd_address),
    .dout(dout)
  );

  always   #5   sys_clk  =  ~sys_clk    ;

  initial	begin
    sys_clk		=	1;
    sys_rst_n		=	0;
    #100
    sys_rst_n		=	1;
  end
  always #10 	sys_clk	=	~sys_clk;
  initial  begin 
    sys_clk = 0 ;
    sys_rst_n = 1 ;
    wr_en = 0  ; 
    rd_en = 0 ;
    wr_address = 1 ; 
    rd_address = 1 ;





    #10

    sys_rst_n = 0;

    #10
    sys_rst_n = 1 ;

    #10
    // next is write 
    wr_en  =   1  ;
    rd_en  =   1  ; 

    din = 2 ;
    
// RAM  read 
    RAM_rd_en = 1 ;
  
  end 

endmodule 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1157036.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MATLAB】全网唯一的7种信号分解+ARIMA联合的时序预测算法全家桶

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 大家吃一顿火锅的价格便可以拥有7种信号分解ARIMA组合的时序预测算法&#xff0c;绝对不亏&#xff0c;知识付费是现今时代的趋势&#xff0c;而且都是我精心制作的教程&#xff0c;有问题可随时反馈~也可单独获取某一算…

【三方登录-Apple】iOS 苹果授权登录(sign in with Apple)之开发者配置一

记录一下sign in with Apple的开发者配置 前言 关于使用 Apple 登录 使用“通过 Apple 登录”可让用户设置帐户并使用其Apple ID登录您的应用程序和关联网站。首先使用“使用 Apple 登录”功能启用应用程序的App ID 。 如果您是首次启用应用程序 ID 或为新应用程序启用应用程序…

加速计算卡设计方案:389-基于KU5P的双路100G光纤网络加速计算卡

基于KU5P的双路100G光纤网络加速计算卡 一、板卡概述 基于Xilinx UltraScale16 nm KU5P芯片方案基础上研发的一款双口100 G FPGA光纤以太网PCI-Express v3.0 x8智能加速计算卡&#xff0c;该智能卡拥有高吞吐量、低延时的网络处理能力以及辅助CPU进行网络功能卸载的能力…

SpringBoot配置文件yml文件基础知识

yaml简介 YAML&#xff08;YAML Aint Markup Language&#xff09;&#xff0c;一种数据序列化格式 优点&#xff1a;容易阅读容易与脚本语言交互以数据为核心&#xff0c;重数据轻格式 YAML文件扩展名.yml&#xff08;主流&#xff09;.yamlyaml语法规则 大小写敏感 属性层级…

10.1 am62x平台怎么从ospi启动uboot

本文主要内容: 1 背景(硬件原理图与分区信息) 2 AM62x平台bootloader组成 3 设置SK-AM62B启动方式 4 烧录镜像到OSPI分区 5 解决Message not acknowledgedAuthentication failed!问题 1 背景 Ti的SK-AM62B评估板,通过OSPI接口,连接了一个Nor Flash:S28HS512TGABHM01…

聊天室系统源码 匿名聊天系统源码 在线聊天室系统源码 可发语音 图片 适用PC+WAP

PHP匿名在线聊天室系统源码&#xff0c;适用于PC和WAP端&#xff0c;支持语音和图片传输 通过修改数据库config\settings.php&#xff0c;可以将其用于搭建客户聊天专用的网站 要搭建一个专门用于与客户聊天的网站&#xff0c;您可以使用这个PHP匿名在线聊天室系统源码 该源码…

一文带你速通Sentinel限流规则(流控)解读

目录 前置知识速补 基本介绍 流控模式 直接模式 关联模式 链路模式 流控效果 直接失败 Warm Up&#xff08;预热&#xff09; 排队等待 前置知识速补 QPS每秒查询率(Query Per Second)&#xff1a;每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多…

基于阿基米德优化算法的无人机航迹规划-附代码

基于阿基米德优化算法的无人机航迹规划 文章目录 基于阿基米德优化算法的无人机航迹规划1.阿基米德优化搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用阿基米德优化算法来优化无…

综合实验案例配置

目录 核心交换机与出口路由器的连接 网络出口的配置 策略路由的配置 1.教学楼的流量走电信出口&#xff0c;宿舍楼流量走联通出口&#xff08;基于源&#xff09; 2.访问带内心的服务器走电信出口&#xff0c;访问联通服务器走联通出口 案例图如下&#xff1a; acsw的配置…

二叉树问题——平衡二叉树问题

摘要 本博文主要介绍平衡二叉树问题包括&#xff0c;二叉树的高度差&#xff0c;是否为平衡二叉树&#xff0c;有序链表转二叉搜索树&#xff0c;将二叉搜索树变平衡等。 一、平衡二叉树详解 1.1 判断二叉树是否平衡 /*** Definition for a binary tree node.* public class…

一篇博客读懂顺序表 —— Sequence-List

目录 一、顺序表的初始定义 1.1新建头文件和源文件 1.2 SeqList.h 中的准备工作 二、顺序表的初始化与销毁 三、首尾插入元素 四、首尾删除元素 五、中间插入元素 六、中间删除元素 七、查找指定元素下标 八、源代码 一、顺序表的初始定义 1.1新建头文件和源文件 当我…

zip2john 爆破zip工具

1.使用zip2john工具输出zip文件hash Zip2john 1.zip > 1.txt 2.使用john工具进行zip文件爆破 John 1.txt 如图所示&#xff1a; 该zip密码为19950101

面向Three.js开发者的3D自动纹理化开发包

DreamTexture.js 是面向 three.js 开发者的 3D 模型纹理自动生成与设置开发包&#xff0c;可以为 webGL 应用增加 3D 模型的快速自动纹理化能力。 图一为原始模型, 图二图三为贴图后的模型。提示词&#xff1a; city, Realistic , cinematic , Front view ,Game scene graph 1、…

鸿蒙实现类似于安卓的Handler,鸿蒙的延迟和异步操作

在安卓开发的时候我们想要去延迟处理一些事情可以通过 Handler 解决&#xff0c;比如一秒后处理某些事情&#xff1a; new Handler().postDelayed(new Runnable() {Overridepublic void run() {} },1000);鸿蒙也提供了类似的方法&#xff0c;如下: getUITaskDispatcher().del…

C#,数值计算——积分方程与逆理论Fred2的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public abstract class Fred2 { public readonly double a; public readonly double b; public readonly int n; public double[] t; public double[] f; …

ABBYY16最新pdf文档转换图片、Word、Excel和PPT工具

欢迎来到 ABBYY 软件下载中心&#xff0c;FineReader PDF使专业人员能够最大程度地提高数字工作场所的效率。帮助信息工作者轻松地在同一工作流程中对各种文档进行数字化、检索、编辑、加密、共享和协作。 可以对pdf文档进行各种格式转换&#xff0c;任意转换为图片、Word、Ex…

代码版本控制工具GitLab :从安装到使用一步到位

一、GitLab 是什么&#xff1f; 如果听说过 Git 或者 GitHub&#xff0c;那么 GitLab 你一定也听说过。GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用 Git 作为代码管理工具&#xff0c;并在此基础上搭建起来的 Web 服务。简单理解&#xff1a;GitLab 类似私人版 …

Linux高性能服务器编程——ch12笔记

第12章 高性能I/O框架库Libevent 12.1 I/O框架库概述 基于Reactor模式的I/O框架库包含&#xff1a; 1&#xff09;句柄&#xff1a;与事件源绑定&#xff08;I/O事件、信号和定时事件&#xff09;。当内核检测到就绪事件时&#xff0c;通过句柄来通知应用程序这一事件。I/O事件…

多线程---线程安全的集合类

文章目录 多线程环境使用数组synchronizedListCopyOnWriteArrayList 多线程环境使用队列多线程环境使用哈希表HashTableConcurrentHashMapHashTable VS HashMap VS ConcurrentHashMap 我们原先学习过的集合类&#xff0c;大部分都是线程不安全的。只有Vector、Stack、HashTable…

智能井盖传感器有哪些?万宾科技智能井盖效果

在城市治理过程之中&#xff0c;小小的井盖却成为影响民生的一个重要方面&#xff0c;因为井盖一旦出现问题&#xff0c;会严重影响市民的生命安全&#xff0c;并且传统的井盖一般都会采用人工巡检的方式&#xff0c;这就导致了巡检的难度较大&#xff0c;从而不能对城市各个角…