集成电路设计开源EDA软件yosys详解1:工具安装

2023-11-15

yosys为一套开源的针对verilog的rtl综合框架,从本节开始将详细介绍工具的使用,并详细对源代码进行分析和讲解,首先介绍一下工具的安装和使用。yosys的git网址为https://github.com/YosysHQ/yosys

下面将介绍如何在ubuntu环境下安装,使用的环境是ubuntu16.0。

安装

准备工作

安装Tabby CAD Suite工具,网址为:Releases · YosysHQ/oss-cad-suite-build · GitHub,根据系统下载指定的安装包:

这里选择的是linux-x64,然后根据安装指南GitHub - YosysHQ/oss-cad-suite-build: Multi-platform nightly builds of open source digital design and verification tools, 设置环境变量即可,这部分很简单。

安装必要的软件包:

apt-get install build-essential clang bison flex \
	libreadline-dev gawk tcl-dev libffi-dev git \
	graphviz xdot pkg-config python3 libboost-system-dev \
	libboost-python-dev libboost-filesystem-dev zlib1g-dev

编译和安装

拷贝代码:

git clone https://github.com/YosysHQ/yosys.git

进入yosys目录,执行编译和安装指令

make
make install

正常情况下,会安装成功,当前目录下会生成yosys等可执行程序:

EDA软件使用

在当前目录执行:

./yosys

正常的话会进入yosys界面:

 我们以fiedler-cooley.v(目录/tests/simple/下)文件为例来说明,verilog源代码如下:

module up3down5(clock, data_in, up, down, carry_out, borrow_out, count_out, parity_out);

input [8:0] data_in;
input clock, up, down;

output reg [8:0] count_out;
output reg carry_out, borrow_out, parity_out;

reg [9:0] cnt_up, cnt_dn;
reg [8:0] count_nxt;

always @(posedge clock)
begin
	cnt_dn = count_out - 3'b 101;
	cnt_up = count_out + 2'b 11;

	case ({up,down})
		2'b 00 : count_nxt = data_in;
		2'b 01 : count_nxt = cnt_dn;
		2'b 10 : count_nxt = cnt_up;
		2'b 11 : count_nxt = count_out;
		default : count_nxt = 9'bX;
	endcase

	parity_out  <= ^count_nxt;
	carry_out   <= up & cnt_up[9];
	borrow_out  <= down & cnt_dn[9];
	count_out   <= count_nxt;
end

endmodule

一个简单的逻辑电路代码实现,执行指令:

read -sv tests/simple/fiedler-cooley.v

读取verilog文件并用数字前端描述该电路,结果如下:

 接着执行指令:

hierarchy -top up3down5

生成RTL结构,结果如下:

 接着执行指令:

write_ilang

将设计写入Yosys内部文件格式,结果如下:

