一乐电子

一乐电子百科

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

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 6251|回复: 17
收起左侧

看看我的挖矿FPGA板

[复制链接]
发表于 2019-3-1 14:10 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2019-3-1 14:14 编辑
. P+ s4 X" @0 o- H- D$ ]  g" `* [* y' ]3 v: a( x7 u" W
在闲鱼买了几块蚂蚁T9的控制板,价格也不错所以买来研究一下。
' `, w; y( u4 ~; E其实也不是得闲无所事事的,我研究了ZYNQ已有几个月了,之前一值搞ACTEL的但功能达不到我的要求,所以改为ZYNQ的。
2 D; n4 H8 X1 Z# X& e% o看图# Y4 ~) \7 M1 P8 a
20190301_105203.jpg
% ^, w7 y5 n# l! z 20190301_122230.jpg - d* g, \* x/ y
% G3 V' U( Z' t/ Q

2 ]( G3 p6 K/ A; z& u! W5 X0 M
" f( D* H- }+ Y7 z5 V6 o5 }. N虽然好多引脚都没有引出来,但基本上还是够用了。4 p, u  K# M: w

% p9 F  e; A% a$ [5 u7 G4 ]
9 k" c# j1 f) _0 W& q% ^" a5 E* f" x; D

/ Q' g; k) ~0 D3 J0 y
& f! B& s4 j& }+ d; z
 楼主| 发表于 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
2 r! J3 R# a! Y; w回来就把芯片拆了?好羡慕你们玩这类东西的。我51都没完全整明白,写的代码稀烂。

, B, e+ i0 h, m% L( g没有原理图不拆不行的,
# w; _' s/ H- f* D代码写的烂没关系的,技术积累还是关键$ a/ w. l5 ~. ]
我也在ZYNQ的例程上学到C语言的最高境界是什么,所以还是看多,做多,就会学得多,兄弟快慢慢来。5 q- s; g) k, s% w/ Y2 L  m
 楼主| 发表于 2019-3-1 15:18 | 显示全部楼层
