多路选择器MUX总结-IC学习笔记(八)

2023-11-01

多路复用器是一种组合电路,它从许多输入信号中选择一个作为输出,本文先介绍两个MUX的简单应用,主要关于如何将verilog与物理实现对应;第二当MUX作为时钟切换电路时如何避免毛刺(glitch)。

1.1 MUX code与物理实现对应

1.1.1 异或实现
module xor_rill(
input a,
input b,
output z
);
assign z = a?(~b):b;
endmodule

物理实现
在这里插入图片描述

1.1.2 二输入与实现

物理实现:
在这里插入图片描述

1.1.3 向量元素引用

问题:Create a 1-bit wide, 256-to-1 multiplexer. The 256 inputs are all packed into a single 256-bit input vector. sel=0 should select in[0], sel=1 selects bits in[1], sel=2 selects bits in[2], etc.

提示:不能用case结构

module top_module (
	input [255:0] in,
	input [7:0] sel,
	output  out
);
	assign out = in[sel];	
endmodule

多比特向量索引:

assign out = in[sel*4 +: 4];
assign out = in[sel*4+3 -: 4];	

1.2 时钟切换的MUX设计 glitch free技术

在SOC的设计中,经常需要用到大量的时钟源的选择与切换,以及时钟的分频,其中对于时钟的切换就显得尤为重要,并且如何在切换时钟源的过程中消除毛刺(glitch)。

对于一个时钟切换电路,输入两个异步时钟clk0、clk1,以及一个选择信号sel。我们直接使用2MUX就可以实现两个时钟源的切换,RTL代码也很简单:

assign clk_out = sel? clk1 :clk0;

clk0,clk1是异步的关系,所以就存在时钟切换会发生在任意时刻,也就会存在glitch的产生。当寄存器捕获到时钟沿其他没捕获到,极有可能造成系统的不稳定。

对于需要无缝切换时钟源,我们需要解决的问题有:
1.异步切换信号的跨时钟域同步问题,即可以用到异步复位,同步释放电路。
2.同步后的切换信号与时钟信号的逻辑设计。

1.2.1 方法一

在这里插入图片描述

`timescale 1ns/100ps

module clk_switch ( 
  out_clk,	 // Outputs
  clk_a, clk_b, select   // Inputs
  );
	input clk_a;
  	input clk_b;
 	input select; 	
	output out_clk;
	
	wire   out_clk;
	reg q1,q2,q3,q4;
	wire or_one, or_two,or_three,or_four;
	
	always @ (posedge clk_a)
	begin
	   if (clk_a == 1'b1)
	   begin
	      q1 <= q4;
	      q3 <= or_one;
	   end
	end
	
	always @ (posedge clk_b)
	begin
	   if (clk_b == 1'b1)
	   begin
	       q2 <= q3;
	       q4 <= or_two;
	   end
	end
	
	assign or_one   = (!q1) | (!select);
	assign or_two   = (!q2) | (select);
	
	assign or_three = (q3)  | (clk_a);
	assign or_four  = (q4)  | (clk_b);
	
	assign out_clk  = or_three & or_four;

endmodule
1.2.2 方法二

在这里插入图片描述

`timescale  1ns/10ps
module  clock_mux (
    // OUTPUTs
    //=========
    output         clk_out,        // Clock output
 
    // INPUTs
    //=========
    input          clk_in0,        // Clock input 0
    input          clk_in1,        // Clock input 1
    input          reset,            // Reset
    input          select_in       // Clock selection
);
//----------------------------------------
//  Regs declare
//----------------------------------------
 
	reg   dff0a,dff0b;
	reg   dff1a,dff1b;
	 
	wire  clk_in0_inv = ~clk_in0;
	wire  clk_in1_inv = ~clk_in1;
 
//----------------------------------------
//  clk_in0 path
//----------------------------------------
 
// negedge of clk_in0
	always @(posedge clk_in0_inv or posedge reset)
	  if(reset)   
	  	dff0a <=  1'b1;
	  else      
	  	dff0a <=  !select_in & !dff1b;
	 
	always @(posedge clk_in0 or posedge reset)
	  if(reset)   
	  	dff0b <=  1'b1;
	  else      
	  	dff0b <=  dff0a;
	 
	wire  clk_in0_gate  = ~(~clk_in0 & dff0b);
 