4. Executing RTLIL backend.
Output filename: <stdout>
# Generated by Yosys 0.17+50 (git sha1 f698a0514, gcc 5.4.0-6ubuntu1~16.04.12 -fPIC -Os)
autoidx 7
attribute \hdlname "\\up3down5"
attribute \top 1
attribute \src "tests/simple/fiedler-cooley.v:3.1-33.10"
module \up3down5
  attribute \src "tests/simple/fiedler-cooley.v:14.1-31.4"
  wire $0\borrow_out[0:0]
  attribute \src "tests/simple/fiedler-cooley.v:14.1-31.4"
  wire $0\carry_out[0:0]
  attribute \src "tests/simple/fiedler-cooley.v:14.1-31.4"
  wire width 10 $0\cnt_dn[9:0]
  attribute \src "tests/simple/fiedler-cooley.v:14.1-31.4"
  wire width 10 $0\cnt_up[9:0]
  attribute \src "tests/simple/fiedler-cooley.v:14.1-31.4"
  wire width 9 $0\count_nxt[8:0]
  attribute \src "tests/simple/fiedler-cooley.v:14.1-31.4"
  wire width 9 $0\count_out[8:0]
  attribute \src "tests/simple/fiedler-cooley.v:14.1-31.4"
  wire $0\parity_out[0:0]
  attribute \src "tests/simple/fiedler-cooley.v:14.1-31.4"
  wire width 9 $1\count_nxt[8:0]
  attribute \src "tests/simple/fiedler-cooley.v:17.11-17.29"
  wire width 10 $add$tests/simple/fiedler-cooley.v:17$3_Y
  attribute \src "tests/simple/fiedler-cooley.v:28.17-28.31"
  wire $and$tests/simple/fiedler-cooley.v:28$5_Y
  attribute \src "tests/simple/fiedler-cooley.v:29.17-29.33"
  wire $and$tests/simple/fiedler-cooley.v:29$6_Y
  attribute \src "tests/simple/fiedler-cooley.v:27.17-27.27"
  wire $reduce_xor$tests/simple/fiedler-cooley.v:27$4_Y
  attribute \src "tests/simple/fiedler-cooley.v:16.11-16.30"
  wire width 10 $sub$tests/simple/fiedler-cooley.v:16$2_Y
  attribute \src "tests/simple/fiedler-cooley.v:9.23-9.33"
  wire output 6 \borrow_out
  attribute \src "tests/simple/fiedler-cooley.v:9.12-9.21"
  wire output 5 \carry_out
  attribute \src "tests/simple/fiedler-cooley.v:6.7-6.12"
  wire input 1 \clock
  attribute \src "tests/simple/fiedler-cooley.v:11.19-11.25"
  wire width 10 \cnt_dn
  attribute \src "tests/simple/fiedler-cooley.v:11.11-11.17"
  wire width 10 \cnt_up
  attribute \src "tests/simple/fiedler-cooley.v:12.11-12.20"
  wire width 9 \count_nxt
  attribute \src "tests/simple/fiedler-cooley.v:8.18-8.27"
  wire width 9 output 7 \count_out
  attribute \src "tests/simple/fiedler-cooley.v:5.13-5.20"
  wire width 9 input 2 \data_in
  attribute \src "tests/simple/fiedler-cooley.v:6.18-6.22"
  wire input 4 \down
  attribute \src "tests/simple/fiedler-cooley.v:9.35-9.45"
  wire output 8 \parity_out
  attribute \src "tests/simple/fiedler-cooley.v:6.14-6.16"
  wire input 3 \up
  attribute \src "tests/simple/fiedler-cooley.v:17.11-17.29"
  cell $add $add$tests/simple/fiedler-cooley.v:17$3
    parameter \A_SIGNED 0
    parameter \A_WIDTH 9
    parameter \B_SIGNED 0
    parameter \B_WIDTH 2
    parameter \Y_WIDTH 10
    connect \A \count_out
    connect \B 2'11
    connect \Y $add$tests/simple/fiedler-cooley.v:17$3_Y
  end
  attribute \src "tests/simple/fiedler-cooley.v:28.17-28.31"
  cell $and $and$tests/simple/fiedler-cooley.v:28$5
    parameter \A_SIGNED 0
    parameter \A_WIDTH 1
    parameter \B_SIGNED 0
    parameter \B_WIDTH 1
    parameter \Y_WIDTH 1
    connect \A \up
    connect \B $add$tests/simple/fiedler-cooley.v:17$3_Y [9]
    connect \Y $and$tests/simple/fiedler-cooley.v:28$5_Y
  end
  attribute \src "tests/simple/fiedler-cooley.v:29.17-29.33"
  cell $and $and$tests/simple/fiedler-cooley.v:29$6
    parameter \A_SIGNED 0
    parameter \A_WIDTH 1
    parameter \B_SIGNED 0
    parameter \B_WIDTH 1
    parameter \Y_WIDTH 1
    connect \A \down
    connect \B $sub$tests/simple/fiedler-cooley.v:16$2_Y [9]
    connect \Y $and$tests/simple/fiedler-cooley.v:29$6_Y
  end
  attribute \src "tests/simple/fiedler-cooley.v:27.17-27.27"
  cell $reduce_xor $reduce_xor$tests/simple/fiedler-cooley.v:27$4
    parameter \A_SIGNED 0
    parameter \A_WIDTH 9
    parameter \Y_WIDTH 1
    connect \A $1\count_nxt[8:0]
    connect \Y $reduce_xor$tests/simple/fiedler-cooley.v:27$4_Y
  end
  attribute \src "tests/simple/fiedler-cooley.v:16.11-16.30"
  cell $sub $sub$tests/simple/fiedler-cooley.v:16$2
    parameter \A_SIGNED 0
    parameter \A_WIDTH 9
    parameter \B_SIGNED 0
    parameter \B_WIDTH 3
    parameter \Y_WIDTH 10
    connect \A \count_out
    connect \B 3'101
    connect \Y $sub$tests/simple/fiedler-cooley.v:16$2_Y
  end
  attribute \src "tests/simple/fiedler-cooley.v:14.1-31.4"
  process $proc$tests/simple/fiedler-cooley.v:14$1
    assign { } { }
    assign { } { }
    assign { } { }
    assign { } { }
    assign { } { }
    assign { } { }
    assign { } { }
    assign $0\cnt_dn[9:0] $sub$tests/simple/fiedler-cooley.v:16$2_Y
    assign $0\cnt_up[9:0] $add$tests/simple/fiedler-cooley.v:17$3_Y
    assign $0\count_nxt[8:0] $1\count_nxt[8:0]
    assign $0\parity_out[0:0] $reduce_xor$tests/simple/fiedler-cooley.v:27$4_Y
    assign $0\carry_out[0:0] $and$tests/simple/fiedler-cooley.v:28$5_Y
    assign $0\borrow_out[0:0] $and$tests/simple/fiedler-cooley.v:29$6_Y
    assign $0\count_out[8:0] $1\count_nxt[8:0]
    attribute \src "tests/simple/fiedler-cooley.v:19.2-25.9"
    switch { \up \down }
      attribute \src "tests/simple/fiedler-cooley.v:0.0-0.0"
      case 2'00
        assign { } { }
        assign $1\count_nxt[8:0] \data_in
      attribute \src "tests/simple/fiedler-cooley.v:0.0-0.0"
      case 2'01
        assign { } { }
        assign $1\count_nxt[8:0] $sub$tests/simple/fiedler-cooley.v:16$2_Y [8:0]
      attribute \src "tests/simple/fiedler-cooley.v:0.0-0.0"
      case 2'10
        assign { } { }
        assign $1\count_nxt[8:0] $add$tests/simple/fiedler-cooley.v:17$3_Y [8:0]
      attribute \src "tests/simple/fiedler-cooley.v:0.0-0.0"
      case 2'11
        assign { } { }
        assign $1\count_nxt[8:0] \count_out
      attribute \src "tests/simple/fiedler-cooley.v:0.0-0.0"
      case 
        assign { } { }
        assign $1\count_nxt[8:0] 9'x
    end
    sync posedge \clock
      update \count_out $0\count_out[8:0]
      update \carry_out $0\carry_out[0:0]
      update \borrow_out $0\borrow_out[0:0]
      update \parity_out $0\parity_out[0:0]
      update \cnt_up $0\cnt_up[9:0]
      update \cnt_dn $0\cnt_dn[9:0]
      update \count_nxt $0\count_nxt[8:0]
  end
