Go 언어로 verilogHDL로 만든 pwm 시뮬레이션
16586 단어 GoVerilogHDLVerilogSystemVerilog
golang으로 pwm 시뮬레이션
목표
LPF 시뮬레이터를 만들 때 실제 pwm 파형을 생성할 수 있는 함수군이 있다면 좋겠다.
어?Model Sim 아니요, 모르는 아이예요.
Virolog HDL 설치
VerilogHDL로 기술(업데이트 예정)
10 bit 고정
pwmc.svmodule 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.gofunc 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.gofunc 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.gofunc 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.gofunc 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.gofunc fullSubber(a, b []bool) []bool {
return fullAdder(a, allFlip(b))
}
진정한 감법 회로는 다음과 같다.
hoge.gofunc 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.gofunc 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.gotype 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.gofunc 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
코드 그룹
Reference
이 문제에 관하여(Go 언어로 verilogHDL로 만든 pwm 시뮬레이션), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Soleiyu/items/4ce80c91bc142c806dff
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
LPF 시뮬레이터를 만들 때 실제 pwm 파형을 생성할 수 있는 함수군이 있다면 좋겠다.
어?Model Sim 아니요, 모르는 아이예요.
Virolog HDL 설치
VerilogHDL로 기술(업데이트 예정)
10 bit 고정
pwmc.svmodule 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.gofunc 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.gofunc 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.gofunc 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.gofunc 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.gofunc fullSubber(a, b []bool) []bool {
return fullAdder(a, allFlip(b))
}
진정한 감법 회로는 다음과 같다.
hoge.gofunc 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.gofunc 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.gotype 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.gofunc 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
코드 그룹
Reference
이 문제에 관하여(Go 언어로 verilogHDL로 만든 pwm 시뮬레이션), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Soleiyu/items/4ce80c91bc142c806dff
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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
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)))
}
차치 = 뺀 숫자 + 비트 반전(뺀 수량) +1func 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
코드 그룹
Reference
이 문제에 관하여(Go 언어로 verilogHDL로 만든 pwm 시뮬레이션), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Soleiyu/items/4ce80c91bc142c806dff텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)