FPGA编程入门

一、Verilog编程入门

1.1门电路

①非门

alt
代码

下面展示一些 内联代码片

module top_module( input in, output out );
		assign	out = ~ in;
endmodule

结果
alt

②与门

alt
代码

module top_module( 
    input a, 
    input b, 
    output out );
	assign	out = a & b;
endmodule

结果
alt

③或非门

alt
代码

module top_module( 
    input a, 
    input b, 
    output out );
	assign	out =~ (a | b);
endmodule

结果
alt

1.2组合电路

①Declaring wires

alt

代码

`default_nettype none
module top_module(
    input a,
    input b,
    input c,
    input d,
    output out,
    output out_n   ); 
    wire	and_1 = a & b;
    wire	and_2 = c & d;
    wire	or_1  = and_1 | and_2;
    assign	out   = or_1;
    assign	out_n = ~or_1;
endmodule

结果
alt

②7458

alt
代码

module top_module ( 
    input p1a, p1b, p1c, p1d, p1e, p1f,
    output p1y,
    input p2a, p2b, p2c, p2d,
    output p2y );
    assign p1y = (p1a & p1b & p1c) | (p1d & p1e & p1f);
    assign p2y = (p2a & p2b) | (p2d & p2c);
endmodule

结果
alt

③Vector0

alt
代码

module top_module ( 
    input wire [2:0] vec,
    output wire [2:0] outv,
    output wire o2,
    output wire o1,
    output wire o0  ); // Module body starts after module declaration
	assign outv = vec;
	assign o0 = vec[0];
	assign o1 = vec[1];
	assign o2 = vec[2];
endmodule

结果
alt

1.3时序电路

①Dff

alt
代码

module top_module (
    input clk,    // Clocks are used in sequential circuits
    input d,
    output reg q );//

    // Use a clocked always block
    //   copy d to q at every positive edge of clk
    //   Clocked always blocks should use non-blocking assignments
    always@(posedge clk) begin
        q <= d;
    end
endmodule

结果
alt

②Dff8

代码

module top_module (
    input clk,
    input [7:0] d,
    output [7:0] q
);
    always@(posedge clk) begin
    	q <= d;
    end
endmodule

结果
alt

③Dff8r

代码

module top_module (
    input clk,
    input reset,            // Synchronous reset
    input [7:0] d,
    output [7:0] q
);
	always@(posedge clk) begin
	q <= (~{8{reset}} & d);
	end
endmodule

结果
alt

二、使用Logisim进行仿真设计

2.1完成一个1位全加器的设计并测试

2.1.1设计一个1位半加器电路

alt

2.1.2在半加器电路基础上,实现1位全加器电路

alt

三、基于Quartus进行实验并仿真

3.1输入原理图实现1位加法器

3.1.1半加器原理图输入

①绘制实现

alt
保存文件并编译,通过tool->Netlist Viewers->RTL Viewer查看电路图:
alt

②仿真实现

编辑信号
alt

③仿真结果

功能仿真结果
alt
时序仿真结果
alt
通过仿真结果,可以发现得到的结果与真值表中是相吻合的。

3.1.2全加器原理图输入

①将设计项目设置为可调用的元件

alt

②绘制过程实现

首先选择File->New,进入后选择Block Diagram/Schematic File
alt
选择元件
alt

添加输入输出,完成效果
alt
保存文件并编译,通过tool->Netlist Viewers->RTL Viewer查看电路图:
alt

③仿真实现

跟半加器同理添加信号,然后编辑信号
alt

④仿真测试结果

功能仿真结果:
alt
时序仿真结果:
alt

四、Verilog编程实现1位加法器

4.1代码实现

module full_adder(
	//输入信号,ain表示被加数,bin表示加数,cin表示低位向高位的进位
	input ain,bin,cin,
	//输出信号,cout表示向高位的进位,sum表示本位的相加和
	output reg cout,sum

);
reg s1,s2,s3;
always @(ain or bin or cin) begin
	sum=(ain^bin)^cin;//本位和输出表达式
	s1=ain&cin;
	s2=bin&cin;
	s3=ain&bin;
	cout=(s1|s2)|s3;//高位进位输出表达式
end
endmodule

保存文件并编译,通过tool->Netlist Viewers->RTL Viewer查看电路图:
alt

4.2仿真实现

同理添加信号并编辑信号
alt
功能仿真结果:
alt
时序仿真结果:
alt
通过仿真结果,可以发现得到的结果与真值表中是相吻合的。

五、四位全加器

5.1四位全加器的原理图设计

①原理图

将一位全加器设置为可调用的元件并设计出原理图:
alt

②RTL电路图如下

alt

③仿真测试

编辑信号:
alt

④仿真结果

功能仿真结果:
alt
时序仿真结果:
alt

5.2四位全加器的Verilog编程实现

①创建文件

alt

②代码实现

//数据流描述4位全加器
module four_adder1(
    	input[3:0] a,b,
    	output[3:0] s,
    	output cout,
    	input cin
);

assign{cout,s} = a+b+cin;
endmodule

③RTL电路图

alt

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Xilinx官方翻译的《FPGA并行编程》,本书以10个数字信号处理为例,带我们了解HLS如何使C代码并行运行,深入浅出的将HLS实现方法,硬件设计的考虑 以及系统优化都一一介绍。本书可以在小白仓库微信公众号号免费下载,还可以在Xilinx学术合作找到相应的下载链接。 本人还制作了该书的读书笔记,详情请见《FPGA并行编程》读书笔记专栏启动说明:https://blog.csdn.net/qq_35712169/article/details/99738006 。 本书将着重介绍高层次综合(HLS) 算法的使用并以此完成一些比较具体、细分的FPGA应用。我们的 目的是让读者认识到用HLS创造并优化硬件设计的好处。当然,FPGA的并行编程肯定是有别于在多核处理 器、GPU上实行的并行编程,但是一些最关键的概念是相似的,例如,设计者必须充分理解内存层级和带 宽、空间局部性与时间局部性、并行结构和计算与存储之间的取舍与平衡。 本书将更多的作为一个实际应用的向导,为那些对于研发FPGA系统有兴趣的读者提供帮助。对于大学教育来说,这本书将更适用于高阶的本科课程或研究生课程,同时也对应用系统设计师和嵌入式程序员有 所帮助。我们不会对C/C++方面的知识做过多的阐述,而会以提供很多的代码的方式作为示范。另外,读者 需要对基本的计算机架构有所熟悉,例如流水线(pipeline),加速,阿姆达尔定律(Amdahl's Law)。以寄存器传输级(RTL)为基础FPGA设计知识并不是必需的,但会对理解本书有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值