end

接下来执行指令:

proc; opt

将process转换为网络元素并做一些优化,结果如下:

5. Executing PROC pass (convert processes to netlists).

5.1. Executing PROC_CLEAN pass (remove empty switches from decision trees).
Cleaned up 0 empty switches.

5.2. Executing PROC_RMDEAD pass (remove dead branches from decision trees).
Removed 1 dead cases from process $proc$tests/simple/fiedler-cooley.v:14$1 in module up3down5.
Marked 1 switch rules as full_case in process $proc$tests/simple/fiedler-cooley.v:14$1 in module up3down5.
Removed a total of 1 dead cases.

5.3. Executing PROC_PRUNE pass (remove redundant assignments in processes).
Removed 0 redundant assignments.
Promoted 7 assignments to connections.

5.4. Executing PROC_INIT pass (extract init attributes).

5.5. Executing PROC_ARST pass (detect async resets in processes).

5.6. Executing PROC_ROM pass (convert switches to ROMs).
Converted 0 switches.
<suppressed ~1 debug messages>

5.7. Executing PROC_MUX pass (convert decision trees to multiplexers).
Creating decoders for process `\up3down5.$proc$tests/simple/fiedler-cooley.v:14$1'.
     1/1: $1\count_nxt[8:0]

5.8. Executing PROC_DLATCH pass (convert process syncs to latches).

5.9. Executing PROC_DFF pass (convert process syncs to FFs).
Creating register for signal `\up3down5.\count_out' using process `\up3down5.$proc$tests/simple/fiedler-cooley.v:14$1'.
  created $dff cell `$procdff$12' with positive edge clock.
Creating register for signal `\up3down5.\carry_out' using process `\up3down5.$proc$tests/simple/fiedler-cooley.v:14$1'.
  created $dff cell `$procdff$13' with positive edge clock.
Creating register for signal `\up3down5.\borrow_out' using process `\up3down5.$proc$tests/simple/fiedler-cooley.v:14$1'.
  created $dff cell `$procdff$14' with positive edge clock.
Creating register for signal `\up3down5.\parity_out' using process `\up3down5.$proc$tests/simple/fiedler-cooley.v:14$1'.
  created $dff cell `$procdff$15' with positive edge clock.
Creating register for signal `\up3down5.\cnt_up' using process `\up3down5.$proc$tests/simple/fiedler-cooley.v:14$1'.
  created $dff cell `$procdff$16' with positive edge clock.
Creating register for signal `\up3down5.\cnt_dn' using process `\up3down5.$proc$tests/simple/fiedler-cooley.v:14$1'.
  created $dff cell `$procdff$17' with positive edge clock.
Creating register for signal `\up3down5.\count_nxt' using process `\up3down5.$proc$tests/simple/fiedler-cooley.v:14$1'.
  created $dff cell `$procdff$18' with positive edge clock.

5.10. Executing PROC_MEMWR pass (convert process memory writes to cells).

5.11. Executing PROC_CLEAN pass (remove empty switches from decision trees).
Found and cleaned up 1 empty switch in `\up3down5.$proc$tests/simple/fiedler-cooley.v:14$1'.
Removing empty process `up3down5.$proc$tests/simple/fiedler-cooley.v:14$1'.
Cleaned up 1 empty switch.

5.12. Executing OPT_EXPR pass (perform const folding).
Optimizing module up3down5.
<suppressed ~1 debug messages>

6. Executing OPT pass (performing simple optimizations).

6.1. Executing OPT_EXPR pass (perform const folding).
Optimizing module up3down5.

6.2. Executing OPT_MERGE pass (detect identical cells).
Finding identical cells in module `\up3down5'.
<suppressed ~3 debug messages>
Removed a total of 1 cells.

