数字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-在Ubuntu20下通过在线安装好qtcreator后,点击qtcreator无反应
Question:在Ubuntu20下用在线安装方式安装qtcreator后启动无反应
Answer:直接到安装目录 ./Tools/QtCreator/bin 执行:sudo ./qtcreator,提示如下报错:qt.qpa.plugin: Could not load the Qt platform plugin “xcb” in “” even though it was found.…
通过如下命令安装xcb:
sudo apt-get install libxcb-xinerama0
安装完成后可以直接打开了。
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-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-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-win10安装驱动时候出现第三方INF不包含数字签名
Question:在win10系统中,当安装一些驱动时候,比如安装BDM驱动时候,出现了已找到设备驱动程序软件但在试图安装它时遇到错误,并出现“第三方INF不包含数字签名信息”的提示。
Answer:解决方法:按照下面步骤设置禁用驱动程序强制签名。
在电脑的 设置 -> 更新和安全 -> 恢复 -> 立即重新启动;出现的窗口中点击 疑难解答 -> 高级选项 -> 启动设置 -> 重启;电脑重启后,出现的界面中选择 禁用驱动程序强制签名 (数字7);开机后,再次选择安装设备驱动,并在安全警告时候选择始终安装此驱动程序软件,就可以正常使用驱动了。
Q&A-vivado调用QuestaSim 出现unable to checkout a viewer license错误
Question:在Vivado中联合QuestaSim 仿真,开始仿真时候出现unable to checkout a viewer license 的错误提示
Answer:1、检查破解文件在LM_LICENSE_FILE系统环境变量中路径;
2、直接打开QuestaSim看是否能打开成功,打开成功说明破解好了;
3、破解好的情况下还报错,打开vivado使用管理员权限运行就可以了;
Q&A-WIN10安装后出现EFI启动分区,如何删除
Question:在win10安装后,在资源管理器中EFI启动分区也显示了,经过diskpart方式删除后,重启依然出现了
Answer:先打开命令行CMD,以管理员方式运行:1、先使用diskpart的方式删除分区,如果失败,用方法2;2、使用 mountvol命令方式:mountvol 盘符 /D ,例如我的:mountvol Y:\ /D