格雷码

LeetCode 力扣 89. 格雷编码

核能气质少年 提交于 2020-03-09 07:03:05
题目描述(中等难度) 生成 n 位格雷码,所谓格雷码,就是连续的两个数字,只有一个 bit 位不同。 解法一 动态规划 按照动态规划或者说递归的思路去想,也就是解决了小问题,怎么解决大问题。 我们假设我们有了 n = 2 的解,然后考虑怎么得到 n = 3 的解。 n = 2 的解 00 - 0 10 - 2 11 - 3 01 - 1 如果再增加一位,无非是在最高位增加 0 或者 1,考虑先增加 0。由于加的是 0,其实数值并没有变化。 n = 3 的解,最高位是 0 000 - 0 010 - 2 011 - 3 001 - 1 再考虑增加 1,在 n = 2 的解基础上在最高位把 1 丢过去? n = 3 的解 000 - 0 010 - 2 011 - 3 001 - 1 -- -- -- -- -- -- - 下面的是新增的 100 - 4 110 - 6 111 - 7 101 - 5 似乎没这么简单哈哈,第 4 行 001 和新增的第 5 行 100,有 3 个 bit 位不同了,当然不可以了。怎么解决呢? 很简单,第 5 行新增的数据最高位由之前的第 4 行的 0 变成了 1,所以其它位就不要变化了,直接把第 4 行的其它位拉过来,也就是 101。 接下来,为了使得第 6 行和第 5 行只有一位不同,由于第 5 行拉的第 4 行的低位,而第 4 行和第 3

异步电路设计

青春壹個敷衍的年華 提交于 2020-03-05 07:52:48
一、异步电路设计 1、单bit异步处理 1) 打三拍 从慢到快,只有亚稳态的问题;所以只用打两拍或者三拍就行了。 而从快传输到慢,不仅有要抑制亚稳态往下传播的问题,还有控制信号丢失的问题,这里就需要延长控制信号的长度。这里要将脉冲信号扩展为电平信号,在进行打两拍或者三拍就行了。打两拍或者三拍就行了。 2、多bits异步处理 1)握手信号 2)D-MUX 3)异步FIFO(格雷码) 二、Metastability 触发器的建立时间和保持时间在时钟上升沿左右定义了一个时间窗口,如果触发器的数据输入端口上数据在这个时间窗口内发生变化(或者数据更新),那么就会产生时序违规。存在这个时序违规是因为建立时间要求和保持时间要求被违反了,此时触发器内部的一个节点(或者要输出到外部的节点)可能会在一个电压范围内浮动,无法稳定在逻辑0或者逻辑1状态。 寄存器建立的时间 Tsu(set up) 寄存器的保持时间Th(hold) 时钟变化到输出的时间Tco(clock to output) 对于有delay的clock 书上是以50% VDD为界限区分高电平和低电平 三、解决亚稳态的方法 2 level register(打两拍) 亚稳态问题通常出现在一些跨时钟域的传输上 亚稳态出现的原因: 用于在同步系统中,如果触发器的建立时间或保持时间不满足,就可能产生亚稳态,一个触发器进入亚稳态的时候

LeetCode:Gray Code

泄露秘密 提交于 2020-03-01 21:07:54
1、题目名称 Gray Code(格雷码) 2、题目地址 https://leetcode.com/problems/gray-code/ 3、题目内容 英文: The gray code is a binary numeral system where two successive values differ in only one bit. Given a non-negative integer n representing the total number of bits in the code, print the sequence of gray code. A gray code sequence must begin with 0. 中文: 格雷码是一个二进制数字系统,在该系统中两个相邻的数字仅相差1个二进制位(比特)。 给出一个非负数字n,打印由n个二进制位组成的格雷码序列。格雷码序列的首个元素必须是0。 说明: 在n给定的情况下,按照上面定义(两个相邻数字仅相差1个二进制位),可以有多种格雷码的编码方案。比如n=2时,除了[0,1,3,2]外,[0,2,3,1]也是满足定义的,目前的OJ校验时只支持一种格雷码的编码方案,对此我们(出题人)表示抱歉。 4、解题方法 在题目说明中已经说明了“只支持一种格雷码的编码方案”

CSP-S T1格雷码

