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

Verilog之小规模经典电路设计

verilog语句执行顺序

  • 每个语句块,是事件(event)触发执行的
  • 主要分为
    • 连续赋值语句assign
    • 过程赋值语句always, initial(只执行一次)
  • 连续和过程之间是并行执行的,只要满足出发条件即可
  • assign是在后面的输入发生变化时进行执行
  • always是在敏感列表发生变化时进行执行
  • initial是不可综合的
  • 阻塞和非阻塞赋值
    • 所有过程赋值中非阻塞赋值都是同时并行赋值的
    • 阻塞赋值是一条一条进行的
    • 阻塞赋值其实也是可以实现阻塞赋值的,主要是要理解非阻塞赋值实质上是把每一个旧数据给了寄存器,只需要把更新的值只给第一位置即可(即最后赋值,电路顺序不同,影响最后的功能)
    • 总结说,非阻塞赋值不存在顺序先后,而阻塞存在先后执行关系,电路结果可能不同
  • 基础规则
    • 描述组合逻辑使用=赋值
    • 描述时序逻辑使用<=赋值
    • 不要在多个语句块中对同一个变量赋值—多驱动不可综合
    • 在一个always块内,该块的一次触发,对同一个信号最多只能赋值一次
  • 设计思考
    • 为什么我们在设计过程中对于组合逻辑不使用复位信号?
      • 一个电路结构主要由组合逻辑和时序逻辑构成,然而当我们对时序逻辑器件进行复位后,那么组合逻辑器件的输出是一定的,因此,没必要多此一举将复位信号的接入组合逻辑。

基于verilog的小电路模型

  • 边缘检测
    //上升沿检测器
    wire clk,rstn;
    wire din;
    reg din_dly;
    wire pulse;
    assign pulse = din & (!din_dly);
    always @(posedge clk or negedge rstn) begin
      if(!rstn)
        din_dly <= 1'b0;
      else
        din_dly <= din;
    end
    

在这里插入图片描述

  • 计数器—当信号en高电平一次,则记录一次
    module counter(
      input wire en,
      input wire clk, 
      input wire rstn,
      output reg [3:0] cnt
    );
    always @(posedge clk or negedge rstn) begin
      if(!rstn)
        cnt <= 4'b0000;
      else if(en)
        cnt <= cnt + 4'b0001;
    end
    endmodule
    

在这里插入图片描述

  • 移位寄存器
    • 按照周期整体向某个方向移动
    • 一次可以整体移动Nbit
    • 可以左移也可以右移
    module Shift-Register(
      input wire din,
      input wire rstn,
      input wire clk,
      output reg [3:0] sf
    );
    always @(posedge clk or negedge rstn) begin
      if(!rstn)
        sf <= 4'b0000;
      else
        sf <= {sf[2:0], din};
    end
    endmodule
    

在这里插入图片描述


http://www.kler.cn/a/3616.html

相关文章:

  • OFD 套版生成原理与 C# 实现详解
  • python转转商超书籍信息爬虫
  • Qt调用ffmpeg库实现简易视频播放器示例
  • Excel 技巧17 - 如何计算倒计时,并添加该倒计时的数据条(★)
  • uniapp(小程序、app、微信公众号、H5)预览下载文件(pdf)
  • 2024微短剧行业生态洞察报告汇总PDF洞察(附原数据表)
  • Linux基础知识点总结
  • OpenMV快速上手 | OpenMV硬件版本概述及HelloWorld
  • C/C++内存管理
  • 队列-我的基础算法刷题之路(六)
  • TCP/IP socket
  • 什么是Java的垃圾回收机制?
  • 算法:贪婪算法、分而治之
  • 数学原理—嵌入矩阵
  • 【密码学复习】第四讲分组密码(三)
  • 【HTML系列】第一章 · HTML入门
  • Linux:centos内核优化详解
  • java.sql.Date和java.util.Date的区别
  • 多线程代码案例-阻塞队列
  • SpringBoot系列 logback-spring日志配置使用记录以及解决依赖包冲突问题
  • python基础语法(下)
  • Echarts实现图表自适应屏幕分辨率
  • docker安装Redis高可用(一主二从三哨兵)
  • MP4怎么转换成MP3格式?两种方法帮你实现
  • 搭建一个双系统个人服务器
  • 水果新鲜程度检测系统(UI界面+YOLOv5+训练数据集)