Home SPI or DEC2BIN implementation for quick simulation
Post
Cancel

SPI or DEC2BIN implementation for quick simulation

如果仅用于快速模拟仿真用,SPI和dec2bin本质上是一样的。

1. 实现方案

可以通过以下两种方式实现

方案1:先移位后取余

先右移i位,再对2取余。

方案2:先取余后移位

先对2^(i+1)取余,再右移2^i-1位。

2. 实现方式

根据以上分析,显然第一个方案更直接。下面两种实现方式均以第一个方案为例。

用analogLib中vdc实现

可以通过一组理想源实现多位转换,第i位的DC voltage设为VDD*(fmod(vin>>i,2))。其中,VDD是电源电压(参数),vin是待转换的十进制值(参数),i是相应bit的具体数字。

当然,也可以通过pPar (parent parameters)将参数以CDF parameter显示在symbol属性上,只需将第i位的DC voltage设为pPar("VDD")*(fmod(pPar("vin")>>i,2))

用veriloga实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
`include "constants.vams"
`include "discipline.vams"

module DEC2BIN_16b(out)

`define NumOfBits 16

output [`NumOfBits-1:0] out;
electrical [`NumOfBits-1:0] out;
parameter integer vin = 0;
parameter real VDD = 1;

genvar i;

analog begin
  for (i=0; i<`NumOfBits; i=i+1) begin
    V(out[i]) <+ (vin>>i % 2) * VDD;
  end
end

endmodule

或者也可以通过以下方式实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
`include "constants.vams"
`include "discipline.vams"

module DEC2BIN_16b(out)

`define NumOfBits 16

output [`NumOfBits-1:0] out;
electrical [`NumOfBits-1:0] out;
parameter integer vin = 0;
parameter real VDD = 1;

genvar i;

analog begin
  for (i=0; i<`NumOfBits; i=i+1) begin
    V(out[i]) <+ (floor(vin/pow(2,i)) % 2) * VDD;
  end
end

endmodule

or

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//VerilogA Module for 6bit Decimal to Binary Decoder

`include "constants.vams"
`include "disciplines.vams"

module busset6_enhanced(d_out,d_out_b,v_high,v_low)

`define NumOfBits 16

output [`NumOfBits-1:0] d_out;
electrical [`NumOfBits-1:0] d_out;
output [`NumOfBits-1:0] d_out_b;
electrical [`NumOfBits-1:0] d_out_b;
input v_high;
electrical v_high;
input v_low;
electrical v_low;

parameter integer dec_in = 0;
parameter integer v_high = 1;
parameter integer v_low = 0;

analog begin
	generate i (`NumOfBits-1,0) begin
		V(d_out[i]) <+ (VarInDecimal&(1<<i))? V(v_high): V(v_low);
		V(d_out_b[i]) <+ (VarInDecimal&(1<<i))? V(v_low): V(v_high);

endmodule
This post is licensed under CC BY 4.0 by the author.

CPM in virtuoso

stop cadence simulation via VerilogA code