一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 12002|回复: 17

看看我的挖矿FPGA板

[复制链接]
发表于 2019-3-1 14:10 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2019-3-1 14:14 编辑 6 y, ]! ]# K+ H- Z
5 M3 i: D9 f& A8 z
在闲鱼买了几块蚂蚁T9的控制板,价格也不错所以买来研究一下。/ Y, Z2 k5 \6 ~" w- Z4 p+ D; r
其实也不是得闲无所事事的,我研究了ZYNQ已有几个月了,之前一值搞ACTEL的但功能达不到我的要求,所以改为ZYNQ的。8 L  b; _$ U& D
看图# }8 C; H: [& w- g9 s( ^, m
20190301_105203.jpg ; B; ?) P# o+ J  O  a
20190301_122230.jpg : C4 H: u2 F+ @1 O# `5 E  i

2 M$ n% y: [( z8 U/ U) R9 n& x7 L
8 P8 y8 }+ A0 T% U4 o
) f& R. H1 p4 c6 D" s/ i. x虽然好多引脚都没有引出来,但基本上还是够用了。
0 j* J) |. c) K* Q
& X) ~9 v3 P. T0 }9 Z
2 A) \, D) v5 C. Z* c
2 e( G: Q1 ~) [% {( w
: o, E/ F! M: c" p. m& t: z6 R% H  |5 b* U" D0 F9 H7 X0 J0 C( O2 m
 楼主| 发表于 2019-3-1 14:18 | 显示全部楼层
xilinx 的开发工具相当强大,如果能把它的HLS 搞定那做的事情还是相当的多的。带硬件加速功能比RK3399还要快的。
回复

使用道具 举报

发表于 2019-3-1 14:51 | 显示全部楼层
回来就把芯片拆了?好羡慕你们玩这类东西的。我51都没完全整明白,写的代码稀烂。

点评

没有原理图不拆不行的, 代码写的烂没关系的,技术积累还是关键 我也在ZYNQ的例程上学到C语言的最高境界是什么,所以还是看多,做多,就会学得多,兄弟快慢慢来。  详情 回复 发表于 2019-3-1 15:12
回复

使用道具 举报

 楼主| 发表于 2019-3-1 15:12 | 显示全部楼层
8055 发表于 2019-3-1 14:51
9 q3 j* t0 \" h+ V- [4 b0 D回来就把芯片拆了?好羡慕你们玩这类东西的。我51都没完全整明白,写的代码稀烂。
0 W* d  |" v" K: p, b8 P# ^1 P; ?
没有原理图不拆不行的,- I3 h$ x4 Z' w: u7 S( @) d
代码写的烂没关系的,技术积累还是关键6 F: S/ Z: c) W+ {' @
我也在ZYNQ的例程上学到C语言的最高境界是什么,所以还是看多,做多,就会学得多,兄弟快慢慢来。- h" |% W5 l+ l4 q
回复

使用道具 举报

 楼主| 发表于 2019-3-1 15:18 | 显示全部楼层
ZYNQ采用了结构指针加函数指针来实现复杂的功能还有它总之采用强制转换来实现类型转换,所以好多用了void *
+ h; ^1 H; ^% Y3 Z- r. M
+ E/ V, G9 x- t( O$ o& r$ p7 v
7 ]" N' X: e) i' s1 \7 F/ G#include <stdio.h>
2 Z$ h* C. }6 J: x5 n#include "xscugic.h"9 e# E. Q; w" e6 q. T
#include "xil_exception.h"' ]+ K! J- k1 Z- [, W0 n3 `2 A

! C) W& V& ]" Q#define INT_CFG0_OFFSET 0x00000C00% c  N* K% Y( C2 r
- e  R. \) ^( s: f7 I6 r
// Parameter definitions& K& ?2 Q! U; B( g, l0 a
#define SW1_INT_ID              616 `1 q, v) ~' i' l8 L
#define SW2_INT_ID              62
. s3 H. G/ T+ e- n$ p1 `# ~/ c#define SW3_INT_ID              63
4 S) o0 s; l# Q#define INTC_DEVICE_ID          XPAR_PS7_SCUGIC_0_DEVICE_ID3 u0 e' U6 C8 i, t' c6 r
#define INT_TYPE_RISING_EDGE    0x03# Y5 P* G& x9 D
#define INT_TYPE_HIGHLEVEL      0x01/ n- ~( ?8 [+ s* K
#define INT_TYPE_MASK           0x03
! H! I9 G7 Z- Y& H: [4 T6 U
* ]% q4 N) I7 s4 b' m) [static XScuGic INTCInst;
! R. a/ P/ f, P7 p
+ i8 O" c/ H( ^/ Cstatic void SW_intr_Handler(void *param);9 y4 I8 M& V5 q; {& k' K
static int IntcInitFunction(u16 DeviceId);  N. u% i4 v3 f: i: j. z
+ [. \# c% k5 l: ~7 k+ y
static void SW_intr_Handler(void *param)! t. t/ J' [/ t4 T% g) O. n; c
{7 S9 T6 }/ F' U/ ~7 ^- O/ P9 Z$ \
    int sw_id = (int)param;
  }( o3 b) ^$ G, @9 @    printf("SW%d int\n\r", sw_id);
3 v4 c1 p% S1 v# W+ b  ^# g}; |/ ?% \. H" D) ]1 s/ h8 ^& u

: ]/ E1 Z7 I$ m! ^; h* Lvoid IntcTypeSetup(XScuGic *InstancePtr, int intId, int intType)$ K# ~$ W6 d: A: @
{
0 b; Y! r  H( O# Y$ G* \% A    int mask;
' B" @$ W* ^% T0 Q, n5 J+ Z) q2 ]8 c' d( z8 P" d
    intType &= INT_TYPE_MASK;
# V4 K/ c# t% Z5 f    mask = XScuGic_DistReadReg(InstancePtr, INT_CFG0_OFFSET + (intId/16)*4);$ {; t4 N, l2 H3 d: h; B% g
    mask &= ~(INT_TYPE_MASK << (intId%16)*2);* V1 G2 i6 `3 I  ^9 Z6 D
    mask |= intType << ((intId%16)*2);! T) x, i4 q, r. Z7 J9 V
    XScuGic_DistWriteReg(InstancePtr, INT_CFG0_OFFSET + (intId/16)*4, mask);# L% \+ g) W& e0 h& }* U
}. R) k" N6 u$ ^- I