别来无恙 提交于 2020-02-22 21:27:23
题目大意: 格雷码(Gray Code)是一种特殊的 n n 位二进制串排列法,它要求相邻的两个二进制串间 恰好 有一位 不同 ,特别地,第一个串与最后一个串也算作相邻。 n n 位格雷码不止一种,下面给出其中一种格雷码的生成算法: 1 1 位格雷码由两个 1 1 位二进制串组成,顺序为: 0 0 , 1 1 。 n + 1 n+1 位格雷码的前 2 n 2n 个二进制串,可以由依此算法生成的 n n 位格雷码(总共 2 n 2n 个 n n 位二进制串)按 顺序 排列,再在每个串前加一个前缀 0 0 构成。 n + 1 n+1 位格雷码的后 2 n 2n 个二进制串,可以由依此算法生成的 n n 位格雷码(总共 2 n 2n 个 n n 位二进制串)按 逆序 排列,再在每个串前加一个前缀 1 1 构成。 综上, n + 1 n+1 位格雷码,由 n n 位格雷码的 2 n 2n 个二进制串按顺序排列再加前缀 0 0 ,和按逆序排列再加前缀 1 1 构成,共 2 n + 1 2n+1 个二进制串。另外,对于 n n 位格雷码中的 2 n 2n 个 二进制串,我们按上述算法得到的排列顺序将它们从 0 ∼ 2 n − 1 0∼2n−1 编号。 现在给出 n n , k k ,请你求出按上述算法生成的 n n 位格雷码中的 k k 号二进制串。 1 ≤ n ≤ 64 , 0 < k <

FPGA/CPLD状态机稳定性研究

☆樱花仙子☆ 提交于 2020-02-19 19:45:33
摘要 在FPGA/CPLD设计中频繁使用的状态机,常出现一些稳定性问题,本文提出了一些解决方法,实验表明该方法有效地提高了综合效率.   随着大规模和超大规模FPGA/CPLD器件的诞生和发展,以HDL(硬件描述语言)为工具、FPGA/CPLD器件为载体的EDA技术的应用越来越广泛.从小型电子系统到大规模SOC(Systemonachip)设计,已经无处不在.在FPGA/CPLD设计中,状态机是最典型、应用最广泛的时序电路模块,如何设计一个稳定可靠的状态机是我们必须面对的问题. 1、状态机的特点和常见问题 标准状态机分为摩尔(Moore)状态机和米立(Mealy)状态机两类.Moore状态机的输出仅与当前状态值有关,且只在时钟边沿到来时才会有状态变化.Mealy状态机的输出不仅与当前状态值有关,而且与当前输入值有关,这一特点使其控制和输出更加灵活,但同时也增加了设计复杂程度.其原理如图1所示.   根据图1所示,很容易理解状态机的结构.但是为什么要使用状态机而不使用一般时序电路呢?这是因为它具有一些一般时序电路无法比拟的优点. 用VHDL描述的状态机结构分明,易读,易懂,易排错; 相对其它时序电路而言,状态机更加稳定,运行模式类似于CPU,易于实现顺序控制等. 用VHDL语言描述状态机属于一种高层次建模,结果经常出现一些出乎设计者意外的情况: 在两个状态转换时,出现过渡状态.

格雷码加法器

