数字IC设计-格雷码
格雷码是一种循环二进制编码,特点是相邻数变化时只有一位数据跳变。
4位二进制和格雷码对应如下:
1、二进制到格雷码转换
Verilog实现
123456789101112module bin_to_gray #( parameter WIDTH = 4)( input [WIDTH-1:0] in, output [WIDTH-1:0] out);assign out = in ^ (in >> 1);endmodule
仿真波形:
2、格雷码转二进制
Verilog实现:
123456789101112131415161718192021module gray_to_bin#( parameter WIDTH = 4)( input [WIDTH-1:0] in, output [WIDTH-1:0] out);// assign out[0] = ^in[3:0];// assign out[1] = ^in[3:1];// assign out[2] = ^in[3:2];// assign out[3] = ...
数字IC设计-同步FIFO设计
同步FIFO设计
1、方法(1)空满标志
使用计数器计数,当写数据时候计数加一,当读数据时减一,这样当计数值为 0 时表示空,当计数值达到FIFO深度时则表示满;
(2)读写指针
当写使能且非满时候写地址加1;
当读使能且非空时候读地址加1;
(3)读写数据
根据读写地址、空满标志、读写使能信号写入和读取数据到RAM;
2、Verilog代码1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192module fifo_sync#( parameter DEPTH = 3, parameter WIDTH = 8)( input clk, input rstn, input ren, input wen, input [WIDTH-1:0] din, ...
数字IC设计-异步FIFO设计
异步FIFO相对于同步FIFO设计的要点是由于读写时钟为不同时钟,因此在判断空满标志时候需要对读写地址进行跨时钟域处理后才能进行比较
1、方法(1)读写地址跨时钟域处理
格雷码具有相邻两个数仅变化一位的特点,因此可以将读写地址转换为格雷码后再使用打两拍的方式进行跨时钟域的处理;
如果出现在跳变时采样的情况,那么得到的地址要么未改变的旧地址,要么是变化后的新地址,不会出现其他地址情况,如果是新地址属于预期结果不会出现问题;如果是未改变的旧地址,那么用来判断空满信号时会出现假满、假空的信号,这种情况也不会出现逻辑错误,仅仅影响了效率;
(2)空标志信号
将写地址同步到读时钟域(因为空标志用于读,空了就不能读);
判断同步后的写地址是否和读地址相等,如果相等表示写地址追上了读地址,产生空信号;
对于同步产生地址延迟问题,即相当于和更小的读地址进行比较,提前产生了空标志,停止读操作,实际还有数据存在,在逻辑上没有问题,依然正常工作;
(3)满信号标志
将读地址同步到写时钟域(因为满信号用于写操作,满了不能再写);
对同步后的读地址和写地址进行比较,如果写地址比读地址刚好多循环了一 ...
Q&A-systemverilog中包含package出错-Unsupported SystemVerilog construct
Question:使用Systemverilog,在module中包含其他package出现如下错误:
Error: Unsupported Systemverilog construct
found ‘package’ inside module before ‘endmodule’. ‘package’ inside ‘module’ is not allowed.
Answer:解决方法如下:1、有可能是把 include package 写在了module 和 endmodule之间了;需要把 include package写在 module定义之前或endmodule之后;
2、还有一种是在其他模块中少了 endmodule 关键字,这样也会导致这个模块出现这个错误,但实际上不是该模块的问题;
Q&A-systemverilog中对数字截取位操作错误
Question:在sysemverilog 中,有的工具编译在generate中使用genvar的位截取功能(part-select) 出错: illegal select base error.
如下面代码:
1234567generate genvar i; for(i=0; i<16; i=i+1) begin: gen wire [2:0] val = i[3:1]; endendgenerate
上面对 genvar类型的变量i进行part-select操作某些工具出错
Answer:解决方法如下:
123456789generate genvar i; for(i=0; i<16; i=i+1) begin: gen localparam [3:0] tmp_i = i; wire [2:0] val = tmp_i[3:1]; endendgenerate
根据查资料是因为genvar的变量位宽不确定导致的,因此先将genvar 变量 i 给l ...
Q&A-VMware虚拟机安装的Ubuntu下esptool.py烧写ESP32串口自动下载功能出问题
Question:在虚拟机VMware中安装的Ubuntu22,然后使用ESP-IDF进行编程,但是使用esptool的串口自动下载功能出问题,提示无法进行下载模式,有时候按下rst按键才可以下载
Answer:参考这个资料:https://github.com/espressif/esptool/issues/323;解决方法:在VMware虚拟机中点击 【设置】-> 【硬件】->【USB控制器】 -> 【USB兼容性】将选项USB2更换为USB3即可;
Q&A-VMware虚拟机安装的Ubuntu下esptool.py烧写ESP32串口自动下载功能出问题
Question:在虚拟机VMware中安装的Ubuntu22,然后使用ESP-IDF进行编程,但是使用esptool的串口自动下载功能出问题,提示无法进行下载模式,有时候按下rst按键才可以下载
Answer:参考这个资料:https://github.com/espressif/esptool/issues/323;解决方法:在VMware虚拟机中点击 【设置】-> 【硬件】->【USB控制器】 -> 【USB兼容性】将选项USB2更换为USB3即可;
Q&A-虚拟机Ubuntu中串口设备接入后没有显示串口号 ttyUSB0
Question:虚拟机中安装了Ubuntu22版本,连接了一个USB转串口的CH340设备后,在设备列表中看不到 /dev/ttyUSB0 设备
Answer:查找资料通过命令:sudo dmesg|grep brltty,显示信息为:usb 1-1: usbfs: interface 0 claimed by ch341 while ‘brltty’ sets config #1:golang连接数据库postgresql出错sql: unknown driver确定是 brltty 盲文显示程序占用问题,这个基本用不到,因此通过如下命令删除即可:sudo apt remove brltty再次重新插拔设备后有显示ttyUSB0设备了。
Q&A-ubuntu gcc/g++更新版本问题--Wformat-overflow 和 ld- skipping incompatible
Question:在ubuntu中,之前默认gcc版本为gcc-5,然后make出现错误提示:“-Wformat-overflow”
Answer:这个问题可以更新gcc版本;更新gcc版本方法步骤如下:
sudo apt-get install software-properties-common -y
首先添加ppa到库:
sudo add-apt-repository ppa:ubuntu-toolchain-r/testsudo apt-get update
安装gcc/g++
sudo apt-get install gcc-8 g++-8
刷新db并locate
sudo updatedb && sudo ldconfig完成后命令ls -l /usr/bin/gcc 用Tab补全看下是否有安装的版本;
安装完后,手工更换gcc软连接
cd /usr/binsudo rm g++ gccsudo ln -s g++-8 g++sudo ln -s gcc-8 gcc更新后,再make时候出现错误,库不匹配:/usr/bin/ld: skipp ...
Q&A-Ubuntu20安装Qt6后编译程序出错
Question:在Ubuntu20上安装了Qt6后,编译程序出现错误:1、Error while building/deploying project…2、cannot find -lGL
Answer:1、如果是直接运行自带的examples,选择 Copy Project and Open方式打开示例工程;2、自己建立的工程出错,执行如下命令进行安装相应的库:
sudo apt-get install build-essential libgl1-mesa-dev