ZYNQ采用了结构指针加函数指针来实现复杂的功能还有它总之采用强制转换来实现类型转换,所以好多用了void *6 {# ]$ {. K0 g+ [9 u' Z5 g2 a

  A1 W+ J* r; r+ {+ C9 Q/ B$ x: p( N. ?, T, K' h/ q
#include <stdio.h>) l6 d8 ^. a2 E1 ^$ k
#include "xscugic.h"& d, G# u' j: c* m9 G0 S- ^7 i. O
#include "xil_exception.h"8 D7 s* `! f8 E8 o3 e
, H2 Q  {! X, K
#define INT_CFG0_OFFSET 0x00000C00
* a5 U! W7 _- R
* h0 A* o" S3 h5 s% E// Parameter definitions
; k* K8 S& |& v7 w0 p, Q4 V#define SW1_INT_ID              61
4 J0 I0 ^( A! M! r$ [& C6 D#define SW2_INT_ID              62
5 Q1 ]# p# V7 D3 ?0 e$ ^" W- V#define SW3_INT_ID              63- F- t& U) _! {) Q* v- k4 [
#define INTC_DEVICE_ID          XPAR_PS7_SCUGIC_0_DEVICE_ID3 g# `; r6 _% Z5 y% l/ c2 ?: Z+ B
#define INT_TYPE_RISING_EDGE    0x03
" A8 f1 [8 m7 M# G/ ~- {5 R#define INT_TYPE_HIGHLEVEL      0x01
* Z+ e; U9 b, v% P: s. i7 a; a#define INT_TYPE_MASK           0x03
: P- ~' g0 M3 {: Y* B# J- M6 W2 F+ [1 i9 `: I) a
static XScuGic INTCInst;# T: B5 U. G- d% J1 B2 ~' b
4 T: n! `+ G. J0 n% E
static void SW_intr_Handler(void *param);
5 _  H1 V0 m) Ystatic int IntcInitFunction(u16 DeviceId);
+ S) L" m$ V5 F" G9 i& S5 R+ B
. w+ s  ^$ m7 F- V/ n2 nstatic void SW_intr_Handler(void *param)
) V/ E# ]+ r2 L{
' V  i6 |8 x) R; p5 r    int sw_id = (int)param;
5 ]0 |  ]" k! h& y1 r1 J    printf("SW%d int\n\r", sw_id);
: m6 ~6 y9 v) T}
" @) k' }  ~0 h9 D
! Q2 q4 U! P7 Q- p4 H9 F& [( n+ ~9 nvoid IntcTypeSetup(XScuGic *InstancePtr, int intId, int intType)  y6 @% Z6 i3 y% z9 Z: @% p8 o# h
{
* j! P( t" A) L) S/ n' a; D1 \    int mask;
3 ^* \0 {& |9 p2 X" p5 e' ?' [3 G8 ]$ `5 G* o; }
    intType &= INT_TYPE_MASK;* x6 j% ]( l2 Y, q2 P# {
    mask = XScuGic_DistReadReg(InstancePtr, INT_CFG0_OFFSET + (intId/16)*4);
8 {4 [/ b6 `/ \$ n    mask &= ~(INT_TYPE_MASK << (intId%16)*2);+ e( c5 p' o6 B2 ]  C- J, I; ?
    mask |= intType << ((intId%16)*2);& o7 p( f* E# z
    XScuGic_DistWriteReg(InstancePtr, INT_CFG0_OFFSET + (intId/16)*4, mask);4 [6 D  G4 d" U1 S# S  r
}
, p3 s7 K& x+ H+ Y; f! l2 ~' y3 _6 R6 @( F3 ~$ n. h4 z& U
int IntcInitFunction(u16 DeviceId)
- Z2 S' R3 x4 `$ V  c$ S{
" N- M4 N( f. x" y! ]5 Q    XScuGic_Config *IntcConfig;
: j1 ]9 V' Q& x    int status;
& {; c5 R% B) |- [9 N+ L( Y+ g6 S6 l" H4 d
    // Interrupt controller initialisation4 |3 p8 h& r% X  X
    IntcConfig = XScuGic_LookupConfig(DeviceId);2 R( P6 u# k: _) F6 a" _* k
    status = XScuGic_CfgInitialize(&INTCInst, IntcConfig, IntcConfig->CpuBaseAddress);6 r: \* ~! I! ^
    if(status != XST_SUCCESS) return XST_FAILURE;
5 p; Q& R9 K$ I1 Z- ~/ E
4 H* i2 j7 ]% z6 n    // Call to interrupt setup
& C* v' w2 S5 x    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
5 h; s- i7 z1 e- e, r7 I                                 (Xil_ExceptionHandler)XScuGic_InterruptHandler,
( }/ o8 f' Q2 ~2 T  N                                 &INTCInst);
5 V" ]# \% {) ^: X. i5 A( s; ^/ {    Xil_ExceptionEnable();9 Y3 u+ C( L- p# B# I+ X0 u

; [) t# E& E# A5 i; _    // Connect SW1~SW3 interrupt to handler! R! K% X5 `, O2 E9 E* U2 g( ~5 i+ I
    status = XScuGic_Connect(&INTCInst,
: v$ D" N* M6 }* A$ z% E# w                             SW1_INT_ID,
/ k0 x3 l) _4 e1 ~' |( ]                             (Xil_ExceptionHandler)SW_intr_Handler,
! F7 \! I+ T# O                             (void *)1);
9 D( C$ b% k9 X% t7 s    if(status != XST_SUCCESS) return XST_FAILURE;5 s+ v$ k$ E; e5 A
% A" K4 D; C. G$ S0 ~% R
    status = XScuGic_Connect(&INTCInst,
$ f9 ?. w* N  N                             SW2_INT_ID,7 B& N4 A  }) [: _1 q
                             (Xil_ExceptionHandler)SW_intr_Handler,
6 U  H4 g; h: v  q                             (void *)2);( C8 V: b' Z& e6 J0 J( n" ]
    if(status != XST_SUCCESS) return XST_FAILURE;
1 S2 ]2 G+ e* \$ c% c; T  [5 |
1 o1 q. [% p" [' L    status = XScuGic_Connect(&INTCInst,
, l7 [: j$ o# p$ B0 n2 g: W                             SW3_INT_ID,
& `; V4 @( A! i# |1 B, \; p& f                             (Xil_ExceptionHandler)SW_intr_Handler,
9 }& L' _' O5 G% x# {. @. l                             (void *)3);
! B' Z6 `  ~/ [9 H8 O4 T    if(status != XST_SUCCESS) return XST_FAILURE;
; H1 w/ b9 F. K: q$ u! p+ i) A  X* u' J
7 z7 F- R4 t5 m& J0 \7 }& v    // Set interrupt type of SW1~SW3 to rising edge! T) q6 G5 B+ A( s
    IntcTypeSetup(&INTCInst, SW1_INT_ID, INT_TYPE_RISING_EDGE);# ], i% I) G# Y8 u
    IntcTypeSetup(&INTCInst, SW2_INT_ID, INT_TYPE_RISING_EDGE);7 ?+ Z" r# s: S. ^
    IntcTypeSetup(&INTCInst, SW3_INT_ID, INT_TYPE_RISING_EDGE);
1 W4 ]2 p2 U9 \/ U3 l2 y& h' l- B8 Z' s* M0 d9 l% w6 S% {" O
    // Enable SW1~SW3 interrupts in the controller
" o0 q6 B+ m9 ?  r    XScuGic_Enable(&INTCInst, SW1_INT_ID);
8 T9 p* m; r& }% m% ]    XScuGic_Enable(&INTCInst, SW2_INT_ID);/ H: ?& Z7 V8 |3 c- q
    XScuGic_Enable(&INTCInst, SW3_INT_ID);
* ]9 h! \- z) j" _; L, w
. ~0 p) c' \& O    return XST_SUCCESS;$ O: b& \5 m3 m6 C$ f
}
) E( w! q0 m/ g6 d
! g3 e2 y6 u) Y0 ]* L8 x% k5 Qint main(void)
; b9 m7 ^, D- T1 m, `1 J0 A8 ?! Y0 N{
5 l/ k4 }7 b. }+ \# q, B    print("PL int test\n\r");" L6 b( T* b7 Z" e- B$ X% U
    IntcInitFunction(INTC_DEVICE_ID);& w: ^2 p0 b$ r( |2 r( J. [
    while(1);! ^" z6 x3 S. q- ?
    return 0;2 d$ h+ w6 ?2 [4 M8 Q' n2 M
}
5 o( m* g0 W9 f" A( P
! b% J3 V1 Q1 @5 a8 D, k( z' U' Z& b0 e1 E
- J9 a/ s3 _/ V, E" {6 R
发表于 2019-3-2 17:19 | 显示全部楼层
编程思想其实不难,难的是各个硬件用的c调用某个功能寄存器时有特定的写法,有的调用之前要先写一堆东西,有的又从新封装过,调用的是库函数,并且有时候调用的逻辑很2。# l1 Y* q9 @5 d) f4 w" B
总的来说要编写出一个功能,记忆力牛逼可以达到8成,剩下的2成才是逻辑思维及靠智商来完成,

点评

不错,有见地。 正所谓有心吾怕迟,大家一起努力。  详情 回复 发表于 2019-3-2 20:28
 楼主| 发表于 2019-3-2 20:28 | 显示全部楼层
MOWEIWEI 发表于 2019-3-2 17:19
' v) w* F1 T& a编程思想其实不难,难的是各个硬件用的c调用某个功能寄存器时有特定的写法,有的调用之前要先写一堆东西, ...

3 z% m- C$ p9 _不错,有见地。  M& l; s) J( l0 ]
正所谓有心吾怕迟,大家一起努力。. P& L1 O/ d+ Y$ a9 e
 楼主| 发表于 2019-3-8 15:49 | 显示全部楼层
测了一下还是相当不错的。# c5 I, b4 l" b4 {+ B. |
图片为DDR3 内存检测
5 _4 Y$ J* D' X1 M8 q- u' r3 w5 }( D, t- K& I8 I

; s5 b6 g3 s2 \8 \" }0 v+ C  ^
# Q0 Q" G# [" ]
$ J: Y2 \9 f4 W! X9 G# `6 F4 V3 {8 Z( ]3 q# {& a) ?
 楼主| 发表于 2019-3-8 15:49 | 显示全部楼层
测了一下还是相当不错的。
! K& y! j6 L3 c9 `0 h% |6 W, f图片为DDR3 内存检测. j0 g  e" u: u/ p3 y( S
20190308_153847.jpg 20190308_153855.jpg : [" L5 j# |1 Z, U/ y( k
$ \# o$ I* y" e" f. d
. [$ m* Q1 Q$ Z5 b$ {

4 ^1 K- I7 U2 }( w
$ u% g- ^' c! f! s7 _
 楼主| 发表于 2019-3-8 15:54 | 显示全部楼层
写了一个PL 部份的码独立于PS
  J( r' Q. H" o* n0 X2 |) R* \* w4 j$ B
`timescale 1ns / 1ps
; D* f, ?& m) B$ O* E//////////////////////////////////////////////////////////////////////////////////* Z" M* X# A3 C7 L" l" ~& e, D
// Company:
' @  ~& ^: a( @# A: K9 ?+ g// Engineer: 8 t' ?5 G, N: y+ |6 W* B- l' b
// ; F3 u5 c3 M) k! D# U  c+ d, y
// Create Date: 2019/03/07 11:00:23
6 z! `0 O( U2 A6 ]0 Y. T. O// Design Name: 1 M9 }+ p' E# A+ Q2 B
// Module Name: LED
$ ]4 c" R/ G2 v  l  R1 d// Project Name:
4 h5 A0 Z7 z; r// Target Devices:
8 G9 m+ E2 a3 L' u- @& p* x5 F& b) i// Tool Versions:
+ P2 C3 o- z) V& k/ \// Description: 9 q- m2 k1 \$ @3 T7 O
//
$ c% m/ ?  b6 o$ o+ H; p3 e9 m' v// Dependencies:
  k& C! B+ j4 m7 f//
; B" K9 F8 |" a& w! _$ q' T. g1 t// Revision:
' n, d6 Z, Z2 I' Y" H6 `0 t// Revision 0.01 - File Created; V, t  u/ z) a  X1 r2 A9 z
// Additional Comments:
: J. z7 z+ U: o4 m- |6 O//
, J/ \1 t% J+ D/ n6 e7 K  {' C1 a9 J# f//////////////////////////////////////////////////////////////////////////////////8 Y- }- q" p# ]# q6 y  B$ O

6 J% z) i( B1 Z* r! w1 {# wmodule LED(3 t8 z/ S6 G2 N1 E' n$ d7 E
           iGclk,
" _5 v" ?1 w; t$ m9 I( H           iRSTn,$ o0 L0 a2 T* N2 a/ n/ O7 u) e
           oLED
8 T5 y4 k# y8 Q! v8 Q8 k% u6 ~  J# s4 u$ B( \
    );+ G: W8 J4 Y0 \) e
   
$ L( {6 U$ {0 b' [input iGclk;   
2 z* z' p" i0 H4 T) H4 E: @8 Y2 Linput iRSTn;
/ j0 t" V0 i. E+ s& y+ B3 L- |output oLED;
6 N: I) r' G* B  o6 L* }$ ?reg oLED;
7 j' `2 e( ~; w( e' T/ preg [16:0]count;7 R& Y& J; m) f

, B/ b2 T! V/ M  E: n! H& galways @(negedge iRSTn or posedge iGclk)   
+ g( _& X% _* R! Y4 X# ?begin8 o# g! v! ^2 |4 ~
if(!iRSTn)count = 0; # T2 r+ [0 i5 _% o: E# E1 h
  else count = count + 1'b1;
8 X7 z. y5 d7 n! D5 nend' }: _- n0 I; e. ?  B' X. @
, y# s, V0 j5 x% l1 w5 E
always @(negedge iRSTn or posedge iGclk); b9 R4 d5 _, U' G  S6 z' u; P
begin
2 P, N6 _6 s% x- o6 F8 H! M if(!iRSTn)oLED <= 1'b0;* O0 [% k9 d# j  x
  else if(count == 0) oLED <= ~oLED;3 B5 m- z1 B$ @/ i9 ~. F
end% k5 `; K( v% o1 v9 H3 R+ J
    - B" D+ }. c7 H* h5 c1 x+ d
endmodule

本版积分规则

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

GMT+8, 2024-4-23 20:53 , Processed in 0.057721 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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