FPGA 入门 (二)

microblaze读写fpga寄存器_FPGA入门(二) 一、FPGA学习路线  工具使用 -> 语法学习 -> 逻辑设计 -> IP使用 ->接口设计 -> 时序分析 -> 片上系统1、工具使用  Altera:Quartus II  Xlinx: Vivado2、语法学习  Verilog HDL(FPGA设计的是电路)3、 逻辑设计  组合逻辑:多路选择器、加法器、译码器、乘法器 ·······  时序逻辑:计数... 阅读详情
verilog基本语法

常用可综合语法:

模块声明:module ... endmodule

端口定义:input,output,inout。

信号类型:wire,reg,tri等,integer常用于for语句中(reg,wire是最常用的,一般tri和integer用在测试脚本中)

参数定义:parameter。

运算符操作:各种逻辑操作符、移位操作符、算数操作符大多是可综合的(注:===与!==是不可综合的)。

比较判断:if ... else,case (casex, casez) ... default ... endcase。

连续赋值:assign,问号表达式(?:)。

always块:敏感列表可以为电平、沿信号posedge/negedge;通常和@连用。

begin ... end:通俗的说就是C语言里的{}。

任务定义:task ... endtask。

循环语句:for 跟C用法类似,但变量不能做++, 只能i=i+1这样。基本在可综合模块中不使用。

赋值符号:=和<=(阻塞赋值和非阻塞赋值)


小例子及testbench介绍

描述一个异步D触发器模块:


文件ex_module.v 定义可综合模块

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. module ex_module(                          //模块名字和文件名字要一样  紧接着接口列表  
  2.         input        wire                sclk,    //时钟命名 sclk  
  3.         input        wire                rst_n,   // reset_n  复位时低复位  
  4.         input        wire    [7:0]       d,       //模块声明的时候,输入必须是wire变量  
  5.         output       reg     [7:0]       q        //reg变量必须在always块里面来赋值,模块声明的时候,输出可以是wire变量也可以是reg    
  6. );  
  7. //异步D触发器  
  8. always @(posedge sclk or negedge rst_n) //敏感列表 可以包括电平触发或者沿触发  
  9.         if (rst_n == 1'b0) //条件表,这里是组合逻辑  还有其他表达方式 2'b01  8'b0000_1111     8'd10    8'h0f  
  10.                 q<=8'h00;              
  11.         else  
  12.                 q<=d;  
  13. //alway块中只能给reg类型变量赋值,wire会报错,如果是wire型变量 可以用assign 语句赋值  
  14. endmodule  

    可综合模块写完后,需要用仿真测试去验证设计的正确性。可以编写testbench模块,在结合modelsim仿真就可以看到前仿真的结果。

文件tb_ex_module.v 定义激励模块

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. `timescale 1ns/100ps  //单位时标声明 精度到100ps 小数点前是ns 例 10.1 就是10ns + 100ps 而10.11就达不到精度了  
  2. module tb_ex_module; //激励模块声明时不需要端口列表  
  3. reg  [7:0] d_r;  
  4. reg sclk_r, rst_n_r;//激励信号的声明  
  5. wire   [7:0] q; //原始模块输出信号连接线  
  6.       
  7. initial   //上电初始化过程  上电只只执行一次  
  8. begin //顺序执行  initial块内只能对寄存器变量赋值  
  9.     d_r <= 0;  
  10.     sclk_r <= 0;  
  11.     rst_n_r <= 0;  
  12.     #20  
  13.     rst_n_r <= 1;  
  14. end  
  15.   
  16. initial  
  17. begin  
  18.     #20  
  19.     send_d();  
  20. end  
  21.       
  22.       
  23. always #10 sclk_r <= ~sclk_r; //产生时钟,循环震荡周期 一个周期用时20ns  
  24.   
  25.     
  26.  //例化的方法  
  27.  //原始的名字 例化的名字(激励信号名字 可以自定义)  
  28.  ex_module ex_module_inst(  
  29.   .sclk (sclk_r),               //.后面是原模块的  ()里面是连接的当前模块的 这样通道就打开了  
  30.   .rst_n (rst_n_r),  
  31.   .d (d_r),  
  32.   .q  (q)  //如果是输出变量 ()中必须是wire变量  
  33.  );  
  34.       
  35. task send_d();  
  36.     integer i;  
  37.     begin  
  38.         for (i = 0; i < 255; i = i + 1)  
  39.         begin  
  40.             @(posedge sclk_r)//卡一个时钟拍子  
  41.             d_r <= d_r + 1;  
  42.         end  
  43.     end  
  44. endtask  
  45. endmodule  


modelsim仿真结果


testbench编写可以归纳为:

1)对被测试设计的顶层接口进行例化。

2)给被测试设计的输入接口添加激励。

3)判断被测试设计的输出响应是否满足设计要求。



有限状态机FSM

    硬件设计多是并行实现的,但对于实际的工程应用,往往需要让硬件来实现一些具有一定顺序的工作,这样就用到了状态机的思想。简单的说状态机就是通过不同的状态迁移来完成一些特定的顺序逻辑。

如何设计状态机

1)根据实际的工作流程画出状态迁移图。

2)根据状态迁移图来编写代码。

假如有两个开关K1和K2会随着条件A的值变化而变化。


ex_fsm.v 可综合模块

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. module ex_fsm(  
  2.     input       wire        sclk,  
  3.     input       wire        rst_n,  
  4.     input       wire        A,  
  5.     output      reg         k1,  
  6.     output      reg         k2  
  7. );  
  8.   
  9. parameter IDLE  =   4'b0001; //使用独热码来定义状态  
  10. parameter START =   4'b0010;  
  11. parameter STOP  =   4'b0100;  
  12. parameter CLEAR =   4'b1000;  
  13.   
  14. reg [3:0] state;  
  15.   
  16. //状态机只对状态进行处理,不对变量进行处理  
  17. always @(posedge sclk or negedge rst_n)  
  18.     if (rst_n == 1'b0)  
  19.         state <= IDLE;  
  20.     else begin  
  21.         case (state)  
  22.             IDLE: if (A == 1'b1)  
  23.                     state <= START;  
  24.             START: if (A == 1'b0)  
  25.                     state <= STOP;  
  26.             STOP: if (A == 1'b1)  
  27.                     state <= CLEAR;  
  28.             CLEAR: if (A == 1'b0)  
  29.                     state <= IDLE;  
  30.             default:  
  31.                 state <= IDLE;  
  32.             endcase  
  33.     end  
  34.   
  35. //变量单独写在一个always块中  
  36. always @(posedge sclk or negedge rst_n)  
  37.     if (rst_n == 1'b0)  
  38.         k1 <= 1'b0;  
  39.     else if (state == IDLE && A == 1'b1)  
  40.         k1 <= 1'b0;  
  41.     else if (state == CLEAR && A == 1'b0)  
  42.         k1 <= 1'b1;  
  43.   
  44. always @(posedge sclk or negedge rst_n)  
  45.     if (rst_n == 1'b0)  
  46.         k2 <= 1'b0;  
  47.     else if (state == STOP && A == 1'b1)  
  48.         k2 <= 1'b1;  
  49.     else if (state == CLEAR && A == 1'b0)  
  50.         k2 <= 1'b0;  
  51.       
  52. endmodule  

tb_ex_fsm.v 激励模块

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. `timescale 1ns/1ns  
  2. module tb_ex_fsm;  
  3.   
  4. reg     sclk_r;  
  5. reg     rst_n_r;  
  6. reg     in_A;  
  7. wire    k1;  
  8. wire    k2;  
  9.   
  10. initial  
  11. begin  
  12.     rst_n_r <= 1'b0;  
  13.     sclk_r <= 1'b0;  
  14.     #50  
  15.     rst_n_r <= 1'b1;  
  16. end  
  17.   
  18. initial  
  19. begin  
  20.     in_A <= 1'b0;  
  21.     #60  
  22.     send_A();  
  23. end  
  24.   
  25. always #10 sclk_r <= ~sclk_r;  
  26.   
  27. ex_fsm ex_fsm_inst(  
  28.     .sclk   (sclk_r),  
  29.     .rst_n  (rst_n_r),  
  30.     .A      (in_A),  
  31.     .k1     (k1),  
  32.     .k2     (k2)  
  33. );  
  34.   
  35. task send_A();  
  36.     integer i;  
  37.     begin  
  38.         for (i=0; i< 512; i=i+1)  
  39.         begin  
  40.             @(posedge sclk_r)  
  41.             if (i<40)  
  42.                 in_A <= 1'b0;  
  43.             else if (i<80)  
  44.                 in_A <= 1'b1;  
  45.             else if (i<120)  
  46.                 in_A <= 1'b0;  
  47.             else if (i<160)  
  48.                 in_A <= 1'b1;  
  49.             else if (i<200)  
  50.                 in_A <= 1'b1;  
  51.         end  
  52.     end  
  53. endtask  
  54.   
  55. endmodule  

如果每次用modelsim都手动添加仿真很麻烦,可以写一个run.do的自动仿真脚本

文件run.do 脚本

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #退出当前的仿真工程  
  2. quit -sim  
  3. #清空命令行  
  4. .main   clear  
  5. #创建库  
  6. vlib work  
  7. #将逻辑库的名字映射到实际物理路径上来  
  8. vmap    work ./work  
  9. #编译代码文件到逻辑库work中  
  10. vlog    -work   work    ./tb_ex_fsm.v  
  11. vlog    -work   work    ./../design/*.v  
  12. #启动仿真  
  13. vsim    -voptargs=+acc work.tb_ex_fsm  
  14. #添加波形  
  15. #定义宏  
  16. virtual type {  
  17.     {01 IDLE}  
  18.     {02 START}  
  19.     {04 STOP}  
  20.     {08 CLEAR}  
  21. } vir_new_signal  
  22. add wave    tb_ex_fsm/*  
  23. virtual function {(vir_new_signal)tb_ex_fsm/ex_fsm_inst/state} new_state  
  24. add wave -color yellow tb_ex_fsm/ex_fsm_inst/new_state  
  25. run 100us  

目录结构

modelsim在sim文件夹下建立工程,在modelsim的命令行中执行do run.do就可以自动仿真波形了。

modelsim仿真结果

FPGA入门——EEPROM读写例程(二 代码) 写一个数据(0x12)到EEPROM(AT24C04)的地址0, 再读出地址0的内容。 阅读详情

相关推荐

基于FPGA的图像处理(二)--System Generator入门

System generator 安装之后会在Simulin模块库中添加一些Xilinx FPGA专用的模块库,包括Basic Element,Communication,Control Logic,DataTypes,DSP,Math,Memory,Shared Momory,Tool等模块库,只有使用这里的模块才能进行FPGA算法的仿真以及进行综合等等。 ...

weixin_30362083的博客 2371

FPGA的设计艺术(12)使用parameter构建可重用的逻辑设计

与大多数编程语言一样,我们应该尝试使尽可能多的代码可重用。 这使我们可以减少将来项目的开发时间,因为我们可以更轻松地将代码从一种设计移植到另一种设计。

Reborn Lee 3078

FPGA中的localparam与parameter的区别

FPGA编程中,参数是一种非常重要的元素。在FPGA设计中,参数可以用于定义各种特性和功能,这使得FPGA编程更加灵活和可配置。而在参数中,localparam和parameter也是两个常见的概念。在FPGA设计中,如果需要设置常量值或计算参数,可以使用localparam。而如果在不同模块间共享同一参数,且这个参数需要在完成后仍然可调整,则应使用parameter。因此,在实际设计时,需要根据具体应用场景来选择使用哪种参数方式。它可以在所有模块中使用,并且其值可以在编写完成后进行修改。

code_welike的博客 1647

关于FPGA设计中的参数化设计

if(!endmodule总体分为两种引入方式,一种是使用parameter参数,一种是添加端口。采用第一种方式时,可以采取两种方式传入数据,各有优缺点吧,defparam书写起来简单,但是模块例化过多时容易晕,而例化时传入则非常容易区分和维护,但要注意其书写方式,比较容易出现语法错误。二是定义端口时添加一个input数据输入端口。

李亚琦的博客 986

【C++ 使用libxlsxwriter库向excel表格中插入图片 CMake + VS2019】

使用libxlsxwriter向excel表格插入图片

恒星游历者的博客 755

信捷 XDH Ethercat 正负极限配置详解与实战技巧

本文详细解析了信捷XDH系列PLC通过EtherCAT总线配置伺服电机正负硬极限的完整流程与实战技巧。内容涵盖硬件开关选型安装、EtherCAT IO信号映射、软件参数设置(包括关键的极性配置)、调试验证方法,以及硬极限与软极限的协同策略。重点阐述了如何避免常见配置错误,确保运动控制系统的最后一道物理安全防线可靠有效,为工程师提供从理论到实践的全面指导。

wdx012345的博客 601

Verilog学习之路

Verilog编程规范1.不允许在冒号前后==同时==出现变量。 1.不允许在冒号前后同时出现变量。 在已知所需位宽的情况下,可使用":-“或”:+"代替;比如我们有一个变量i,我们需要取出从i×8+7到i×8这8位数据,直接写[i×8+7:i×8]是会报错的。正确的写法是: [8×i+7 -: 8] ...

TMDBYC的博客 2448

Windows摄像头错误0xA00F4240根因与注册表修复指南

Windows摄像头错误码0xA00F4240常被误判为硬件故障,实则源于UWP应用模型下权限调用链断裂——核心是COM组件调用失败(HRESULT 0x80004003),本质反映Windows Runtime API对注册表策略键值(如CapabilityAccessManager\ConsentStore\webcam)的强依赖。该机制涉及服务状态、DWORD权限配置、ACL继承控制等多层校验,任一环节异常(如ValueLastModified时间戳损坏或ALL APPLICATION PACKAGE

weixin_31742871的博客 389

Verilog的词法约定

Verilog的词法约定 1           Verilog是大小写相关的,其中的关键字全部为小写。 2           空白符由空格、制表符、和换行符组成。 3           单行注释以“//”开始,verilog将忽略此处到行尾的内容。多行注释以“/*”开始,以“*/”结束。多行注释不允许嵌套 4           操作符有三种:单目操作符、双目操作符和三目操作符。

xiangyuqxq的专栏 1064

【亲测有效】OpenClaw Gateway 出现 “(no output)“ 卡死问题完整解决指南:从手动重启到 systemd Watchdog 自动恢复

最近在使用 OpenClaw(自托管 AI 助手框架,前身 Clawdbot/Moltbot)时,遇到了一个非常常见的顽疾:TUI(终端界面)或 Telegram 等通道经常显示 "(no output)",消息发出去后机器人完全没反应,看起来像是卡死了。

hampeter的博客 8609

WVP+ZLM国标平台实战:从设备注册失败到视频播放黑屏,我遇到的5个典型问题与解法

部署WVP+ZLM国标视频平台时,设备注册失败、视频播放黑屏等问题常常让运维人员头疼不已。本文将基于真实运维场景,剖析五个最具代表性的故障案例,提供从网络配置到版本兼容性的全链路解决方案。

weixin_33178839的博客 362

3级调度 fpga_FPGA基础入门(二)

01—FPGA与ASIC的比较ASIC是英文的ApplicaTIonSpecificIntegratedCircuits缩写,即专用集成电路,是指应特定用户要求和特定电子系统的需要而设计、制造的集成电路。目前用CPLD(复杂可编程逻辑器件)和FPGA(现场可编程逻辑阵列)来进行ASIC设计是最为流行的方式之一,它们的共性是都具有用户现场可编程特性,都支持边界扫描技术,但两者在集成度、速度...

weixin_39981632的博客 401

具身智能中的(VLA)算法与实践——第一讲 基础与概览

本文介绍了视觉-语言-动作(VLA)模型的基础概念及其在AI领域的重要性。VLA模型通过融合多模态数据实现具身智能,使AI系统能感知环境并执行物理动作。文章探讨了大型语言模型(LLMs)和视觉语言模型(VLMs)如何赋能具身智能,包括指令解析、场景理解和动作规划。同时提供了Python、PyTorch/TensorFlow开发环境的详细搭建指南,包含GPU配置建议和测试代码。VLA模型在机器人操作、导航、人机协作等领域具有广泛应用前景,是实现通用人工智能的关键技术。

u012133341的博客 1599

[FPGA] 基于Vivado的FPGA开发基础保姆级入门教程(二)

本文详细介绍了3-8译码器的FPGA实现过程。首先阐述了3-8译码器的功能原理:将3位二进制输入映射为8位唯一输出。接着通过Vivado工具逐步演示了工程创建、Verilog代码实现(使用case语句实现译码功能)、综合验证和功能仿真(Modelsim)的完整流程。文中重点展示了测试平台的搭建方法,包括输入激励生成和波形验证,确保译码器能正确处理所有8种输入组合。最后简要提及了布局布线和时序分析环节,为后续进阶学习打下基础。整个过程涵盖了从设计定义到功能验证的完整FPGA开发流程。

weixin_59711525的博客 1700

YOLOv10改进,YOLOv10二次创新C2f结构采用WTConv卷积(感受野的小波卷积),ECCV 2024

WTConv 的核心思想是通过结合卷积神经网络(CNN)的强大特征提取能力与小波变换的多尺度特性,来实现大感受野的卷积操作,同时避免传统大卷积核带来的参数爆炸问题。传统的卷积操作通过滑动小窗口在图像上逐步执行局部特征提取,感受野的大小直接取决于卷积核的尺寸。随着卷积核的增大,参数量呈指数增长,导致网络训练效率降低、计算资源消耗增加。为解决这些问题,WTConv 提出了在小波域中执行卷积操作的策略。小波变换是一种常用于信号处理的技术,能够将信号分解为不同频率成分。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1024

一文读懂 SAP ICF Services:从 SICF 激活到 ABAP OData V2/V4 安全与实战

本文系统化介绍了ABAP系统中ICF服务的关键概念及实践要点。主要内容包括:ICF服务的核心安全机制,需显式激活才能响应HTTP请求;在SICF中正确激活服务的操作步骤;OData V2/V4服务所需的不同ICF节点配置,如V4统一入口节点/sap/opu/odata4;典型问题如default_host未激活会导致HOST_INACTIVE错误;安全实践包括CSRF防护机制和权限对象(S_ICF_ADM)配置;以及实际案例分析和常见ICF服务节点的功能说明。文章为ABAP开发者与运维人员提供了ICF服务管

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 472

FPGA 入门笔记(二)

本节课中,我们一起学习了如何为Femto RV RISC-V处理器创建并集成一个自定义的硬件PWM外设。我们从理解其内存寻址机制开始,然后设计了PWM驱动器的工作原理,编写并仿真了Verilog代码,最后将其集成到SOC中并编写了控制软件。这个过程涵盖了硬件描述、仿真验证、系统集成和软件驱动开发的基本流程。本节没有具体的挑战任务,但我鼓励你尝试为Femto RV处理器制作自己的硬件外设。这可以是任何你想要的东西,比如SPI驱动器或控制NeoPixel的东西。

龙哥盟 191

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

FPGA入门:二选一多路选择器

FPGA入门学习第一例:二选一多路选择器。

程序员仓库 3066

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

FPGA入门的必经之路(二)

所谓必经之路,每一条都是不可或缺的。这里也就是给大家指个路,等你真正上路了,会发现路上有花有草有风景,有风有雾还有坑!看似每条只有简单几句,其实都要用心去看资料,去理解,去实践。花花草草的你自己去欣赏,遇到绕不过去的坑,要自己淌一淌,实在淌不过去,你来找我,抽空可以扶你一把。 废话不多说了,继续往下写: 5、了解时钟的概念,什么是占空比,抖动和偏斜等,时钟就像FPGA的真气,所有的功力都是真气...

鸟哥的博客 1029

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

新手入门Makefile:FPGA项目实战教程(二)

本文是FPGA项目实战教程系列的第二部分,重点介绍Makefile在FPGA开发中的实际应用。文章提供了一个完整的LED闪烁项目Makefile示例,包含项目创建、文件添加、综合、实现和生成比特流等关键步骤。同时详细讲解了Tcl脚本在Vivado中的重要作用,包括项目管理命令、文件管理命令、综合与实现命令等核心功能。教程还提供了一个完整的Tcl脚本示例,展示了从项目创建到比特流生成的全流程自动化实现方法,帮助开发者提高FPGA开发效率。

现任某外企的算法工程师!专注于人工智能、嵌入式、FPGA、论文写作四大主题的教程和经验分享!辅导请➕v :sci666888999 1417

FPGA入门系列16--SPI②

本系列文章主要针对FPGA初学者编写,包括FPGA的模块书写、基础语法、状态机、RAM、UART、SPI、VGA、以及功能验证等。将每一个知识点作为一个章节进行讲解,旨在更快速的提升初学者在FPGA开发方面的能力,每一个章节中都有针对性的代码书写以及代码的讲解,可作为读者参考。

mochenbaobei的博客 663

【FPGA入门教程】(二)FPGA学习路线及开发流程

一、FPGA学习路线   工具使用 -> 语法学习 -> 逻辑设计 -> IP使用 ->接口设计 -> 时序分析 -> 片上系统 1、工具使用   Altera:Quartus II   Xlinx: Vivado 2、语法学习   Verilog HDL(FPGA设计的是电路) 3、逻辑设计   组合逻辑:多路选择器、加法器、译码器、乘...

Mculover666的博客(嵌入式) 5830

FPGA入门学习笔记(一)Vivado设计二选一多路器

FPGA入门学习笔记(一)Vivado设计二选一多路器

weixin_45463952的博客 1710

FPGA入门学习verliog语言二case

2、

小吕的博客 1605

FPGA(二)Verilog语法入门(二)

学习板:ZYNQ7020 Verilog语法入门(二)一、模块1、简述2、模块声明3、端口定义4、信号类型声明5、逻辑功能描述(1)assign持续赋值描述(2)always过程块描述(3)调用内置门元件描述二、过程语句(一)always语句1、敏感信号列表2、posedge与negedge关键字3、敏感列表的通配符(二)initial语句三、块语句(一)串行块begin-end(二)并行块fork-join四、赋值语句(一)持续初值语句assign(二)过程赋值语句<=、=1、阻塞赋值2、非阻塞赋值

Curnane0_0的博客 2354

FPGA入门(二)

学习 Quartus-II 、Platform Designer、Nios-II SBT 的基本操作;初步了解 SOPC 的开发流程,基本掌握 Nios-II 软核的定制方法;掌握 Nios-II 软件的开发流程,软件的基本调试方法。 并完成以下①流水灯显示②串口循环输出“Hello Nios-II" 1.打开Quatus,点开Tools,打开Qsys (Platform Designer) 2.创建工程 3. ...

tyro_00的博客 557
上一篇: FPGA 入门 (一)
下一篇: uart 编程
sloongz
博客等级 码龄11年 71粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值