6 Y; u# T1 `5 ]" s! J8 A/ Y! Uint IntcInitFunction(u16 DeviceId)
) g  c/ Z1 I( w* s{
6 E0 m' ^* n9 g' n5 @    XScuGic_Config *IntcConfig;7 m5 U0 R9 o+ j
    int status;# c: M, ?* k9 m6 w/ A
4 C0 g) s$ i( E" |1 ^. u
    // Interrupt controller initialisation
  E8 p% y, h4 O$ l' f7 F    IntcConfig = XScuGic_LookupConfig(DeviceId);
5 D( L' k- ]5 }- v  }9 q( k8 V    status = XScuGic_CfgInitialize(&INTCInst, IntcConfig, IntcConfig->CpuBaseAddress);1 z  Q9 R7 ^' }  K
    if(status != XST_SUCCESS) return XST_FAILURE;4 x6 {0 W1 @# Q2 U$ a

: O0 Z7 x# j% r1 q8 q8 Q    // Call to interrupt setup
/ H: {; f5 x* C( U    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,4 Y7 o2 A5 Q4 h& W0 G
                                 (Xil_ExceptionHandler)XScuGic_InterruptHandler,
: p' L/ D/ U1 f5 Q4 V  W- `* Y, f% v                                 &INTCInst);
! A1 x( B: F) q" H0 Q. v    Xil_ExceptionEnable();& |3 v; N+ ~# R- v. L+ r0 G: B% U$ u

; |. f. U( L4 u4 f4 g9 w0 h, _3 x/ `/ R    // Connect SW1~SW3 interrupt to handler  B9 T! B5 y- O+ r0 I" b+ ^! s
    status = XScuGic_Connect(&INTCInst,
9 q9 _& T5 ]" j" o                             SW1_INT_ID,
1 b" g* g$ S# E* u( o6 q' E                             (Xil_ExceptionHandler)SW_intr_Handler,7 N; |3 H, s. M# @. T/ a: \- _
                             (void *)1);- N' V8 y& m  v6 L+ M+ {! ?2 D& g
    if(status != XST_SUCCESS) return XST_FAILURE;
1 h( `/ c% p) h9 N; {, T
/ i3 p1 l+ K. D! G    status = XScuGic_Connect(&INTCInst,
/ e* I: _7 r8 z/ a& _$ C7 A) Y                             SW2_INT_ID,
4 h  ?5 w8 F3 P6 P% G& Y# X4 W                             (Xil_ExceptionHandler)SW_intr_Handler,
$ t/ k" M2 e, e0 ^9 H                             (void *)2);0 C, p& F- Y9 W9 L2 a; d0 u
    if(status != XST_SUCCESS) return XST_FAILURE;6 x4 `1 h1 y% p% Q7 h8 L
% C. r4 Q5 B- c+ \) z, F! \
    status = XScuGic_Connect(&INTCInst,
% ^8 ?5 f7 u) W0 L8 m                             SW3_INT_ID,
4 Q# d) k5 S6 ~- \6 Q) m& E                             (Xil_ExceptionHandler)SW_intr_Handler,/ u+ g2 e: e7 P8 S1 n8 s
                             (void *)3);
: ~/ w/ B  R) f5 X" Z    if(status != XST_SUCCESS) return XST_FAILURE;) R) \2 s* F2 {2 F9 s

5 N8 J! L7 e( x( y# i7 X    // Set interrupt type of SW1~SW3 to rising edge1 \4 D+ B  H( c) x2 C% `! z5 B
    IntcTypeSetup(&INTCInst, SW1_INT_ID, INT_TYPE_RISING_EDGE);
/ l9 q: s  U1 T9 i1 Z8 R3 r5 W    IntcTypeSetup(&INTCInst, SW2_INT_ID, INT_TYPE_RISING_EDGE);
4 O4 v$ x9 f& M* q' d1 z5 s    IntcTypeSetup(&INTCInst, SW3_INT_ID, INT_TYPE_RISING_EDGE);# b- E* M# X( H0 |% s* v
& {) K8 ~) c9 k
    // Enable SW1~SW3 interrupts in the controller
# k' {5 @. @: [1 t, H! E    XScuGic_Enable(&INTCInst, SW1_INT_ID);
3 \2 f% }% C8 O" r    XScuGic_Enable(&INTCInst, SW2_INT_ID);6 L4 k4 l, y  o' F6 F
    XScuGic_Enable(&INTCInst, SW3_INT_ID);. b. J2 v) q& q2 [

1 \+ O% H2 i( ]    return XST_SUCCESS;
+ e; \( V5 n+ f# a5 F0 e}. r# r" N4 D9 M$ U+ f/ m4 M
0 A! {3 Y; d- L3 i" [5 V8 G
int main(void)
1 F3 }# Q. @& H( L+ V2 i{- `, G& ~! {) i, n
    print("PL int test\n\r");: U5 C" t3 U9 [% C; b" v$ x7 b: W
    IntcInitFunction(INTC_DEVICE_ID);
9 B3 d2 ~/ \9 f) `% X    while(1);
& @) s1 o; O& k  S6 I; \0 z/ d    return 0;9 v6 L; B8 K% |5 ]3 W6 @" F
}2 ^# C1 z5 q0 p) V) }& Q

, l: c, N6 K6 O- ?
7 }% S6 t. F9 s4 E5 \1 t- t; G5 K; G
回复

使用道具 举报

发表于 2019-3-2 17:19 | 显示全部楼层
编程思想其实不难,难的是各个硬件用的c调用某个功能寄存器时有特定的写法,有的调用之前要先写一堆东西,有的又从新封装过,调用的是库函数,并且有时候调用的逻辑很2。
# E4 Y, Q8 e9 u% c0 k总的来说要编写出一个功能,记忆力牛逼可以达到8成,剩下的2成才是逻辑思维及靠智商来完成,

点评

不错,有见地。 正所谓有心吾怕迟,大家一起努力。  详情 回复 发表于 2019-3-2 20:28
回复

使用道具 举报

 楼主| 发表于 2019-3-2 20:28 | 显示全部楼层
MOWEIWEI 发表于 2019-3-2 17:19
6 S+ |# n( l3 G+ Z% C' h+ c  d$ n5 E编程思想其实不难,难的是各个硬件用的c调用某个功能寄存器时有特定的写法,有的调用之前要先写一堆东西, ...
( X% ~. U+ i5 |/ z
不错,有见地。
; z2 M8 h. \. W: x* t; V2 _) W) h7 A正所谓有心吾怕迟,大家一起努力。$ {5 ?$ `6 g* s: T" \
回复

使用道具 举报

 楼主| 发表于 2019-3-8 15:49 | 显示全部楼层
测了一下还是相当不错的。. k0 O" D8 g5 ^/ F( A9 ~
图片为DDR3 内存检测
( A7 t9 d% Z1 o+ o) A, O4 n
: c; I4 z8 [# P8 O" G: H5 g0 X; K9 @7 ]) S6 t( A& j

' L- Y3 f, c# A9 X" S$ Y" f
) ~2 z$ `" y6 |) P5 W
5 V, @3 y3 {% l' J* l) P7 f
回复

使用道具 举报

 楼主| 发表于 2019-3-8 15:49 | 显示全部楼层
测了一下还是相当不错的。7 R( ]& i$ x% H% \8 c$ k" f5 f
图片为DDR3 内存检测' O5 p1 o* n: b6 |' L  m  {
20190308_153847.jpg 20190308_153855.jpg 4 C4 t* L; |3 f4 ?

: i  W$ S. J1 u
1 x) G0 A# l: j7 v" {; K) U6 Z
- V+ f# d" B! |' i. @; B2 q/ p- \9 K* J. n1 f9 P& w6 H8 x
回复

使用道具 举报

 楼主| 发表于 2019-3-8 15:54 | 显示全部楼层
写了一个PL 部份的码独立于PS
7 ?$ \. Z6 t( Y% R' Y- n/ |) [4 V% l1 G
`timescale 1ns / 1ps3 K& T* d. B4 r
//////////////////////////////////////////////////////////////////////////////////
* a* l9 {& e( }, P1 B% B" E! L// Company: 6 e$ {4 |% l7 s; F6 N( U3 v. @% Q0 \* r& T
// Engineer:
& s3 C: G8 Y6 o) o# s' |//
% ~" e6 {. f7 V: b: `% m* j// Create Date: 2019/03/07 11:00:23% x$ h- |" T1 K. N% @) L3 J& q
// Design Name: : A$ k) o5 q8 K( @! ?" V
// Module Name: LED, a9 a- q) _$ L' F& \) m" N
// Project Name: + k2 g# w/ [5 c1 E. m) y, u2 e
// Target Devices: 8 s: X& r3 K: ]. [+ r& W! }
// Tool Versions:
( ?+ I$ O' r. j& k7 @7 I// Description: . T, J$ u( D# w( k+ _2 o
//
  V) _1 E9 r( s2 ?// Dependencies: , Y$ F. {! [' ^5 B+ h+ ~: @
// . K* J' E$ V% g! K% D5 Y0 g
// Revision:
) j0 e( t& r2 t! V- m/ c. k// Revision 0.01 - File Created. s. p% s0 s) D) o3 M+ [* H
// Additional Comments:
2 n% C* E& W: Z- g. O! ~//
! t! g7 p0 ]3 @//////////////////////////////////////////////////////////////////////////////////2 n- \$ k+ r6 \, c+ L, z  k
4 @+ ~4 C0 i3 Z  R
module LED(! [* e; o/ l4 k  I
           iGclk,# t% r! u' ?, r; K  m
           iRSTn,
1 `, j! ?  X' W0 |" ^- z6 ]4 W+ |           oLED! p/ E* \" S& v; O$ _* E/ e" |4 `

4 B# q0 F$ f7 V+ F' a    );# ]2 a/ X. d, m  W8 o+ n
    , n5 R8 t4 q# Q/ k. X
input iGclk;    5 }7 Y/ a) U2 w3 k
input iRSTn;
4 k  V: C1 B2 n& e1 g8 Toutput oLED;, M6 K" a+ _: M
reg oLED;6 m& b: ?8 L& l  I
reg [16:0]count;; v9 U( \& k  P" r
; b% k3 a+ s7 S4 E% C
always @(negedge iRSTn or posedge iGclk)   
* F+ N( \! e) q) `. a$ tbegin0 \6 s9 w* o" O3 N9 H7 M+ W: S
if(!iRSTn)count = 0; # ]9 @0 D0 |2 A
  else count = count + 1'b1;5 m) d2 U- f! b+ U6 \! s# q
end7 K9 T# b' K7 B7 n
; j4 Q5 P7 w8 w+ h0 J  u
always @(negedge iRSTn or posedge iGclk)
" s  o. A4 n* `* d* @: ?* _1 nbegin
4 Q+ ^' G( P$ g3 `. Z6 A: G. I6 L- a9 ?$ M if(!iRSTn)oLED <= 1'b0;' Y; ]7 O/ ?# V) r
  else if(count == 0) oLED <= ~oLED;
6 {; ~4 j, N( s2 Zend* d# A, Z$ Q, G' C
    # q, X4 P- z0 `. L: N
endmodule
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2026-1-12 00:55 , Processed in 0.038831 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表