当前位置: 首页 > news >正文

《深入浅出玩转FPGA》 - 教程

可以综合的verilog 语法:

        case语句:

                case:最常见的case 语句;

                                可以检测”case(item)“ item 的x 和z 态

                casex :

                        忽略item 内的x 和 z 态度

                        不建议使用,忽略x 会造成x 的传播和扩散。

                casez:     

                        忽略item 内的z 态,也可以使用? 表示不关心的z 态;

                        可以实现item 组匹配(多个item 合并),简化代码;


        for loop:

                常用于根据reg的大小,对固定位置的bit 进行复制。 index i 需要做声明。

                支持在for 内/外部声明  for(interger i =0;i < cnt;i=i+1)begin  end

                                                        integer i ; for(i=cnt;i>=0;i=i-1)begin  end 

        `ifdef   `else `endif  /  `ifndef  `def  `endif

                先解释下: define   parameter 和localparameter的区别 

                        define的定义在整个工程下都有效;

                        parameter  常用于module的参数化声明;

                        localparameter 常用于对FSM的状态声明,仅仅对本module内有效;

               使用`ifdef  语句可以实现两套代码的隔离:

                ①比如 常见单 bit同步器,在FPGA 代码下: 手写2级DFF 打拍逻辑

                                                      在ASIC 代码 下: 使用专用同步器cell

                                            note: 专用同步器cell 保证2级DFF在布局布线距离最小,减少亚稳态 

    ②再比如,写代码时。 设计需要考虑igc(intergreated  gating clock)的写法和非igc的写法。 

        任务定义 task... endtask

        在使用sv 做简单代码仿真时,常用task 和 function 。function 不允许有延时逻辑。task 可以有延时逻辑。  但是在写verilog 逻辑代码时,很少使用task 。

        最近看了别人的代码,有使用task 语句试下状态机的跳转; 使能信号的开关等逻辑。  

 使用task后的代码,封装了相关联信号的赋值。 简化代码后的代码层次分明,便于阅读和查错。 

/* State tasks */
task set_state;input [3:0]state_next;beginstate <= state_next;state_new <= 1'b1;flow <= FLOW_FORBIDDEN;end
endtask
task clr_state;beginstate_new <= 1'b0;end
endtask
task set_flow;input [3:0]flow_next;beginflow <= flow_next;end
endtask
/* Flow Control State Machine (FCSM) */
always @(posedge aclk) beginif (aresetn == 1'b0) beginset_state(STATE_STARTUP);request_valid <= 1'b0;port_dst <= 0;status_valid <= 1'b0;status_frames <= 0;status_dropped <= 0;status_error_crc <= 0;status_error_len <= 0;fifo_rst <= 1'b0;fifo_rcnt <= 0;end else begincase (state)STATE_STARTUP: beginstatus_valid <= 1'b1;set_state(STATE_IDLE);endSTATE_IDLE: beginset_state(STATE_INCOME);end
......

状态机:

        一段式状态机: 

                        时序逻辑: 状态跳变,状态跳变条件和输出信号   放在一个always 块内;

                        (状态跳变,既cur_state和nxt_state 被隐藏于时序逻辑)

        二段式状态机: 

                        时序逻辑: cur_state和nxt_state

                        组合逻辑: nxt_state 变化条件和输出赋值

        三段式状态机:

                        时序逻辑: cur_state和nxt_state

                        组合逻辑: nxt_state 变化条件

                        时序/组合:输出赋值

        moore 型状态机: nxt_state 的变化仅仅于cur_state 有关  (moore,把o 看做0 ,就是和输入无关

        mearly型状态机:nxt_state的变换不仅于cur_state 有关,还取决于当前输入条件

异步复位和同步复位:

        异步复位: 复位信号可以在时钟信号的任意时刻触发(拉低/拉高)

always @(posedge aclk or negedge aresetn  ) beginif (aresetn == 1'b0) begina <= 1'b0;endelse begina <= b;end

同步复位:复位信号只会在时钟的边沿触发(拉低/拉高)

always @(posedge aclk ) beginif (aresetn == 1'b0) begina<=1'b0;endelse  begina<=b;end
end

综上可以看出异步和同步复位的优缺点:

        异步复位 使用寄存器的专有clr(异步清0 端),不消耗额外逻辑,相比于同步复位节约资源;但是异步复位和同步复位都存在复位的亚稳态问题(remove 和recovery 时间不满足)。 

         如下图的异步复位+ 级联触发器。 

                        当复位生效时: 

                         只要复位时间很长,都可以实现对触发器的复位 

                        当复位撤销时:

                          若复位的撤销在reg b 和reg c的set ~hold 时间之外,则每有问题,若发生在set~hold时间内,则会出现4 种组合情况: bc 均正常解复位,bc 一个解复位一个复位,bc 均复位。 此时就会因为亚稳态造成逻辑错误(c 和另外一组级联触发器有逻辑运算, 一个被复位,一个解复位,那逻辑运算后的数据就时非预期的)

同复位,异步释放:

        为了使用CLR,又必须保证复位与时钟的同步,则使用异步复位+bit同步器处理后的信号作为最终的逻辑复位。

速度面积互换原则

面积和速度是相互对立的,如同做设计时的PPA一样(performance,power ,arer) 。 

常见的面积换速度: 乒乓转换,使用2组缓存,一组吸收当前入口数据,一组用于逻辑处理输出;

                                 逻辑复制,如果入口的线速度没有打满,可以增加一条新的数据流,在出口调度,或者汇聚后再出;

                                串并转换: 如果数据1bit 1拍的传输,每8bit 就输出。单纯的穿行操作,性能时当前时钟的1/8 ,若使用寄存器对输入pipe ,则在输入又 8 cycle的时延 后,可以每拍都出8bit 数据(移位)。

静态时序分析:

       在时钟到来前,数据准备好。

        T+T_ck2d(T_skew0) =>  t_ck2s + T_co +  T_dp  +T_set 

        在下一拍数据到来前,可以保持的时间。 既下一拍数据来的时间> 保持时间

        T_ck2d(T_skew1) +T_hd   <=  T_co +  T_dp 

时钟约束的优先级从低到高:

 全局period和offset 约束

 groups  offset约束

 引脚指定的offset

 from to  

 from thru to

 false 路径

编写sdc 约束文件,先写低优先级,再写高优先级。

http://www.jsqmd.com/news/370917/

相关文章:

  • 梦断代码 起始
  • 投入产出模型与产业链关联分析(1)(勒昂季夫模型)
  • SpringCloud 系列 03:OpenFeign 声明式服务调用,简化微服务通信
  • 读了30篇文献还不知道怎么写综述?
  • Unity调试Android/iOS库文件:崩溃排查全指南
  • AI时代iOS开发未来在哪里
  • 群友靶机tmp复现 - 场
  • 基于Python的外卖配送分析与可视化系统源码文档部署文档代码讲解等
  • 基于SpringBoot+vue3的Web的家政服务管理平台的设计与实现(源码+lw+部署文档+讲解等)
  • d11
  • 2026年值得信赖的海外品牌营销推广盘点:助力企业出海的优质之选 - 品牌2025
  • 黑马大模型RAG与Agent智能体实战教程LangChain提示词——16、RAG开发——模板类format()和invoke()方法(所有模板类都继承了Runnable类,拥有这两个方法)
  • 详细介绍:STM32新建工程(标准库官网下载)
  • 构建之法
  • 推荐几家制造业海外推广获客公司,上海、苏州地区优质制造业外贸B2B营销服务商详细介绍 - 品牌2025
  • Polya 定理学习笔记
  • cad功能区当前没有加载任何选项卡或面板
  • C++最小惊讶原则
  • 推荐几家Linkedin推广获客公司推荐,五家值得关注的Linkedin推广获客服务商盘点 - 品牌2025
  • Android Studio - 在 Android Studio 中直观查看 Git 代码的更改
  • 嵌入式文件系统解决方案:fatfs支持FAT32文件系统
  • 详细介绍:day02 pyspark词频统计模板代码
  • P15139 [SWERC 2025] Expansion Plan 2 题解
  • IEEE69节点系统Simulink仿真:从基础到拓展的电力系统探索
  • Java毕设选题推荐:基于springboot的快递管理软件管理系统基于springboot的物流管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Java毕设选题推荐:基于springboot的校园二手物品置换系统设计与实现校园二手物品推荐系统设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Java毕设选题推荐:基于springboot的面向新工科课程线上教学辅助平台学员管理、资料管理、考试管理【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 不得不看!OpenClaw 爆火背后的三个真相
  • 盘点2026年有名的宝宝起名字专家,不错的婴儿取名大师推荐哪位 - 深度智识库
  • 2026年靠谱的公司起名大师推荐权威实测榜:泰斗级领军者领衔 避坑指南 - 深度智识库