强颜欢笑 提交于 2020-01-30 12:37:33
1、概述   格雷码执行加1操作最多只会变1位,可用在多位地址指针中消除毛刺。 2、verilog代码 1 `timescale 1ns / 1ps 2 3 module gray_adder 4 #(parameter length = 5) 5 ( 6 input clk, 7 input rstn, 8 input inc, 9 output [length-1:0] Gray 10 ); 11 12 reg [length-1:0] Gray_reg; 13 reg [length-1:0] Gray_next_reg; 14 15 reg [length-1:0] Bin_reg; 16 reg [length-1:0] Bin_next_reg; 17 18 integer i; 19 20 always @(posedge clk or negedge rstn) begin 21 if(!rstn) begin 22 Gray_reg <= 0; 23 end 24 else begin 25 Gray_reg <= Gray_next_reg; 26 end 27 end 28 29 30 always @(*) begin 31 Bin_reg[length-1] = Gray_reg[length-1]; // 格雷码转二进制码 32 for(i=length

Gray code(格雷码)【代码实现】

不羁岁月 提交于 2020-01-25 09:34:35
C int gray_encode ( int n ) { return n ^ ( n >> 1 ) ; } int gray_decode ( int n ) { int p = n ; while ( n >>= 1 ) p ^ = n ; return p ; } 示例: # include <stdio.h> /* Simple bool formatter, only good on range 0..31 */ void fmtbool ( int n , char * buf ) { char * b = buf + 5 ; * b = 0 ; do { * -- b = '0' + ( n & 1 ) ; n >>= 1 ; } while ( b != buf ) ; } int main ( int argc , char * * argv ) { int i , g , b ; char bi [ 6 ] , bg [ 6 ] , bb [ 6 ] ; for ( i = 0 ; i < 32 ; i ++ ) { g = gray_encode ( i ) ; b = gray_decode ( g ) ; fmtbool ( i , bi ) ; fmtbool ( g , bg ) ; fmtbool ( b , bb ) ; printf ( "

格雷码

笑着哭i 提交于 2020-01-20 00:13:17
题目描述 通常,人们习惯将所有 n 位二进制串按照字典序排列,例如所有 2 位二进制串按字典序从小到大排列为:00,01,10,11。 格雷码(Gray Code)是一种特殊的 n 位二进制串排列法,它要求相邻的两个二进制串间 恰好 有一位 不同 ,特别地,第一个串与最后一个串也算作相邻。 所有 2 位二进制串按格雷码排列的一个例子为:00,01,11,10。 n 位格雷码不止一种,下面给出其中一种格雷码的生成算法: 1 位格雷码由两个 1 位二进制串组成,顺序为:0,1。 n+1 位格雷码的前 2^n 个二进制串,可以由依此算法生成的 n 位格雷码(总共 2^n 个 n 位二进制串)按 顺序 排列,再在每个串前加一个前缀 0 构成。 n+1 位格雷码的后 2^n 个二进制串,可以由依此算法生成的 n 位格雷码(总共 2^n 个 n 位二进制串)按 逆序 排列,再在每个串前加一个前缀 1 构成。 综上,n+1 位格雷码,由 n 位格雷码的 2^n 个二进制串按顺序排列再加前缀 0,和按逆序排列再加前缀 1 构成,共 2^{n+1}个二进制串。另外,对于 n 位格雷码中的 2^n 个 二进制串,我们按上述算法得到的排列顺序将它们从 1 ~ 2^(n-1)-1 编号。 按该算法,2 位格雷码可以这样推出: 已知 1 位格雷码为 0,1。 前两个格雷码为 00,01。后两个格雷码为 11

编码结构光 的3d重建

試著忘記壹切 提交于 2019-12-18 03:32:23
1. 双目+ 格雷码 (像素精度) 相对简单。 2. 双目+格雷码+相移位(子像素精度) 相对简单。 3. 单目+ 相移位 (子像素精度) 相对简单+投射可多可少+ 可分为两个阶段校正提高精度。 4. 双目+相移位 也相对简单,需要 核线插值。 5. 对于反射面,可以采用 双目+ 相移位 可以避免 需要已知条件 6.对于 反射面,可以采用 单目+相移位(二义性) 需要已知条件 7.提高精度--相位校正和光度校正。 已经实现了 多频 单目/多目 以及 格雷码的 来源: CSDN 作者: hero_heart 链接: https://blog.csdn.net/hero_heart/article/details/97784961

P5657 格雷码

我与影子孤独终老i 提交于 2019-12-15 17:40:55
题目如有乱码,请点击访问原题地址。 题目描述 通常,人们习惯将所有 n n 位二进制串按照字典序排列,例如所有 2 位二进制串按字典序从小到大排列为:00,01,10,11。 格雷码(Gray Code)是一种特殊的 n n 位二进制串排列法,它要求相邻的两个二进制串间恰好有一位不同,特别地,第一个串与最后一个串也算作相邻。 所有 2 位二进制串按格雷码排列的一个例子为:00,01,11,10。 n n 位格雷码不止一种,下面给出其中一种格雷码的生成算法: 1 位格雷码由两个 1 位二进制串组成,顺序为:0,1。 n + 1 n + 1 位格雷码的前 2^n 2 n 个二进制串,可以由依此算法生成的 n n 位格雷码(总共 2^n 2 n 个 n n 位二进制串)按顺序排列,再在每个串前加一个前缀 0 构成。 n + 1 n + 1 位格雷码的后 2^n 2 n 个二进制串,可以由依此算法生成的 n n 位格雷码(总共 2^n 2 n 个 n n 位二进制串)按逆序排列,再在每个串前加一个前缀 1 构成。 综上, n + 1 n + 1 位格雷码,由 n n 位格雷码的 2^n 2 n 个二进制串按顺序排列再加前缀 0,和按逆序排列再加前缀 1 构成,共 2^{n+1} 2 n + 1 个二进制串。另外,对于 n n 位格雷码中的 2^n 2 n 个 二进制串