6.3. Executing OPT_MUXTREE pass (detect dead branches in mux trees).
Running muxtree optimizer on module \up3down5..
  Creating internal representation of mux trees.
  Evaluating internal representation of mux trees.
  Analyzing evaluation results.
Removed 0 multiplexer ports.
<suppressed ~1 debug messages>

6.4. Executing OPT_REDUCE pass (consolidate $*mux and $reduce_* inputs).
  Optimizing cells in module \up3down5.
Performed a total of 0 changes.

6.5. Executing OPT_MERGE pass (detect identical cells).
Finding identical cells in module `\up3down5'.
Removed a total of 0 cells.

6.6. Executing OPT_DFF pass (perform DFF optimizations).

6.7. Executing OPT_CLEAN pass (remove unused cells and wires).
Finding unused cells or wires in module \up3down5..
Removed 2 unused cells and 10 unused wires.
<suppressed ~5 debug messages>

6.8. Executing OPT_EXPR pass (perform const folding).
Optimizing module up3down5.

6.9. Rerunning OPT passes. (Maybe there is more to do..)

6.10. Executing OPT_MUXTREE pass (detect dead branches in mux trees).
Running muxtree optimizer on module \up3down5..
  Creating internal representation of mux trees.
  Evaluating internal representation of mux trees.
  Analyzing evaluation results.
Removed 0 multiplexer ports.
<suppressed ~1 debug messages>

6.11. Executing OPT_REDUCE pass (consolidate $*mux and $reduce_* inputs).
  Optimizing cells in module \up3down5.
Performed a total of 0 changes.

6.12. Executing OPT_MERGE pass (detect identical cells).
Finding identical cells in module `\up3down5'.
Removed a total of 0 cells.

6.13. Executing OPT_DFF pass (perform DFF optimizations).

6.14. Executing OPT_CLEAN pass (remove unused cells and wires).
Finding unused cells or wires in module \up3down5..

6.15. Executing OPT_EXPR pass (perform const folding).
Optimizing module up3down5.

6.16. Finished OPT passes. (There is nothing left to do.)

接着执行指令

show

可以看到xdot格式的网络图:

执行指令:

techmap; opt

将网络表转换为逻辑门,并做一些优化,执行结果如下:

10. Executing TECHMAP pass (map to technology primitives).

