用 verilog 实现 minst 数字识别

2023-05-16

用verilog实现minst 的数字识别, 可以用modelsim看结果, 如果要部署到fpga上, PL的资源要非常非常多

代码下载:(包含5个仿真文件)

https://download.csdn.net/download/howard789/13715547

https://github.com/howard789/verilog_mnist

以数字2的仿真文件为例, 可以显示以下的结果,因为最终0-9里 数字2的得分最高,所以判断是2, 这里只是要判断最有可能的数字, 就不再化成几率的形式了

 

 

代码里的x坐标和y坐标,是假设在480*272的lcd上显示, 因为minst的像素是28*28的.我们假每4个LCD的像素点代表minst的一个点,那就是在中间红色的区域才是数字显示的区域

部分代码如下,完整代码可以下载

module digital_recognition #(
	parameter	[10:0]		UP			=	108,
	parameter	[10:0]		DOWN		=	164,
	parameter	[10:0]		LEFT		=	212,
	parameter	[10:0]		RIGHT		=	269,
	parameter	[10:0]		EACH_WIDE	=   2,
	parameter           	DEBIT       =   22

)(
	//system signals
	input								clk, 
	input								rst_n,
	
	//binarization 
	input			   [ 7:0]			dq_i,
	input			   [10:0]      		xpos,
	input			   [10:0]      		ypos,

	output	  reg      [ 4:0]		    digit

);

wire res_done_x784;

reg 	[ 2:0]	  done_all_res;

reg  signed [DEBIT:0]  res_0_sum;
reg  signed [DEBIT:0]  res_1_sum;
reg  signed [DEBIT:0]  res_2_sum;
reg  signed [DEBIT:0]  res_3_sum;
reg  signed [DEBIT:0]  res_4_sum;
reg  signed [DEBIT:0]  res_5_sum;
reg  signed [DEBIT:0]  res_6_sum;
reg  signed [DEBIT:0]  res_7_sum;
reg  signed [DEBIT:0]  res_8_sum;
reg  signed [DEBIT:0]  res_9_sum;



//****************************    B输入    *******************************

localparam signed [DEBIT:0]  B_0 = - 23'd4599;
localparam signed [DEBIT:0]  B_1 = - 23'd3332;
localparam signed [DEBIT:0]  B_2 = - 23'd4722;
localparam signed [DEBIT:0]  B_3 = - 23'd5087;
localparam signed [DEBIT:0]  B_4 = - 23'd3820;
localparam signed [DEBIT:0]  B_5 = - 23'd3477;
localparam signed [DEBIT:0]  B_6 = - 23'd4286;
localparam signed [DEBIT:0]  B_7 = - 23'd3446;
localparam signed [DEBIT:0]  B_8 = - 23'd7252;
localparam signed [DEBIT:0]  B_9 = - 23'd5047;


assign rst_valid =((xpos == LEFT - 1) && (ypos == UP +1)) || !rst_n;

