龙骑士 的blog

通过SPI配置高速ADC接口

接着上一篇LVDS接口ADC,这篇讲它的SPI配置。SPI的时序图如下,一个三个信号,CSB片选低有效,SCLK时钟,SDIO数据。时钟下降沿发送数据,上升沿采样。然后就是跟厂商密切相关的定义了,这个每个厂商的芯片协议字都不一样,其实就是具体的比特代表的含义。

首位比特:1代表读,0代表写;接下来两位W1:W0,代表后面传输的数据的字节数(这儿有个坑,一会儿说);然后是13位的寄存器地址;然后是发送或接收的数据。

其中W1:W0刚开始寄存器的设置理解有点问题,没有好好看AN-877技术手册,自己想当然的猜测后面一个字节的数据就应该是01,结果00,01,10,11分别对应1,2,3,4个字节。然后由于设置的数据是两个字节,每次传输完一个寄存器的配置它还在等,下一个就会把它冲掉,整个配置就完全错乱了,too young!

嵌入式系统watchdog详解

嵌入式系统的工作常会受到外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以需要对嵌入式系统运行状态进行实时监测,便产生了一种专门用于监测嵌入式系统运行状态的芯片,称"看门狗"。

Linux 自带了一个watchdog 的实现,用于监视系统的运行,包括一个内核 watchdog module 和一个用户空间的 watchdog 程序。内核 watchdog 模块通过 /dev/watchdog 这个字符设备与用户空间通信。用户空间程序一旦打开/dev/watchdog 设备,就会导致在内核中启动一个 1分钟的定时器,此后,用户空间程序需要保证在 1分钟之内向这个设备写入数据,每次写操作会导致重新设定定时器。如果用户空间程序在 1分钟之内没有写操作,定时器到期会导致一次系统 reboot 操作。

看门狗,又叫 watchdogtimer(WDT),是一个定时器电路, 一般有一个输入,叫喂狗,一个输出到MCU(微控制单元 Microcontroller Unit,俗称单片机)的RST端,MCU正常工作的时候,每隔一段时间输出一个信号到喂狗端,给 WDT 清零,如果超过规定时间不喂狗(一般在程序跑飞时),WDT 定时超过,就会给出一个复位信号到MCU,使MCU复位. 防止MCU死机.

Xilinx交叉编译链的安装及测试

需要说明的是: xilinx-arm-linux交叉编译链最后一个版本就是2011版本,之后的xilinx不再单独提供交叉编译链了,如果需要最新的,请安装SDK开发软件,之后再安装目录中查找,或者source setting.sh激活即可使用。

一、软件下载
网络上有很多人提供,我这里仅仅提供文件名,大家搜索这个文件即可
xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin

二、软件安装
将该文件拷贝到Ubuntu环境下,ll查看属性
-rwxrw-rw- 1 pp pp 148299693 5月 28 16:01 xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin*

考虑到软件的可移植性,这里使用普通用户安装
./xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin

一路Enter下来,最后输出:
Installation Complete
---------------------

Congratulations! Sourcery CodeBench Lite for Xilinx GNU/Linux has been
successfully installed to:

如何对Xilinx FPGA进行bit文件加密

项目终于搞完了,到了发布的关键节点,为了防止自己的心血被别人利用,最好对产品进行bit加密。

加密的优点
xilinx的V6和7全系列FPGA支持AES256加密,加密的好处:
1,可以防止别人回读或者对你的程序进行逆向;
2,防止更改烧写的bit文件。
如果仅仅是防止回读,可以简单设置BITSTREAM.READBACK.SECURITY,其中LEVEL1是禁止回读,LEVEL2禁止回读和重新烧写FPGA。
但如果对手的逆向能力很强,比如说在FPGA上电加载bit的时候用逻辑分析仪把用bit文件“读”出来,这个简单的设置肯定就不行了。这时候可以使用AES256加密。

AES算法简介:
AES即高级加密标准,是一种区块加密,当然也是对称加密。区块固定为128bit,秘钥为128,192或256bit。AES有5种加密模式,xliinx采用的是CBC模式。有一个128bit初始向量IV(startCBC),先利用初始向量IV与第一组数据进行异或后再进行加密运算生成C1。将C1作为初始向量与第二组数据进行异或后再进行加密运算生成C2。以此类推,当最后一组数据加密完毕后,将加密结果拼接为最终结果,C = C1C2C3……Cn。

RS232/485、UART及波特率相关

波特率描述了单片机或计算机在串口通信时的速率。如每秒钟传送960个字符,而每个字符格式包含10位(1个起始位,1个停止位,8个数据位),这时的波特率为960Bd,比特率为10位*960个/秒=9600bps。又比如每秒钟传送960个二进制位,这时的波特率为960Bd,比特率也是960bps。