//----------------------------------------
//  clk_in1 path
//----------------------------------------
// negedge of clk_in1
	always @(posedge clk_in1_inv or posedge reset)
	  if(reset)   
	  	dff1a <=  1'b0;
	  else      
	  	dff1a <=  select_in & !dff0b;
	 
	always @(posedge clk_in1 or posedge reset)
	  if(reset)   
	  	dff1b <=  1'b0;
	  else      
	  	dff1b <=  dff1a;
	 
	wire  clk_in1_gate  = ~(~clk_in1 & dff1b);
 
//-----------------------
//  clock mux out
//-----------------------
	assign  clk_out = clk_in0_gate & clk_in1_gate;
	 
endmodule
参考文档

【1】数字集成电路设计-1-用一个mux和一个inv实现异或

【2】数字IC设计笔试问题系列–1(50题)

【3】HDLBits 系列(10)(Mux256to1)多路选择器的固定思维,你别想太多!

【4】SOC设计——时钟切换的MUX设计 glitch free技术(一种防止毛刺产生的多路选择器设计)

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

多路选择器MUX总结-IC学习笔记(八) 的相关文章

  • Spartan-3E 上的随机数生成

    我需要在 Spartan 3E FPGA 上为我的遗传算法生成伪随机数 并且我想在 verilog 中实现它 您能给我任何关于此的指示吗 当然 Adam 的随机生成器是不可合成的 您必须显式创建一个LFSR 以下示例可能会有所帮助 它是一个
  • 计算数组中的个数

    我试图在 Verilog 中计算 4 位二进制数中 1 的数量 但我的输出是意外的 我尝试了几种方法 这是我认为应该有效的方法 但事实并非如此 module ones one in input 3 0 in output 1 0 one a
  • 如何在 Verilog 中定义带参数的模块?

    我想定义一个add有一个参数的模块 但我对新实例的声明进展不顺利 我想定义这个模块的一个实例 module add parameter wd 1 input wire wd 1 0 a b output wire wd 1 0 o assi
  • 如何使用触发器输出作为复位信号的输入

    我在柜台里放了 3D 触发器 一旦达到 5 101 我想将 FF 复位输入设置为高 使用或门 复位为低电平有效 这几乎可以工作 但是 当我最初运行程序时 触发器的 Q 输出都是未知的 因此 最初 或门的复位输入为低电平 但是 因为一开始 Q
  • 如何在 verilog 中不使用 while() 循环(用于综合)?

    我已经养成了开发大量测试平台并使用 for 和 while 循环进行测试的习惯 没关系 问题是我已经将这种习惯用于对应该可综合的电路进行编码 XST等拒绝合成代码 无需对合成参数进行额外修改 例如 while num lt test num
  • 「Verilog学习笔记」游戏机计费程序

    专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点 刷题网站用的是牛客网 timescale 1ns 1ns module game count input rst n 异位复位信号 低电平有效 input clk 时
  • 使用forever和always语句

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

    我有一个 SREC 文件 它是一个简单的文本文件 我想在 verilog 中逐行读取它 我怎样才能做到这一点 以下读取文件 每个时钟周期 1 行 预期的数据格式是每行一个十进制数 integer data file file handler
  • 如何在RTL中使用时钟门控?

    我正在对一些时钟进行门控latch以及我设计中的逻辑 我在综合和布局布线方面没有太多经验 在 RTL 中实现时钟门控的正确方法是什么 示例1 always comb begin gated clk clk latch update en e
  • 「HDLBits题解」Gates4

    本专栏的目的是分享可以通过HDLBits仿真的Verilog代码 以提供参考 各位可同时参考我的代码和官方题解代码 或许会有所收益 题目链接 Gates4 HDLBits module top module input 3 0 in out
  • 使用双寄存器方法解决亚稳态问题

    为了解决Verilog中不同时钟域引起的亚稳态 采用双寄存器方法 但据我所知 亚稳态的最终输出尚未确定 输出独立于输入 那么 我的问题是如何保证使用双寄存器方法输出的正确性 Thanks 您不能完全确定您避免了亚稳态 正如您所提到的 亚稳态
  • 如何在 Verilog 中综合 While 循环?

    我尝试设计一个 Booth 乘法器 它在所有编译器中运行良好 包括 Modelsim Verilogger Extreme Aldec Active Hdl 和 Xilinx Isim 我知道模拟和综合是两个不同的过程 而且只有少数Veri
  • Verilog 中的“net”代表什么?

    我刚刚开始学习Verilog 据我了解 Verilog有net数据类型 什么是net代表 网络就是这样一种数据类型 您不使用它来存储值 它们代表物理连接 您可以将线路视为一种网络数据类型 你可以去网上看看更多here http www ee
  • 开始后跟冒号和变量是什么意思?

    什么是data mux意思是这里 它只是块的名称吗 if PORT CONFIG 32 P0 1 b1 begin data mux end 这些是块名称 它们特别适用于generate块 例如 您可以定义一个generate块如 genv
  • VIM 高亮匹配开始/结束

    我正在尝试找到一个插件 它将突出显示与 Verilog 匹配的开始 结束语句 VIM 可以使用花括号 方括号 但不能使用它的开始 结束 我希望 VIM 突出显示正确的开始到正确的结束 在我看来 最好的选择是使用 matchit 该脚本是 v
  • 我怎样才能让我的verilog移位器更通用?

    这里我有一个移位器 但现在它最多只能工作 3 位 我一直在寻找 但不知道如何让它工作最多 8 位 module shifter a b out input 7 0 a b output 7 0 out wire 7 0 out1 out2
  • 如何在 Verilog 中推断 Block RAM

    我在一个项目中遇到了一个非常具体的问题 这个问题已经困扰我好几天了 我有以下 RAM 模块的 Verilog 代码 module RAM param clk addr read write clear data in data out pa
  • 具有内部赋值延迟的阻塞和非阻塞语句之间的区别

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

    有人可以解释一下这个命名约定在下面的 Verilog 行中意味着什么吗 我不知道这是什么 add 34 部分的意思是 ADDHXL add 34 U1 1 6 A n1022 B add 34 carry 6 CO add 34 carry
  • 如何迭代创建参数化大小的总线来连接同样迭代创建的模块?

    我正在尝试使用组合逻辑方法在 verilog 中创建乘法器模块 以便不涉及时钟 我希望模块有一个通用的定义 即我希望乘法器分别接收大小为 M 和 N 位的两个因子 并返回大小为 M N 位的乘积 基本思想是计算部分积的和 每个部分积根据其级