10.1. Executing Verilog-2005 frontend: /home/joezhoushen/yosys/share/techmap.v
Parsing Verilog input from `/home/joezhoushen/yosys/share/techmap.v' to AST representation.
Generating RTLIL representation for module `\_90_simplemap_bool_ops'.
Generating RTLIL representation for module `\_90_simplemap_reduce_ops'.
Generating RTLIL representation for module `\_90_simplemap_logic_ops'.
Generating RTLIL representation for module `\_90_simplemap_compare_ops'.
Generating RTLIL representation for module `\_90_simplemap_various'.
Generating RTLIL representation for module `\_90_simplemap_registers'.
Generating RTLIL representation for module `\_90_shift_ops_shr_shl_sshl_sshr'.
Generating RTLIL representation for module `\_90_shift_shiftx'.
Generating RTLIL representation for module `\_90_fa'.
Generating RTLIL representation for module `\_90_lcu'.
Generating RTLIL representation for module `\_90_alu'.
Generating RTLIL representation for module `\_90_macc'.
Generating RTLIL representation for module `\_90_alumacc'.
Generating RTLIL representation for module `\$__div_mod_u'.
Generating RTLIL representation for module `\$__div_mod_trunc'.
Generating RTLIL representation for module `\_90_div'.
Generating RTLIL representation for module `\_90_mod'.
Generating RTLIL representation for module `\$__div_mod_floor'.
Generating RTLIL representation for module `\_90_divfloor'.
Generating RTLIL representation for module `\_90_modfloor'.
Generating RTLIL representation for module `\_90_pow'.
Generating RTLIL representation for module `\_90_pmux'.
Generating RTLIL representation for module `\_90_demux'.
Generating RTLIL representation for module `\_90_lut'.
Successfully finished Verilog frontend.

10.2. Continuing TECHMAP pass.
Using extmapper simplemap for cells of type $eq.
Using template $paramod$1e99ce38f701dd11f85f107c1bfc7d0aa5d10769\_90_pmux for cells of type $pmux.
Using extmapper simplemap for cells of type $and.
Using extmapper simplemap for cells of type $logic_not.
Using extmapper simplemap for cells of type $dff.
Running "alumacc" on wrapper $extern:wrap:$sub:A_SIGNED=0:A_WIDTH=9:B_SIGNED=0:B_WIDTH=3:Y_WIDTH=10:394426c56d1a028ba8fdd5469b163e04011def47.
Using template $extern:wrap:$sub:A_SIGNED=0:A_WIDTH=9:B_SIGNED=0:B_WIDTH=3:Y_WIDTH=10:394426c56d1a028ba8fdd5469b163e04011def47 for cells of type $extern:wrap:$sub:A_SIGNED=0:A_WIDTH=9:B_SIGNED=0:B_WIDTH=3:Y_WIDTH=10:394426c56d1a028ba8fdd5469b163e04011def47.
Running "alumacc" on wrapper $extern:wrap:$add:A_SIGNED=0:A_WIDTH=9:B_SIGNED=0:B_WIDTH=2:Y_WIDTH=10:394426c56d1a028ba8fdd5469b163e04011def47.
Using template $extern:wrap:$add:A_SIGNED=0:A_WIDTH=9:B_SIGNED=0:B_WIDTH=2:Y_WIDTH=10:394426c56d1a028ba8fdd5469b163e04011def47 for cells of type $extern:wrap:$add:A_SIGNED=0:A_WIDTH=9:B_SIGNED=0:B_WIDTH=2:Y_WIDTH=10:394426c56d1a028ba8fdd5469b163e04011def47.
Using extmapper simplemap for cells of type $reduce_xor.
Using extmapper simplemap for cells of type $reduce_or.
Using extmapper simplemap for cells of type $mux.
Using template $paramod$9ba033cb42591e01e61f078c95ea0ab8e1e30f70\_90_alu for cells of type $alu.
Using template $paramod$de9286bb3f6c9573089ef1694e580944d318189a\_90_alu for cells of type $alu.
Using extmapper simplemap for cells of type $xor.
Using template $paramod\_90_lcu\WIDTH=32'00000000000000000000000000001010 for cells of type $lcu.
Using extmapper simplemap for cells of type $pos.
Using extmapper simplemap for cells of type $not.
Using extmapper simplemap for cells of type $or.
No more expansions possible.
<suppressed ~384 debug messages>

11. Executing OPT pass (performing simple optimizations).

11.1. Executing OPT_EXPR pass (perform const folding).
Optimizing module up3down5.
<suppressed ~113 debug messages>

11.2. Executing OPT_MERGE pass (detect identical cells).
Finding identical cells in module `\up3down5'.
<suppressed ~57 debug messages>
Removed a total of 19 cells.

11.3. Executing OPT_MUXTREE pass (detect dead branches in mux trees).
Running muxtree optimizer on module \up3down5..
  Creating internal representation of mux trees.
  No muxes found in this module.
Removed 0 multiplexer ports.

11.4. Executing OPT_REDUCE pass (consolidate $*mux and $reduce_* inputs).
  Optimizing cells in module \up3down5.
Performed a total of 0 changes.

11.5. Executing OPT_MERGE pass (detect identical cells).
Finding identical cells in module `\up3down5'.
Removed a total of 0 cells.

11.6. Executing OPT_DFF pass (perform DFF optimizations).

11.7. Executing OPT_CLEAN pass (remove unused cells and wires).
Finding unused cells or wires in module \up3down5..
Removed 1 unused cells and 145 unused wires.
<suppressed ~2 debug messages>

11.8. Executing OPT_EXPR pass (perform const folding).
Optimizing module up3down5.

11.9. Rerunning OPT passes. (Maybe there is more to do..)

11.10. Executing OPT_MUXTREE pass (detect dead branches in mux trees).
Running muxtree optimizer on module \up3down5..
  Creating internal representation of mux trees.
  No muxes found in this module.
Removed 0 multiplexer ports.

11.11. Executing OPT_REDUCE pass (consolidate $*mux and $reduce_* inputs).
  Optimizing cells in module \up3down5.
Performed a total of 0 changes.

11.12. Executing OPT_MERGE pass (detect identical cells).
Finding identical cells in module `\up3down5'.
Removed a total of 0 cells.

