Go 언어로 verilogHDL로 만든 pwm 시뮬레이션

golang으로 pwm 시뮬레이션


목표


LPF 시뮬레이터를 만들 때 실제 pwm 파형을 생성할 수 있는 함수군이 있다면 좋겠다.
어?Model Sim 아니요, 모르는 아이예요.

Virolog HDL 설치


VerilogHDL로 기술(업데이트 예정)
10 bit 고정
pwmc.sv
module pwmc (
    input wire clk,
    input wire [9:0] vq,
    output wire pulse
);

reg [9:0] cnt;
wire [10:0] qc = {1'b1, vq} - {1'b0, cnt};

assign pulse = qc[10];

always @(posedge clk) begin
    cnt <= cnt + 10'b1;
end

initial begin
    cnt = 10'b0;
end

endmodule

이런 느낌의 회로.
간단하네.

Go 언어 구현 1


func xor3


Go 언어 3 입력 XOR 없나요?
내가 할게.

진리치표와 카노토가 여기 있습니다.
이로써 다음과 같은 논리 함수를 내보낼 수 있다
y = a\cdot b\cdot c + a\cdot\overline{b}\cdot\overline{c} + \overline{a}\cdot b \cdot\overline{c} + \overline{a}\cdot\overline{b}\cdot c
그러니까
main.go
func xor3(a, b, c bool) bool {
    return a && b && c || a && !b && !c || 
        !a && b && !c || !a && !b && c
}
그렇구나.

func fullAdder


모든 가법기는 없습니까?
내가 할게.

화식


a, b 입력 정보
모든 비트
ans[i] = xor3(a[i], b[i], キャリーc)
갈릭 파
c = a[i] \cdot b[i] + b[i] \cdot c + c \cdot a[i]
나타내다
그러니까
main.go
func fullAdder(a, b []bool) []bool {
    ans := make([]bool, len(a))
    c := false

    for i := 0; i < len(ans); i++ {
        ans[i] = xor3(a[i], b[i], c)
        c = (a[i] && b[i]) || (b[i] && c) || (c && a[i])
    }

    return ans
}
그렇구나.

func countUp


계수기 회로를 만들기 위해서.
증량 없어요?
내가 할게.
fullAdder 사용 가능
좀 더 간소화할 수 있어요.
main.go
func countUp(inp []bool) []bool {
    ans := make([]bool, len(inp))
    c := true

    for i := 0; i < len(ans); i++ {
        ans[i] = xor3(inp[i], c, false)
        c = inp[i] && c
    }

    return ans
}

func allFlip


감법 회로를 만들기 위해 모든 위비트를 반전시키는 함수를 준비했다.
main.go
func allFlip(inp []bool) []bool {
    ans := make([]bool, len(inp))

    for i := 0; i < len(ans); i++ {
        ans[i] = !inp[i]
    }

    return ans
}

func fullSubber


이미 감법 회로를 위해 준비를 마쳤다.
이것은 진정한 감법 회로가 아니라는 것을 주의하십시오.
main.go
func fullSubber(a, b []bool) []bool {
    return fullAdder(a, allFlip(b))
}
진정한 감법 회로는 다음과 같다.
hoge.go
func subber(a, b []bool) []bool {
    return fullAdder(a, countUp(allFlip(b)))
}
차치 = 뺀 숫자 + 비트 반전(뺀 수량) +1

func lb


string -> []bool
변환 함수.따로
inp[n] -> ans[0],
inp[0] -> ans[n]
endian 변환(?)진행하다.
그러니까
'0100'은요.
inp[0] : 0
inp[1] : 1
inp[2] : 0
inp[3] : 0
하지만
ans[0] : 0
ans[1] : 0
ans[2] : 1
ans[3] : 0
사용자 정의 모양새를 정의합니다.
고맙습니다.
main.go
func lb(inp string) []bool {
    ans := make([]bool, len(inp))

    for i := 0; i < len(ans); i++ {
        if inp[len(ans) - 1 - i] == '1' {
            ans[i] = true
        } else {
            ans[i] = false
        }
    }
    return ans
}

pwmc struct


main.go
type Pwmc struct {
    count []bool
    bitWidth int
}

func NewPwmc(bw int) *Pwmc {
    ins := new(Pwmc)
    ins.bitWidth = bw
    ins.count = make([]bool, bw)
    return ins
}

func (ins *Pwmc) ClockUp (vq []bool) bool {
    qc := fullSubber(
        append(vq, lb("1")...), append(ins.count, lb("0")...))

    ins.count = countUp(ins.count)

    return qc[ins.bitWidth]
}
순서대로 성명, 구조 함수와 철도 블록

주 함수


main.go
func main() {

    num_plot := 50
    pwmins := NewPwmc(5)
    val_inp := lb ("01000")

    for i := 0; i < num_plot; i++ {
        if pwmins.ClockUp(val_inp) {
            fmt.Println (i, 1)
        } else {
            fmt.Println (i, 0)
        }
    }
}
이렇게

gnuplot



코드 그룹

좋은 웹페이지 즐겨찾기