随机推荐

  • C++数据结构X篇_12_树的基本概念和存储

    学习二叉树之前先学习树的概念 文章目录 1 树的基本概念 1 1 树的定义 1 2 树的特点 1 3 若干术语 2 树的表示法 2 1 图形表示法 2 2 广义表表示法 3 树的存储 3 1 双亲表示法 保存父节点关系 3 2 孩子表示法
  • 伴随矩阵的特征值和特征向量

    结 论 伴 随 矩 阵 的 特
  • winsock

    今天上午学习了 winsock的使用的过程 现将学习的收获总结如下 Winsock的属性 1 Localport 设定本机的端口号 端口号从0 65536 其中1024一下一般为专用的端口 如21为ftp默认端口 80为http默认端口 2
  • 关于对CSDN这些技术博客类网站的一些个人看法

    今天这篇文章其实是自己的一个分享与感悟 分享一下自己从技术小白到有点小实力的这个过程中对自己帮助的一些技术博客类网站的看法 关于我为什么会想写这么一篇文章呢 起因是我有一次查CSDN网站时候 看到了一篇文章 第一眼看到这篇文章的时候我觉得首
  • Java多线程 - - -线程安全问题

    Java 多线程学习笔记 二 线程安全问题的出现 当一个进程中的多个线程共享资源或数据的时候 就会出现安全隐患 例如 三个售票窗口同时售票 如果没有进行线程安全的处理 则会出现重票 错票等线程安全问题 package com fff 实现R
  • Modbus协议介绍

    Modbus协议介绍 简介 Modbus是一种串行通信协议 是Modicon公司 现在的施耐德电气Schneider Electric 于 1979年为使用可编程逻辑控制器 PLC 通信而发表 Modbus 已经成为工业领域通信协议的业界标
  • JDBC数据库驱动的下载、安装与连接

    1 常用的数据库驱动下载 使用JDBC操作数据库 需要使用数据库厂商提供的驱动程序 通过驱动程序可以与数据库进行交互 1 1 常用的数据库厂商驱动下载地址 1 1 1 MySQL数据库 https dev mysql com downloa
  • Pytorch基于DDPM+InceptionNext+数据增强的图像分类(一)

    项目简介 本项目旨在通过使用深度学习技术实现对图像进行分类 我采用了DDPM Deep Dynamic Probabilistic Modeling 和InceptionNext两个模型的结合 以提高图像分类的准确性和性能 同时 我还使用了
  • 拷贝构造函数和赋值构造函数声明为私有的作用

    转载 http blog csdn net rabbit729 article details 4000500 每个类只有一个赋值函数 由于并非所有的对象都会使用拷贝构造函数和赋值函数 程序员可能对这两个函数有些轻视 请先记住以下的警告 在
  • dom-to-image 将vue中未显示的组件转成图片, 并上传

    目录 一 dom to image基本使用 二 注意点 三 生成的图片上传至服务器 1 base64 转 File 格式 2 blob 转 File 格式 3 在页面展示生成的图片 4 最终dom转图片函数 5 上传图片 6 问题未解决 四
  • word自带公式编辑

    快捷键 公式编辑 alt 上标 x i 空格 下标 x i 空格 实数R doubleR 空格 偏微分算子 partial 极限 limit 按空格后会显示一串很长的式子 再空格就变成了数学公式 积分 int 二重积分 iint 三重积分
  • python的smtplib发送带附件邮件

    usr bin python coding UTF 8 author import smtplib logging 加载smtplib模块 from email mime text import MIMEText from email ut
  • 如何使用chatGPT生成小红书种草文案

    如何使用chatGPT生成小红书种草文案 小红书拥有超千万的日活用户 为商家提供了广阔的变现空间和机会 成为商家选择在小红书上推广的原因之一 小红书种草文案 例如具有影响力的热门话题 产品使用方法等内容可以让消费者迅速了解产品为品牌带来更多
  • nginx转发后如何获取真实的ip地址

    前言 最近做一个团队的打卡系统 需要通过连接实验室WiFi来判是否人在实验室 网上千篇一律的获取主机ip的方法由于我使用了nginx反向代理 导致获取到的ip地址为127 0 0 1 这肯定是不符合我们验证标准的 还有就是失去了校验的意义了
  • 人工智能笔记

    第一章 绪论 1956年正式提出人工智能 artificial intelligence AI 这个术语并把它作为一门新兴科学的名称 20世纪三大科学技术成就 空间技术 原子能技术 人工智能 智能是知识与智力的总和 知识是一切智能行为的基础
  • Flutter 在MAC环境下jenkins+fastlane+gitlab实现自动打包部署(看这一篇就够了,小而精)

    实现办公局域网下的jenkins服务 Flutter配置 文档 jenkins安装 通过homebrew安装 1 安装homebrew bin bash c curl fsSL https raw githubusercontent com
  • 谷歌播客Google PodCasts解析脚本

    解析某个频道 全部的结果 import json import requests feed url https podcasts google com feed aHR0cHM6Ly93d3cueGltYWxheWEuY29tL2FsYnV
  • 我的LLVM学习笔记——OLLVM混淆研究之FLA篇

    因为要做代码保护 所以抽时间研究了下OLLVM中的三种保护方案 BCF Bogus Control Flow 中文名虚假控制流 FLA Control Flow Flattening 中文名控制流平坦化 SUB Instructions S
  • vue使用wangEditor

    vue版本2 0 editor5 1 23版本 editor for vue 1 0 2版本 api文档入口 效果图 点击查看如何封装 安装步骤入口 npm install wangeditor editor save npm instal
  • 多路选择器MUX总结-IC学习笔记(八)

    多路复用器是一种组合电路 它从许多输入信号中选择一个作为输出 本文先介绍两个MUX的简单应用 主要关于如何将verilog与物理实现对应 第二当MUX作为时钟切换电路时如何避免毛刺 glitch 文章目录 1 1 MUX code与物理实现