11.13. Executing OPT_DFF pass (perform DFF optimizations).

11.14. Executing OPT_CLEAN pass (remove unused cells and wires).
Finding unused cells or wires in module \up3down5..

11.15. Executing OPT_EXPR pass (perform const folding).
Optimizing module up3down5.

11.16. Finished OPT passes. (There is nothing left to do.)

基本操作先介绍到这里,后续会对代码做详细解析。

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

集成电路设计开源EDA软件yosys详解1:工具安装 的相关文章

  • 【Xilinx Vivado时序分析/约束系列6】FPGA开发时序分析/约束-IO时序输入延时

    目录 源同步FPGA输入时序分析的模型 input delay约束 极限input delay 往期系列博客 源同步FPGA输入时序分析的模型 以下为源同步FPGA输入时序分析的模型的示意图 在之前的文章中介绍过 在此介绍一下各个时钟延时的
  • 数字IC手撕代码-兆易创新笔试真题

    前言 本专栏旨在记录高频笔面试手撕代码题 以备数字前端秋招 本专栏所有文章提供原理分析 代码及波形 所有代码均经过本人验证 目录如下 1 数字IC手撕代码 分频器 任意偶数分频 2 数字IC手撕代码 分频器 任意奇数分频 3 数字IC手撕代
  • 数字芯片流程

    芯片设计分为前端设计和后端设计 前端设计 逻辑设计 和后端设计 物理设计 并没有同意严格的界限 这个过程中涉及到了与工艺有关的设计就是后端设计 一 需求分析 产品需要解决的问题 预测3 5年的趋向和走势 确保前瞻性 确保芯片是有卖点的 客户
  • 平头哥(T-Head )开源RISCV处理器OpenC906 RTL仿真

    在过去的几年里 阿里集团平头哥陆续推出了几款RISCV处理器 有些处理器已经在产业界得到了应用 比如在某志的D1处理器中 就嵌入了平头哥的玄铁C906内核为 芯 RISCV虽然是一个开放标准 并且网络上也不乏一些开源核的RTL实现 但是商用
  • DDR的VTT有源端接和无源端接(slua886a笔记)

    DDR的VTT有源端接和无源端接 slua886a笔记 背景 对于DDR的VTT端接 一直有说法是有源端接可降低功耗 之前一直没仔细理解其中原因 现在找了些相关的资料来介绍和对比有源和无源端接 理解有源端接的优点和降低功耗的原理 主要基于读
  • 【FPGA入门】第八篇、FPGA驱动VGA实现动态图像移动

    目录 第一部分 实现效果 第二部分 动态VGA显示的原理 1 将动态显示的区域提前进行赋值 2 图像块的移动是每张图片叠加后的效果 3 如何实现图像块位置的改变 第三部分 系统结构和驱动波形 1 系统的Top down结构 2 图像块移动的
  • 紫光同创 FPGA 开发跳坑指南(三)—— 联合 Modelsim 仿真

    Modelsim 是 FPGA 开发中重要的 EDA 设计仿真工具 主要用于验证数字电路设计是否正确 紫光 Pango Design Suite 开发套件支持联合 Modelsim 仿真 这里作简要的介绍 添加仿真库 方法一 打开 Pang
  • Verilog HDL——分频 计数

    分频 计数 module traffic Clk 50M Rst Clk30 Clk 1Hz input Clk 50M Rst output Clk30 Clk 1Hz 分频器 reg Clk 1Hz 分频器 50M分频 reg 31 0
  • 【科普】波特率和比特速率的理解

    什么是波特率 单位时间内传输的码元个数称为波特率 单位为 Baud 那码元又是什么呢 码元又称为 符号 即 symbol 维基百科上对码元的解释 持续一段固定时间的通信信道有效状态就是码元 这么解释比较抽象 可以解释码元的物理意义 在通信信
  • Matlab 高斯信道下QPSK通带通信系统的简单仿真

    1 原理 2 仿真 3 总结反思 4 参考资料 1 原理 QPSK的具体内容请参考百度 QPSK的调制jie框图大致如下 QPSK信号可以采用正交调制的方式产生 如第一张图片的左半部分 I路信号与cos 信号相乘 Q 路信号与sin信号相乘
  • 用Vscode编辑verilog代码配置

    这篇教程感觉很详细了 我这里分享一下vscode和插件的安装包链接 都是官网下载的 放心食用 用VSCode编辑verilog代码 iverilog编译 自动例化 自动补全 自动格式化等常用插件 链接 https pan baidu com
  • MOS管的知识,看这一篇就可以了

    转载 21ic电子网 2020 11 15 18 19 以下文章来源于记得诚电子设计 作者记得诚 记得诚电子设计 分享电子硬件知识 永远相信美好的事情即将发生 今天的文章简单总结一下MOS管 如下是本文目录 场效应管分类 场效应管分为结型
  • 最详细的Vivado安装教程

    V i v a d o 安 装
  • 跨时钟域处理方法(一)——打拍

    一 说明 处理跨时钟域的数据可以分为单bit数据和多bit数据 而打拍的方法主要常见于处理单bit数据的跨时钟域问题 打拍的本质是通过添加寄存器 对输入的数据进行延拍 其主要目标是消除亚稳态的影响 常见的是打2拍 也就是添加2级寄存器 二
  • 数码管电子时钟

    文章目录 前言 一 回顾数码管 二 任务描述 三 系统框图 四 模块调用 五 模块原理图 六 工程源码 6 2 时钟计数模块代码 6 2 数码管驱动模块代码 6 3 顶层模块代码 七 仿真测试 7 1 测试代码 7 2 仿真结果 八 管脚信
  • FIFO读写控制

    如果在两个模块之间传输数据 两个模块之间的处理速率不同 会导致采集数据的遗漏或错误 在他们之间加一个数据缓存器 所有数据先经过缓存器缓存 再输入数据接送模块 创建两个模块 一个 作为发送模块 一个作为接受模块 发送模块检测到 fifo为空开
  • 使用七牛云进行文件上传

    目录 一 七牛云入门测试 1 注册七牛云账号 完成后选择对象存储 2 在里面创建空间 一个空间相当于一个文件夹 就是将对象上传到的地方 3 查看个人秘钥 注册完成账号后 会有一个秘钥 上传文件的时候进行授权和认证 4 文件上传测试 二 封装
  • 【FPGA多周期时序约束详解】- 解读FPGA多周期时序约束的全过程

    FPGA多周期时序约束详解 解读FPGA多周期时序约束的全过程 FPGA作为数字电路设计的常见工具 其设计中必然会遇到时序约束的问题 而多周期时序约束更是FPGA设计中不可避免的难点之一 本文将详细介绍FPGA多周期时序约束的全过程 并结合
  • Vivado ILA的debug信息保存与读取

    保存 write hw ila data D Project FPGA ILA Debug Data 202401041115 ila upload hw ila data hw ila 1 读取 display hw ila data r
  • ESP10B 锁定连接器

    ESP10B 锁定连接器 ESP10B 电机新增内容包括双极型号标准 NEMA 尺寸 17 23 和 34 的步进电机现在包括输出扭矩范围从 61 盎司英寸到 1291 盎司英寸的双极型号 该电机配有带锁定连接器的尾缆 可轻松连接 每转可步