always @ (posedge clk or negedge rst_n) begin
	if(rst_n == 1'b0) done_all_res <= 1'b0;
    else done_all_res <= {done_all_res[1:0], res_done_x784};
end

wire		  add_b;
wire		  decide_number;





always @ (posedge clk) begin
	if(!rst_n) 
		digit <= 1'b0;
		
	if(done_all_res[2]) begin	
	/*
		$monitor ($time, ,"res_0_sum = %d",res_0_sum);
		$monitor ($time, ,"res_1_sum = %d",res_1_sum);
		$monitor ($time, ,"res_2_sum = %d",res_2_sum);
		$monitor ($time, ,"res_3_sum = %d",res_3_sum);
		$monitor ($time, ,"res_4_sum = %d",res_4_sum);
		$monitor ($time, ,"res_5_sum = %d",res_5_sum);
		$monitor ($time, ,"res_6_sum = %d",res_6_sum);
		$monitor ($time, ,"res_7_sum = %d",res_7_sum);
		$monitor ($time, ,"res_8_sum = %d",res_8_sum);
		$monitor ($time, ,"res_9_sum = %d",res_9_sum);
*/
        if ((res_0_sum > res_1_sum ) &&(res_0_sum > res_2_sum ) && (res_0_sum > res_3_sum ) && (res_0_sum > res_4_sum ) && (res_0_sum > res_5_sum ) && (res_0_sum > res_6_sum ) && (res_0_sum > res_7_sum ) && (res_0_sum > res_8_sum ) && (res_0_sum > res_9_sum ) )
        	digit <= 4'd0;
		else if ((res_1_sum > res_0_sum ) &&(res_1_sum > res_2_sum ) &&(res_1_sum > res_3_sum ) &&(res_1_sum > res_4_sum ) &&(res_1_sum > res_5_sum ) &&(res_1_sum > res_6_sum ) &&(res_1_sum > res_7_sum ) &&(res_1_sum > res_8_sum ) &&(res_1_sum > res_9_sum ) )
			digit <= 4'd1;
		else if ((res_2_sum > res_0_sum ) &&(res_2_sum > res_1_sum ) &&(res_2_sum > res_3_sum ) &&(res_2_sum > res_4_sum ) &&(res_2_sum > res_5_sum ) &&(res_2_sum > res_6_sum ) &&(res_2_sum > res_7_sum ) &&(res_2_sum > res_8_sum ) &&(res_2_sum > res_9_sum ) )
     		digit <= 4'd2;
     	else if ((res_3_sum > res_0_sum ) &&(res_3_sum > res_1_sum ) &&(res_3_sum > res_2_sum ) &&(res_3_sum > res_4_sum ) &&(res_3_sum > res_5_sum ) &&(res_3_sum > res_6_sum ) &&(res_3_sum > res_7_sum ) &&(res_3_sum > res_8_sum ) &&(res_3_sum > res_9_sum ) )
		     digit <= 4'd3;
		else if ((res_4_sum > res_0_sum ) &&(res_4_sum > res_1_sum ) &&(res_4_sum > res_2_sum ) &&(res_4_sum > res_3_sum ) &&(res_4_sum > res_5_sum ) &&(res_4_sum > res_6_sum ) &&(res_4_sum > res_7_sum ) &&(res_4_sum > res_8_sum ) &&(res_4_sum > res_9_sum ) )
		     digit <= 4'd4;
		else if ((res_5_sum > res_0_sum ) &&(res_5_sum > res_1_sum ) &&(res_5_sum > res_2_sum ) &&(res_5_sum > res_3_sum ) &&(res_5_sum > res_4_sum ) &&(res_5_sum > res_6_sum ) &&(res_5_sum > res_7_sum ) &&(res_5_sum > res_8_sum ) &&(res_5_sum > res_9_sum ) )
		     digit <= 4'd5;
		else if ((res_6_sum > res_0_sum ) &&(res_6_sum > res_1_sum ) &&(res_6_sum > res_2_sum ) &&(res_6_sum > res_3_sum ) &&(res_6_sum > res_4_sum ) &&(res_6_sum > res_5_sum ) &&(res_6_sum > res_7_sum ) &&(res_6_sum > res_8_sum ) &&(res_6_sum > res_9_sum ) )
		     digit <= 4'd6;
		else if ((res_7_sum > res_0_sum ) &&(res_7_sum > res_1_sum ) &&(res_7_sum > res_2_sum ) &&(res_7_sum > res_3_sum ) &&(res_7_sum > res_4_sum ) &&(res_7_sum > res_5_sum ) &&(res_7_sum > res_6_sum ) &&(res_7_sum > res_8_sum ) &&(res_7_sum > res_9_sum ) )
		     digit <= 4'd7;
		else if ((res_8_sum > res_0_sum ) &&(res_8_sum > res_1_sum ) &&(res_8_sum > res_2_sum ) &&(res_8_sum > res_3_sum ) &&(res_8_sum > res_4_sum ) &&(res_8_sum > res_5_sum ) &&(res_8_sum > res_6_sum ) &&(res_8_sum > res_7_sum ) &&(res_8_sum > res_9_sum ) )
		     digit <= 4'd8;
		else if ((res_9_sum > res_0_sum ) &&(res_9_sum > res_1_sum ) &&(res_9_sum > res_2_sum ) &&(res_9_sum > res_3_sum ) &&(res_9_sum > res_4_sum ) &&(res_9_sum > res_5_sum ) &&(res_9_sum > res_6_sum ) &&(res_9_sum > res_7_sum ) &&(res_9_sum > res_8_sum ) )
		     digit <= 4'd9;
		else 
			digit <= 4'd10;     

    end 
end

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用 verilog 实现 minst 数字识别 的相关文章

  • [从零开始学习FPGA编程-24]:进阶篇 - 基本组合电路-编码器与译码器(Verilog语言)

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 125247358 目录 前言 Veri
  • Fsm2 Fsm2

    This is a Moore state machine with two states two inputs and one output Implement this state machine This exercise is th
  • Verilog 显示中不必要的空间

    我正在尝试以十进制显示一些 32 位值 除了 b 和前一个字符之间有奇怪数量的不必要的空格外 这工作正常 例如 如果我有一个 32 位 reg a 其十进制值为 33 我将使用类似的东西 initial begin display a d
  • $readmem 可以在 Verilog 中综合吗?

    我正在尝试在 FPGA 上实现微控制器 我需要为其程序提供一个 ROM 如果我使用 readmemb 它会被正确合成到 ROM 中吗 如果不是 执行此操作的标准方法是什么 这取决于合成工具是否 readmemb是可以合成的 阿尔特拉的推荐的
  • verilog模块中的reg和wire有什么区别?

    在verilog模块中我们什么时候应该使用reg以及什么时候应该使用wire 我还注意到有时输出会再次声明为 reg 例如 D 触发器中的 reg Q 我在某处读过这个 过程赋值语句的目标输出必须是 reg 数据类型 什么是程序赋值语句 我
  • 比较数字进行排序然后得到中值

    使用按位或比较运算符对五个整数进行排序可以通过以下方式实现 首先获取最大的数字 然后获取第二大的数字 然后获取第三大的数字 依此类推 这是我获取最高数字的代码 include
  • 使用数据流模型的T触发器

    我正在尝试模拟 t flipflop 的工作 timescale 1ns 1ps module t flipflop input t input clk input clear output q output qbar wire sbar
  • [Verilog] Verilog 基本格式和语法

    主页 元存储博客 全文 3000 字 文章目录 1 声明格式 1 1 模块声明 1 2 输入输出声明 1 3 内部信号声明 1 4 内部逻辑声明
  • 使用forever和always语句

    以下两个代码都会生成一个时钟 我需要知道除了时钟生成之外 永远循环是否还有其他用途 我只在时钟一代中遇到过永远 如果只是为了这个目的 那岂不是毫无用处 initial begin clk 0 forever begin 5 clk clk
  • 如何在RTL中使用时钟门控?

    我正在对一些时钟进行门控latch以及我设计中的逻辑 我在综合和布局布线方面没有太多经验 在 RTL 中实现时钟门控的正确方法是什么 示例1 always comb begin gated clk clk latch update en e
  • 在逻辑中使用单端端口期待差异对?

    我使用的逻辑被设置为需要一个差分对时钟端口 然而 对于一个特定的应用程序 我只能输入一个单端时钟 由于硬件限制 修改逻辑以接受单端时钟不是一种选择 因为涉及许多文件和代码行 有没有办法可以输入单端端口并以某种方式将其馈送到模块的差异对端口
  • Verilog 错误:必须连接到结构网络表达式

    我收到错误 output or inout port Qout must be connected to a structural net expression 我评论了下面代码中发生错误的行 代码被修剪 压缩 我搜索了答案 似乎我无法将输
  • Verilog 中的“net”代表什么?

    我刚刚开始学习Verilog 据我了解 Verilog有net数据类型 什么是net代表 网络就是这样一种数据类型 您不使用它来存储值 它们代表物理连接 您可以将线路视为一种网络数据类型 你可以去网上看看更多here http www ee
  • 如何使用 don't cares 参数化 case 语句?

    我有一条称为输入的电线 我想检测前导的数量 我正在尝试创建一个模块 该模块使用下面的 case 语句根据前导零的数量更改输出数据 然而 输入的大小是可参数化的 如果 X 是固定值 4 我将创建一个 case 语句 case input 4
  • 我们可以在 C 或 SystemVerilog 中使用 ifdef MACROS 中的条件吗?

    我想要那样的东西 ifdef N O gt N I define GREATER 1 else define LESSER 1 endif 但做不到 有什么解决方案或阅读吗 我很努力地想要做到这一点 但是却做不到 Verilog 不提供这样
  • 在 Verilog 中判断总线是否包含单个 x 的最佳方法是什么?

    我有一个监控总线的测试台 总线内的一些信号 位 可以是 1 bx 由于多种原因 我需要知道总线内是否有任何信号是 1 bx 如果总线包含任何 x 测试 不用于综合 仅用于模拟目的 的最佳方法是什么 我曾希望我可以使用减少或然后使用 但这似乎
  • 为什么 Verilog 不被视为编程语言? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 教授在课堂上说学生不应该说他们学会了用Verilog 编程 他说 Verilog 之类的东西不是用来编程的 而是用来设计的 那么 Verilog
  • 在 Verilog 程序中使用连续分配?

    在 Verilog 程序中使用连续赋值是否可能和 或有用 例如 是否有任何理由将assign里面一个always堵塞 例如这段代码 always begin assign data in Data end 此外 是否可以用这种方法生成顺序逻
  • Verilog 按位或 ("|") 单子

    我见过 Verilog 代码 其中使用了按位或运算符 目的是什么 例如 address 15 14 0 or address 15 14 io din ramrd 不能省略 吗在这些情况下 在这种情况下 它充当归约运算符 例如 4 b100
  • 具有内部赋值延迟的阻塞和非阻塞语句之间的区别

    以下 2 个 verilog 代码片段有什么区别 1 always in out 5 in AND 2 always in out lt 5 in 考虑到always块中不存在其他行 输出会有什么不同吗 问题参考幻灯片 16 参见 o5 和

随机推荐

  • VINS、MAVROS等的坐标系统一(草稿,未得出明确结果)

    由于不同算法之间的坐标系不同 xff0c 导致计算的结果混乱 xff0c 该博客的目的是记录和统一不同算法之间的坐标系 xff0c 保证坐标系的统一 一 VINS算法 vins算法 xff0c 使用D435I相机 该坐标方向为 xff1a
  • ROS学习笔记9-创建ros消息和服务

    该节内容主要来自于官方文档的两个小节 xff1a 1 使用rosed来编辑 2 创建ros消息的服务 先来看rosed xff1a rosed rosed命令是rosbash的一部分 xff0c 使用rosed可以直接编辑包中的一个文件 x
  • CUAV RTK初步使用体验和感受

    记录使用RTK进行无人机定位并操作的使用体验 一 RTK定位设置 使用的是CUAV制作发售的RTK xff0c 型号为C9P xff0c 目前该产品已经下架 xff0c 上新了C9PS 并不需要太多的设置 xff0c 在飞控接入RTK后 x
  • 记录一次WIN11开机在登录页面循环的问题

    记录一次由于未进行win密码设置 xff0c 导致开机后卡在登录界面无法登录进去的问题 最后完美解决了 1 背景 开机后 xff0c 显示用户登录界面 xff0c 但是和以往不同 xff0c 没有了密码输入框 xff0c 只有一个 登录 按
  • Ubuntu中增加串口的缓冲区

    增加串口缓冲区 xff0c 用于尝试解决px4 ros中显示TX溢出的问题 以下大部分代码和内容均有CHATGPT生成 xff0c 代码已经通过验证 一 通信溢出问题 PX4和ROS的通信溢出可能是由于几个原因造成的 以下是一些建议 xff
  • GRBL代码使用与修改

    下载官方grbl代码 xff0c 并进行修改使其正确 1 问题 xff1a 购买了328p单片机 xff0c 购买了grbl的底板 xff0c 但是烧录之后无法正常使用 问题发现 xff1a 引脚错误了 xff0c 官方代码中的引脚需要修改
  • ubuntu使用rc.local开机自启USB设备读写权限

    无人机飞控为ACM0 xff0c 串口USB为USB0 xff0c 使用rc为其开机自启给与权限 大部分由chagpt生成 xff0c 已验证 首先 xff0c 创建一个新的 etc rc local 文件 xff08 如果尚不存在 xff
  • Friendlycore增加inodes数量

    背景 xff1a 为Nanopim1安装了core系统 xff0c tf卡大小64G xff0c 安装后正常扩展到了整个tf卡 xff0c 但是在安装hass的docker显示磁盘空间不够 xff0c 最终发现是inode被用完了 其ino
  • UORB

    转载地址 xff1a http blog arm so armteg pixhawk 183 0503 html Pixhawk 飞控 系统是基于ARM的四轴以上飞行器的飞行控制器 xff0c 它的前身是PX4 IMU xff0c Pixh
  • rCS启动脚本分析

    转载地址 xff1a http wellmakers com p 61 401 还有一篇很重要的文章 xff0c 讲述了整个系统的大致启动过程 xff1a http blog chinaunix net uid 29786319 id 43
  • PID通俗解释

    转载地址 xff1a http blog gkong com liaochangchu 117560 ashx PID是比例 积分 微分的简称 xff0c PID控制的难点不是编程 xff0c 而是控制器的参数整定 参数整定的关键是正确地理
  • Kali Linux中安装Xfce的步骤2-1

    Kali Linux默认安装的是桌面环境是Gnome xff0c 可以通过以下方法在Kali Linux中安装Xfce xff0c 从而修改其桌面环境 1 Xfce介绍 Xfce是XForms Common Enviroment的简写 其可
  • STM32CubeMX教程之简介及基本使用

    STM32CubeMX是意法半导体推出的图形化配置工具 xff0c 通过傻瓜化的操作便能实现相关配置 xff0c 最终能够生成C语言代码 xff0c 支持多种工具链 xff0c 比如MDK IAR For ARM TrueStudio等 尤
  • Linux 文件流与目录流管理

    Linux 应用开发 04 文件流与目录流管理 本课目标 1 编程目标 xff1a a 实现磁盘文件的拷贝操作 b 缓冲区类型对磁盘真正写入操作的影响 2 理解文件流操作以及缓冲区概念 3 掌握ansi c 文件流相关操作函数 4 理解与掌
  • tensorflow InvalidArgumentError: Cannot serialize protocol buffer of type tensorflow.GraphDef 错误分析

    训练nfm模型 xff0c 每2000个step进行保存 一开始模型训练正常 xff0c 但是在使用tf train Saver的save方法保存模型时出现了如下错误 xff1a tensorflow python framework er
  • 7年厨师想转行程序员

    7年厨师想转行 xff0c 跟我学java 可是工资只有7千我惊呆了 xff0c 我还以为7年厨师工资至少1万多呢 看来每个行业都有工资高也有工资低的 xff0c 他可能属于厨师里工资低的吧
  • 八款值得尝试的精美的Linux发行版,你用过哪几款?

    Linux发行版各式各样 xff0c 每个发行版都有自己的特点 xff0c 在这篇文章中 xff0c 将会列出让一些另 Linux 用户印象最深刻且精美的 Linux 发行版 xff0c 包括对初学者友好和流行的发行版 elementary
  • VINS-mono 解析 生成用于回环检测的字典文件

    VINS回环检测使用的是FAST xff08 Features from Accelerated Segment Test xff09 特征点检测 xff0c 并利用BRIEF描述子存储特征 挑选了两个实时性较好的检测和描述 BRIEF提供
  • 将git下载的c++项目用vs打开

    首先确定下载的项目里包括CMakeLists txt的文件 然后在文件所在目录用cmd或power shell输入以下命令 以2017版本为例 cmake G 34 Visual Studio 15 2017 Win64 34 中间那个 表
  • 用 verilog 实现 minst 数字识别

    用verilog实现minst 的数字识别 可以用modelsim看结果 如果要部署到fpga上 PL的资源要非常非常多 代码下载 包含5个仿真文件 https download csdn net download howard789 13