波特率,可以通俗的理解为一个设备在一秒钟内发送(或接收)了多少码元的数据。它是对符号传输速率的一种度量,1波特即指每秒传输1个码元符号(通过不同的调制方式,可以在一个码元符号上负载多个bit位信息),1比特每秒是指每秒传输1比特(bit)。

解决波特率转化的途径有两种。一是用单片机,接收时设置为跟上位PC机一致的波特率进行接收。发送时再设置为跟下位系统相同的波特率发送数据;二是用FPGA,利用VHDL设计出异步串行通信电路,直接接收PC 机的数据,自行转化为另一种波特率的数据再发送出去。

从某种意义上,可以说,线路上存在的仅仅是电流,RS232/RS485规定了这些电流在什么样的线路上流动和流动的样式;在UART那里,电流才被解释和组装成数据并变成CPU可直接读写的形式。

EIA-RS-232C对电气特性、逻辑电平和各种信号线功能都作了规定。

在TxD和RxD上:

逻辑1(MARK)=-3V~-15V

逻辑0(SPACE)=+3~+15V

Xilinx加法器IP核adder

1.加法器IP核配置

2.adder_top.v代码
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 10:20:30 07/19/2017
// Design Name:
// Module Name: adder_top
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//

Xilinx FPGA设计代码风格

Xilinx FPGA设计代码风格 以后逐渐补充

1、时钟信号的分配策略
(1)、使用全局时钟可以为信号提供最短的延时和可以忽略的扭曲;
(2)、FPGA特别适合于同步电路的设计,尽可能减少使用始终信号的种类;
(3)、减少时钟摆率的一种有效方法是使用一个时钟信号生成多个时钟使能信号,分别驱动触发器的时钟使能端,也就是说让所有的触发器都在同一个使能的控制下,只有使能打开的时候,所有触发器才可以装入数据;
(4)、避免时钟信号产生毛刺,所以要采用时序逻辑,尽量避免组合逻辑。

2、使用SRL16移位寄存器,很灵活的配置

3、尽量多的使用触发器资源,比如状态编码时使用独热码。

4、信号的反相处理
(1)、如果输入信号需要反相,则要尽可能的调用输入带反相功能的符号,而不是使用分离的反相器来进行反相
(2)、如果一个信号反相后驱动了多个负载,则应该将反相这个功能分散到各个负载中去实现。因为在FPGA中集中反相然后驱动多个负载往往会多占用一个逻辑块,而且延时也增加了;分散信号的反相可以与其它逻辑在同一单元内完成而不消耗额外的逻辑资源。

2、如何提高电路工作频率

verilog 实现IIC

verilog 实现IIC协议算是一个简单的IP核,本来是挂在AXI总线上,可以通过microblaze对其进行配置。最近在弄ADV7511,用到IIC来配置它.直接上代码:
module iic_drive(
input clk,
input reset_n,

// 与控制器通信信号
input [31:0] slv_reg0,
input [31:0] slv_reg1,
input [31:0] slv_reg2,
input [31:0] slv_reg3,
input [31:0] slv_reg4,
output reg [ 7:0] iic_rddb,
output iic_busy,

// 外部信号
output iic_scl,
input iic_sda_in,
output sda_dir,
output sda_r
);

// SCL 分频系数
// 产生IIC时钟 100M/20K = 5000
parameter SCL_SUM = 13'd5000;

// 仿真时

ZYNQ-ZedBoard USB HOST问题初探

在用Vivado (2015.4.2)在ZedBoard上搭建如图所示的PS最小系统时,USB-OTG无法正常使用且在启动LOG中报错。

经过与原厂的各个启动文件进行对比替换,最后确定是Vivado工程生成的bit流出了问题。也就是说建立的工程不对。

USB 启动错误提示信息:外置PHY芯片初始化失败,载入模块失败。
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
usbcore: registered new interface driver usb-storage
usbcore: registered new interface driver usbserial
usbcore: registered new interface driver usbserial_generic
usbserial: USB Serial support registered for generic

Vivado 和 matlab 联合生成算法模块代码

FPGA的一大应用就是数字信号处理(DSP),尤其是大数据量高速处理的场合,比如雷达,成像,超声等领域。但是直接用Verilog实现DSP算法,是一件很费时费力的事情,而且改动也不是很方便。目前有几种折中的办法,一是用HLS,大概的思路就是用C/C++先编写算法,然后转译为Verilog语言;另一种就是用MATLAB等工具,直接生成Verilog代码。

步骤如下:

首先,关联MATLAB和Vivado

在【开始】菜单,找到配置工具,打开

选择MATLAB路径

注意到 R2015a 目录 即可。

打开MATLAB2015,新建一个simulink模型

同步内容