前言
学习说明此文档为本人的学习笔记,注重实践,关于理论部分会给出相应的学习链接。
学习视频:是根据野火FPGA视频教程——第十二讲
https://www.bilibili.com/video/BV1nQ4y1Z7zN?p=3
理论学习
基础知识请参考本人Verilog HDL专栏中行为级建模,下面是博客链接:
实战演练
由于这里实现的功能比较简单这里不进行框图绘制与波形图绘制
阻塞赋值
程序块
`timescale 1ns / 1ps
//
// Company: 追逐者——桥的小作坊
// Engineer:
//
// Create Date: 2022/04/25 09:23:40
// Design Name: 阻塞赋值与非阻塞赋值
// Module Name: blocking
// Project Name:
// Target Devices:
// Tool Versions: Vivado 2018_3
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:FPGA学习代码
//
//
module blocking(
input wire sys_clk, //系统时钟50MHz
input wire sys_rst_n,
input wire [1:0] in,
output reg [1:0] out
);
reg [1:0] in_reg;
always @(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
begin
in_reg = 2'b0;
out = 2'b0;
end
else
begin
in_reg = in;
out = in_reg;
end
endmodule
仿真程序:
module tb_blocking();
reg sys_clk, sys_rst_n;
reg [1:0] in;
wire [1:0] out;
initial begin
sys_clk = 1'b1;
sys_rst_n <= 1'b0;
in <= 2'b00;
#20;
sys_rst_n <= 1'b1;
end
always #10 sys_clk = ~sys_clk;
always #20 in <= {$random} % 4; //产生0、1、2、3四个随机数
blocking blocking_inst(
.sys_clk (sys_clk ),
.sys_rst_n (sys_rst_n),
.in (in ),
.out (out )
);
endmodule
非阻塞赋值
always @(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
begin
in_reg <= 2'b00;
out <= 2'b00;
end
else
begin
in_reg <= in;
out <= in_reg;
end
有一个时钟的延迟,在变化时,下一个时钟周期才会跟随变化。
组合逻辑电路:阻塞赋值
时序逻辑电路: 非阻塞赋值
在一个always语句中阻塞赋值与非阻塞赋值最好不要公用
锁存器使用非阻塞赋值
always语句块只对一个变量进行赋值