FPGA示例与典型模块
文章平均质量分 61
2
luoai_2666
这个作者很懒,什么都没留下…
展开
-
V/SV 时延控制
例1. (AMD) 打印结果是什么?module tb();int int_a,int_b;initial begin fork begin #2; int_a=1; int_b=2; end #3; int_a=4; join#1;int_b=3;$display("%d", int_a+int_b);#100 $stop;endendmodule4如果改成initial begin fork ... begin #3;原创 2021-10-06 10:55:33 · 741 阅读 · 0 评论 -
Verilog 选取三个输入数据中的中间值
原创 2021-09-19 16:58:29 · 2636 阅读 · 0 评论 -
用D触发器实现时钟分频
核心思路:用D触发器构成移位寄存器,输出循环序列2倍分频最简单,只用生成01的循环脉冲always @ (posedge clk or posedge rst)beginif (rst)O_clk <= 0;elseO_clk <= ~O_clk;end9倍分频输出000001111循环脉冲,实现占空比非50%的9分频。如果要求占空比为50%的9分频电路,就用下降沿的D触发器打一拍,将两个信号相或后输出即可。...原创 2021-08-23 20:13:07 · 4246 阅读 · 2 评论 -
基于Verilog的CRC算法实现
模2加减法模2除法需要用到模2加减法,关于模2加减法,其实就是异或操作,规则如下://不需要考虑进位和借位0 ± 0 = 01 ± 1 = 00 ± 1 = 11 ± 0 = 1例: 1101 ± 1001 = 0100计算如下: 1 1 0 1 ± 1 0 0 1 ----------- 0 1 0 0模2除法:同样不需要考虑进位和借位规则:假设被除数X,和除数P,余数RX除以P**(对X和P做模2加减法,即按位异或)**所得余数R去除首位**(即左移原创 2021-07-16 13:49:10 · 4273 阅读 · 2 评论 -
基于FPGA的奇偶校验
含义奇校验:就是确保发送的数据中1的个数为奇数。因此如果数据位中1的个数是偶数,那就给校验位赋值1,如果数据位中1的个数是奇数,那就给校验位赋值0.实现思路需要统计数据位1的个数。how?可用A、B、……、N求和结果的最低位是1or0来表示有奇数or偶数个1,奇数or偶数个1异或的结果为1or0因此,其中,^data_in是缩位运算符 ^对一个操作数data_in进行运算,先对data_in[0]和data_in[1]运算,得到的结果再与data_in[2]运算…最后产生一位的逻辑值。即当原创 2021-06-30 19:51:05 · 2291 阅读 · 0 评论 -
基于FPGA的数码管驱动
译码器:将输入的二进制代码翻译成实际信号,比如存储器的地址,数码管的引脚。数码管:所有 8 个发光二极管的正极或负极有一个公共端,通常必须接 GND(共阴极数码管)或者接 VCC(共阳极数码管)。如果我们使用的是共阴极的数码管,那么就要将其公共端接地(或者接低电平 0),这便是数码管的片选信号。如果 FPGA 的这个 I/O 脚输出低电平 0,那么这个数码管就能够显示数字; 如果这个 I/O 输出高电平 1,那么无论数码管的 8 个段选端输出 0 还是 1,都无法将 8 个发光二极管的任意一个点亮。目原创 2021-06-14 21:27:45 · 1055 阅读 · 0 评论 -
基于FPGA的流水灯
output [3:0] led;//LED 1--灭,0--亮/----------------------------------- reg[23:0] cnt;always@(posedge clk or negedge rst_n)beginif (!rst n) cnt <= 24'dO; else cnt <= cnt+1'b1;end//加一条件=1,结束条件也不需要,自然溢出其他信号:ledreq[3:0] led_r;always@(posedge cl.原创 2021-06-12 21:33:09 · 234 阅读 · 0 评论 -
Quartus Reed-Solomon IP核的使用
为了调用ip核,需要根据时序图写握手程序。原创 2021-06-11 10:43:29 · 1111 阅读 · 6 评论 -
基于FPGA的按键消抖
现象抖动时间10ms,时钟周期20ns,可以认为clk是连续不断的来。后果是led_r在0,1之间快速变化,人眼看到的是LED比较暗。方案1用移位寄存器实现,采样到的数据流送到3位的移位寄存器中,当寄存器为000或111时,说明按键已稳定。 module key_debounce(input clk,rst_n,input key,output led); reg [2:0] key_r; always@(posedge clk or negedge rst_n) begin原创 2021-06-02 21:30:09 · 1348 阅读 · 1 评论 -
基于FPGA的序列信号发生器与检测器
always@ (posedge clk or negedge rst_n) begin if(!rst_n) begin q <= 0; seq <= 6'b11100_1; end else begin seq <= {seq[4:0],seq[5]}; q <= seq[5]; end end原创 2021-05-31 23:04:13 · 1501 阅读 · 0 评论 -
Quartus FIFO IP核的使用
参数设置配置位宽,深度和单时钟(SCFIFO)/双时钟(DCFIFO).信号选择full:FIFO 满的标记信号,为高电平时表示 FIFO 已满,不能再进行写操作。empty:FIFO 空的标记信号,为高电平时表示 FIFO 已空,不能在进行读操作。usedw[](number of words in the FIFO):显示存储在 FIFO 中数据个数的信号,Note: (可以使用最高位作为 FIFO 的半满指示信号。) zalmost full:接近满信号,当 usedw 信号的值.原创 2021-05-24 21:54:30 · 2421 阅读 · 1 评论 -
FIFO
工作模式我们通常需要异步FIFO用作两个不同时钟域的模块之间的数据缓冲,确保不会丢失数据,只有在读速率快,写速率慢的时候,需要使用FIFO才能缓存来不及读取的数据。反之??通常因为读速率慢于写速率,慢的模块来不及读取的数据要被缓存下来,所以说,FIFO的工作模式应该是,数据突发写入的形式,Bursts。也就是隔一段时间突发的写一组数据。如果连续写入的话,因为读速率慢于写速率,FIFO肯定会写满,FIFO的深度就需要无穷大,才能确保数据不丢失。与明德扬说的不同,稍后再总结...原创 2021-05-16 21:53:17 · 385 阅读 · 0 评论 -
基于FPGA的移位寄存器
每来一个clk上升沿,触发器的状态就右移1位。Verilog实现串进并出,向高位移(左移,先进来的在高位) clk din dout 1 1 0001 2 2 0012 3 3 0123 4 4 1234 分析:每次din都给dout的最后一位;每次将...原创 2021-05-15 19:07:45 · 4305 阅读 · 0 评论 -
基于FPGA的并行PRBS实现方法
为什么要并行简单来说,串行PRBS的产生在高速时极不可靠。因为构成寄存器的触发器运行速度在串行时必须与传输速度一致,其运算速度的提高完全依靠于时钟的速度。当信号速率高达上GHz时,每比特的宽度要小于1 ns。而已商品化的高速GaAs器件在2GHz的触发时钟到输出的延时仍有0.7ns,普通的高速器件延时更大。电路中连接器件的印制线路也会产生传输延时,若传输延时超过时钟周期,触发器就会产生误触发。采用并行方式,以字节的方式产生伪随机码,即每个时钟脉冲输出并行8位数据信号,形成8路低速伪随机序列。可以将工原创 2021-05-11 10:49:26 · 5303 阅读 · 0 评论 -
Quartus ROM IP核的使用
ROM简介ROM中的数据需要先进行初始化,就是说,要先将数据写入到 ROM 内部的存储单元中;然后系统正常工作时,只能读出其中存储的数据。而不能写入信息。在 FPGA 中,ROM 常用于存放系统程序、数据表、字符代码等不易变化的数据。IP核的配置思想与Vivado ROM IP核的配置一样。主要有:How wide should the ‘q’ output bus be?:用于指定输出端口的位宽,默认值为 8;z How many 8-bit words of memory?:用于指定存储器原创 2021-05-10 16:26:06 · 5835 阅读 · 2 评论 -
基于FPGA的边沿检测
一、定义边沿检测,即信号上升沿或者下降沿的检测。在检测到所需要的边沿后产生一个高电平的脉冲。使用高频的时钟对信号进行采样,时钟频率至少要在信号最高频率的2倍以上。二、原理 data_i tri_1 pos_edge neg_edge 1 0 1 0 0 0 0 0 0 1 0 1 1原创 2021-05-08 20:06:44 · 650 阅读 · 0 评论 -
Vivado ROM IP核的使用
配置IP核选择IP核:Block Memory Generatorbasic 选择Single Port ROM设置ROM的宽度和深度要与初始化.coe文件一致4.Load Init File初始化文件.coe使用matlab生成.coe文件n = 8;%量化位数f = 5e4; %信号频率Hzfs = 25600000; %采样频率HzN = 10; %本次共采样点数t = (0:N-1)/fs; %采样时间sx = sin(2*pi*f*t); %信号采原创 2021-05-08 13:59:55 · 2870 阅读 · 1 评论 -
基于FPGA的AD7928驱动
计数器模块原创 2021-04-29 19:17:59 · 3579 阅读 · 1 评论 -
基于FPGA的计数器
组合逻辑和时序逻辑分开1. 代码module TimeCount( CLK_50M,RST_N, time_cnt);//-- 外部端口声明input CLK_50M,RST_N;output reg [19:0] time_cnt;//-- 内部端口声明reg [19:0] time_cnt_n; //time_cnt 的下一个状态//设置定时器的时间为20ms,计算方法为 (20*10^3)us / (1/50)us 50MHz为开发板晶振parameter SE原创 2021-04-14 22:00:11 · 2178 阅读 · 0 评论 -
Quartus ALTPLL IP核的使用
开发环境:Quartus 14.0在Tools- IP Catalog中搜索创建,在项目导航区-IP Components查看编辑。原创 2021-04-18 10:23:36 · 4966 阅读 · 1 评论 -
Testbench编写方法
module名称与配置testbench时保持一致`timescale 1 ps/ 1 psmodule Verilog_Ip_PLL_vlg_tst();变量类型输入端口可以由net/register驱动,输出端口只能驱动netreg CLK_50M, RST_N; wire LED1, LED2;源程序例化Verilog_Ip_PLL i1 ( .CLK_50M(CLK_50M), ..原创 2021-04-18 22:33:36 · 3648 阅读 · 0 评论 -
FPGA 三段式状态机
示例:module FSM1( i,clk,rst_n, q);input i;input clk,rst_n;output reg q;reg [5:0] cstate;reg [5:0] nstate;parameter s0 = 6'b000001;parameter s1 = 6'b000010;parameter s2 = 6'b000100;parameter s3 = 6'b001000;parameter s4 = 6'b010000;parameter原创 2021-04-16 20:49:51 · 2284 阅读 · 0 评论