随机推荐

  • opencv颜色识别思路

    一 Opencv颜色识别步骤 调用手机摄像头 Opencv颜色处理 存储色块图像和位置信息 接下来主要介绍opencv颜色处理过程 二 Opencv图像处理思路 创建滑动条 用来调节阈值 识别出不同颜色 颜色空间转换 将RGB转换为HSV模
  • YOLO v5算法详解

    1 YOLO v5网络结构 2 输入端 3 Backone网络 4 Neck网络 5 Head网络 1 YOLO v5网络结构 图 1 YOLO v5网络结构图 由上图可知 YOLO v5主要由输入端 Backone Neck以及Predi
  • 列表元组字符串是python的什么系列_Python 序列(字符串、列表、元组)概述

    在 Python 中有六种基本数据类型 即数字 包括整形 长整 浮点 字符串 列表 元组 字典和布尔类型 其中 字符串 列表 元组被称之为序列 因为它们有着相同的访问模式 它们的每一个元素可以通过指定一个偏移量的方式得到 而多个元素可以通过
  • upload-labs 第四关-第九关闯关方法

    Pass 04 1 打开靶机 点击查看提示 发现这是一个 htaccess绕过 2 写入一个 htaccess的文件 文件内容如下 3 将文件修改为 htaccess的文件 4 上传文件 5 新建一个文本文档 内容如下 6 将文件类型修改为
  • [k8s]k8s架构图解

    k8s架构图解 启动参数及证书梳理 master端必须要装flannel 注 flannel网络能确保各节点间 Pod 网段实现互通 master 节点与 node 节点上的 Pods 通过 Pod 网络通信 所以需要在 master 节点
  • 搜索算法——爬山法

    不断更新中 一 爬山算法 爬山算法是一种简单的贪心搜索算法 该算法每次从当前位置的临近空间中选择一个最优解作为当前解 直到达到一个局部最优解 爬山算法可以类比成一个有失忆的人在浓雾中爬山 这里就揭示了爬山算法的两个问题 失忆 就是说这个人不
  • decode函数_decode函数的妙用

    如下这张表 包含id和name两列 其中id是主键 name允许为空 存在两条记录 一条是 id 1 name a 另一条是 id 2 name SQL gt create table emp id number primary key n
  • MySQL-数据库读写分离(中)

    作者 小刘在C站 个人主页 小刘主页 努力不一定有回报 但一定会有收获加油 一起努力 共赴美好人生 学习两年总结出的运维经验 以及思科模拟器全套网络实验教程 专栏 云计算技术 小刘私信可以随便问 只要会绝不吝啬 感谢CSDN让你我相遇 前言
  • 基于iView-Cascader的多选级联选择器:cascader-multi

    前言 iview的cascader 多级联动虽然可以实现多级联动 但是不支持多选 这里 cascader multi 可以支持多选功能 实现效果 真实效果和他有出入 这是网上找的好看的动图 实现步骤 1 安装 npm i cascader
  • 求解集合A和集合B的差集

    求解集合A和集合B的差集 题目 已知集合A和B的元素分别用不含头结点的单链表存储 函数difference 用于求解集合A与B的差集 并将结果保存在集合A的单链表中 例如 若集合A 5 10 20 15 25 30 集合B 5 15 35
  • 关于vue-cli 3版本做的改动,没有static文件夹,本地文件应放在哪儿,如何引用

    2 x版本 3 0版本 原来放在static下的文件 现在应该放在public文件夹下 原来的请求数据的写法 现在的写法 总结 vue3 0 对脚手架的结构和静态文件的引用方式都进行了简化
  • 字符流字节流相互转换

    1 字节输出流转换成字符输出流 写到硬盘 创建字节输出流 FileOutputStream fis new FileOutputStream E document aaa txt 字节输出流转换成字符输出流 OutputStreamWrit
  • 使用Python办公自动化:将文本与图表写入到PPT中

    使用Python办公自动化 将文本与图表写入到PPT中 其中含有写入文本 表格及图表到PPT中的一些常用函数 还含有一些对单元格的操作函数 代码如下 import pptx from pptx util import Inches from
  • 模型视图投影矩阵传递

    11
  • mysql 批量插入更新数据 的 两种方法

    有时会有这种需求 当符合某种条件的数据存在时 去修改它 不存在时 则新增 也就是saveOrUpdate操作 当没有的时候就是插入语句 有数据的时候判断主键和唯一索引是否一样 一样那就按照 ON DUPLICATE KEY UPDATE写的
  • 安装raw文件下的apk文件

    有时候我们需要将一些小软件嵌在我们的软件里面 那么我们就可以将这些apk放在我们的raw或者assets文件下进行暂时存储 那么下面我们用放在raw文件下进行展示安装这一过程 首先我们要把我们需要隐藏我apk文件放在raw文件下 raw是在
  • Dirichlet distribution狄利克雷分布

    狄利克雷分布 狄利克雷分布 维基百科 是一组连续多变量概率分布 是多变量普遍化的B分布 为了纪念德国数学家约翰 彼得 古斯塔夫 勒热纳 狄利克雷 Peter Gustav Lejeune Dirichlet 而命名 狄利克雷分布常作为贝叶斯
  • [1036]Jadx gui(JAVA反编译工具)

    github https github com skylot jadx Jadx gui是一款JAVA反编译工具 一个简单轻巧的 DEX 到 Java 反编译器 可让您导入 DEX APK JAR 或 CLASS 文件并将其快速导出为 DE
  • 实时数据库,内存数据库,关系型数据库比较

    内存数据库 内存数据库就是将数据放在内存中直接操作的数据库 它利用内存的读写速度比磁盘快 内存是随机访问而磁盘是顺序访问这两个特点 将数据保存在内存中 在内存中模仿建立表结构和索引结构并针对内存特性进行优化 相比从磁盘上访问 内存数据库访问
  • 集成电路设计开源EDA软件yosys详解1:工具安装

    yosys为一套开源的针对verilog的rtl综合框架 从本节开始将详细介绍工具的使用 并详细对源代码进行分析和讲解 首先介绍一下工具的安装和使用 yosys的git网址为https github com YosysHQ yosys 下面