FPGA的HDL建模第一周
时间:10-02
整理:3721RD
点击:
【FPGA每周一练】FPGA的HDL建模第一练
本次电子发烧友论坛邀请@chenchu0910 ,来和大家一起练习FPGA的HDL建模。
课程简介:这一版的论坛笔记只适合入门者,因为这论坛笔记按着由浅入深编辑的,只适合做入门引子。建议初学者者先从一些权威的参考书去了解“什么是Verlilog HDL 语言”,同时在跟着我们的论坛笔记进行练习,以达到快速理解的目的。FPGA 宛一堆乐高积和Verilog HDL 是自己的手(工具) ,自己可以随心所愿的要怎么拆就怎么拆。
课程分类:
一、基础电路设计;
二、典型常用电路设计;
三、综合运用电路设计。
首先,我们练习基础电路。因为大规模设计就是由像触发器、锁存器、多路选择器、解码器、编码器、饱和/非饱和计数器、FSM等常用基本电路组成。也就是说电路设计,你写到这要的单元就可以啦。在复杂的电路也是由他们构成。所以基础电路是根本,一点要练熟基础。
本周课题:
1、设计一个全加器。
2、四选一的多路选择器。
是不是觉得很简单,一蹴而就?答案下周三更新。(您可以随时在网上搜索,但不建议将与他人讨论)
PS:每周我们将在回答的用户中由嘉宾抽取一位幸运用户进行积分奖励!
半加器文件
本菜鸟才玩FPGA,期望认识一些大牛,我用的Xilinx的不是Altera的。
第一次发这个,学了很久,但是学的很水,不知道怎么提高比较好
半加器文件
本菜鸟才玩FPGA,期望认识一些大牛,我用的Xilinx的不是Altera的。
本次电子发烧友论坛邀请@chenchu0910 ,来和大家一起练习FPGA的HDL建模。
课程简介:这一版的论坛笔记只适合入门者,因为这论坛笔记按着由浅入深编辑的,只适合做入门引子。建议初学者者先从一些权威的参考书去了解“什么是Verlilog HDL 语言”,同时在跟着我们的论坛笔记进行练习,以达到快速理解的目的。FPGA 宛一堆乐高积和Verilog HDL 是自己的手(工具) ,自己可以随心所愿的要怎么拆就怎么拆。
课程分类:
一、基础电路设计;
二、典型常用电路设计;
三、综合运用电路设计。
首先,我们练习基础电路。因为大规模设计就是由像触发器、锁存器、多路选择器、解码器、编码器、饱和/非饱和计数器、FSM等常用基本电路组成。也就是说电路设计,你写到这要的单元就可以啦。在复杂的电路也是由他们构成。所以基础电路是根本,一点要练熟基础。
本周课题:
1、设计一个全加器。
2、四选一的多路选择器。
是不是觉得很简单,一蹴而就?答案下周三更新。(您可以随时在网上搜索,但不建议将与他人讨论)
PS:每周我们将在回答的用户中由嘉宾抽取一位幸运用户进行积分奖励!
我来回答第一题:
- 1位二进制全加器:
- 先做一个底层设计:
- library ieee;
- use ieee.std_logic_1164.all;
- entity or2a is
- port(a,b:in std_logic;
- c:out std_logic):
- end;
- architecture one of or2a is
- begin
- c ain,b=>bin,co=>d,so=>e) ;
- u2 : h_adder PORT MAP (a=>e,b=>cin,co=>f,so=>sum) ;
- u3 : or2a PORT MAP (a=>d,b=>f,c=>cout) ;
- END ARCHITECTURE fa1;
- 注意元件例化,要打包底层设计
首先是半加器
- module h(
- input a,b,cin,
- output sum,out);
- assign sum=a^b^cin;
- assign out=a&b+b&cin+a&cin;
- endmodule
- 然后是顶层例化
- module ADD (a,b,cin,sum,out);
- parameter SIZE=4;
- input[SIZE:1] a,b;
- output[SIZE:1]sum;
- input cin;
- output out;
- wire [SIZE:1] temp;
- h
- add1(.a(a[1]),.b(b[1]),.cin(cin),
- .sum(sum[1]),.out(temp[1])
- ),
- add2(.a(a[2]),.b(b[2]),.cin(temp[1]),
- .sum(sum[2]),.out(temp[2])
- ),
- add3(.a(a[3]),.b(b[3]),.cin(temp[2]),
- .sum(sum[3]),.out(temp[3])
- ),
- add4(a[4],b[4],temp[3],sum[4],out);
- endmodule
有空把选择器补上
选择器
- module MUX4(
- input in0,in1,in2,in3,sel,
- output reg out);
- always @*
- begin
- case(sel)
- 0: out=in0;
- 1: out=in1;
- 2: out=in2;
- 3: out=in3;
- default : out=1'b0;
- endcase
- end
- endmodule
全加器顶层文件
- library ieee;
- use ieee.std_logic_1164.all;
- entity f_adder is
- port(ain,bin,cin:in std_logic;
- cout,sum:out std_logic);
- end f_adder;
-
- architecture fd1 of f_adder is
- component h_adder
- port(a,b:in std_logic;
- c0,s0:out std_logic);
- end component;
- component or2a
- port(a,b:in std_logic;
- c:out std_logic);
- end component;
- signal d,e,f:std_logic;
- begin
- u1:h_adder port map (a=>ain,b=>bin,c0=>d,s0=>e);
- u2:h_adder port map (a=>e,b=>cin,c0=>f,s0=>sum);
- u3:or2a port map (a=>d,b=>f,c=>cout);
- end fd1;
半加器文件
- library ieee;
- use ieee.std_logic_1164.all;
- entity h_adder is
- port(a,b:in std_logic;
- c0,s0:out std_logic);
- end h_adder;
-
- architecture fh1 of h_adder is
- begin
- s0 module full_adder(a,b,cin,sum,cout); input a,b,cin; output sum,cout; assign sum assign cout endmodule
- 四选一的多路选择器
- module mux4(a,b,c,d,in,out); input a,b,c,d; input [1:0] in; output reg out; assign out = in[1]? (in[0]?d:c) : (in[0]?b:a); endmodule
- //1 bit full adder;
- module fa1b
- (
- input wire a,
- input wire b,
- input wire cfi,
- output wire sum,
- output wire cfo
- );
- assign sum = a^b^cfi;
- assign cfo= (a&b)|(a^b&cfi);
- endmodule
- //4 mux
- module mux4
- (
- input wire [3:0]din,
- input wire [1:0]s,
- output reg dout
- );
- always @ *
- begin
- case(s)
- 0 : dout = din ;
- 1: dout = din ;
- 2 : dout = din ;
- 3: dout = din ;
- endcase
- end
- endmodule
本菜鸟才玩FPGA,期望认识一些大牛,我用的Xilinx的不是Altera的。
顶起 这个活动不错啊
- 来个VHDL的4选1选择器
- library ieee;
- use ieee.std_logic_1164.all;
- entity mux41 is
- port(s: in std_logic_vector (1 down to 0);
- a,b,c,d: in std_logic;
- y:out std_logic;)
- end entity;
- architecture one of mux41 is
- begin
- process(s)
- begin
- case s is
- when"00"=>y y y y null;
- end case;
- end process;
- end architecture one;
- //四选一选择器
- //四个输入 abcd 宽度为2的选择sl,输出out
- module mux(
- a,b,c,d,sl,out);
- input a,b,c,d;
- input[2:0] sl;
- output out;
- reg out;
- always @(*)
- begin
- case(sl)
- 2'b00: out = a;
- 2'b01: out = b;
- 2'b10: out = c;
- 2'b11: out = d;
- default: out = 1'bx;
- endcase
- end
第一次发这个,学了很久,但是学的很水,不知道怎么提高比较好
- //8位全加器
- //采用的是数据流描述,改变位宽较简单
- module add_8(
- a,b,sum,cin,cout);
- input[7:0] a,b;
- input cin;
- output[7:0] sum;
- output cout;
- assign {cout,sum} = a + b + cin;
- endmodule
有错误请各位指教一下
顶起,,,,,,,,,,,,,,,,
【FPGA每周一练】FPGA的HDL建模第一练
本次电子发烧友论坛邀请@chenchu0910 ,来和大家一起练习FPGA的HDL建模。
课程简介:这一版的论坛笔记只适合入门者,因为这论坛笔记按着由浅入深编辑的,只适合做入门引子。建议初学者者先从一些权威的参考书去了解“什么是Verlilog HDL 语言”,同时在跟着我们的论坛笔记进行练习,以达到快速理解的目的。FPGA 宛一堆乐高积和Verilog HDL 是自己的手(工具) ,自己可以随心所愿的要怎么拆就怎么拆。
课程分类:
一、基础电路设计;
二、典型常用电路设计;
三、综合运用电路设计。
首先,我们练习基础电路。因为大规模设计就是由像触发器、锁存器、多路选择器、解码器、编码器、饱和/非饱和计数器、FSM等常用基本电路组成。也就是说电路设计,你写到这要的单元就可以啦。在复杂的电路也是由他们构成。所以基础电路是根本,一点要练熟基础。
本周课题:
1、设计一个全加器。
2、四选一的多路选择器。
是不是觉得很简单,一蹴而就?答案下周三更新。(您可以随时在网上搜索,但不建议将与他人讨论)
PS:每周我们将在回答的用户中由嘉宾抽取一位幸运用户进行积分奖励!
我来回答第一题:
- 1位二进制全加器:
- 先做一个底层设计:
- library ieee;
- use ieee.std_logic_1164.all;
- entity or2a is
- port(a,b:in std_logic;
- c:out std_logic):
- end;
- architecture one of or2a is
- begin
- c ain,b=>bin,co=>d,so=>e) ;
- u2 : h_adder PORT MAP (a=>e,b=>cin,co=>f,so=>sum) ;
- u3 : or2a PORT MAP (a=>d,b=>f,c=>cout) ;
- END ARCHITECTURE fa1;
- 注意元件例化,要打包底层设计
首先是半加器
- module h(
- input a,b,cin,
- output sum,out);
- assign sum=a^b^cin;
- assign out=a&b+b&cin+a&cin;
- endmodule
- 然后是顶层例化
- module ADD (a,b,cin,sum,out);
- parameter SIZE=4;
- input[SIZE:1] a,b;
- output[SIZE:1]sum;
- input cin;
- output out;
- wire [SIZE:1] temp;
- h
- add1(.a(a[1]),.b(b[1]),.cin(cin),
- .sum(sum[1]),.out(temp[1])
- ),
- add2(.a(a[2]),.b(b[2]),.cin(temp[1]),
- .sum(sum[2]),.out(temp[2])
- ),
- add3(.a(a[3]),.b(b[3]),.cin(temp[2]),
- .sum(sum[3]),.out(temp[3])
- ),
- add4(a[4],b[4],temp[3],sum[4],out);
- endmodule
有空把选择器补上
选择器
- module MUX4(
- input in0,in1,in2,in3,sel,
- output reg out);
- always @*
- begin
- case(sel)
- 0: out=in0;
- 1: out=in1;
- 2: out=in2;
- 3: out=in3;
- default : out=1'b0;
- endcase
- end
- endmodule
全加器顶层文件
- library ieee;
- use ieee.std_logic_1164.all;
- entity f_adder is
- port(ain,bin,cin:in std_logic;
- cout,sum:out std_logic);
- end f_adder;
-
- architecture fd1 of f_adder is
- component h_adder
- port(a,b:in std_logic;
- c0,s0:out std_logic);
- end component;
- component or2a
- port(a,b:in std_logic;
- c:out std_logic);
- end component;
- signal d,e,f:std_logic;
- begin
- u1:h_adder port map (a=>ain,b=>bin,c0=>d,s0=>e);
- u2:h_adder port map (a=>e,b=>cin,c0=>f,s0=>sum);
- u3:or2a port map (a=>d,b=>f,c=>cout);
- end fd1;
半加器文件
- library ieee;
- use ieee.std_logic_1164.all;
- entity h_adder is
- port(a,b:in std_logic;
- c0,s0:out std_logic);
- end h_adder;
-
- architecture fh1 of h_adder is
- begin
- s0 module full_adder(a,b,cin,sum,cout); input a,b,cin; output sum,cout; assign sum assign cout endmodule
- 四选一的多路选择器
- module mux4(a,b,c,d,in,out); input a,b,c,d; input [1:0] in; output reg out; assign out = in[1]? (in[0]?d:c) : (in[0]?b:a); endmodule
- //1 bit full adder;
- module fa1b
- (
- input wire a,
- input wire b,
- input wire cfi,
- output wire sum,
- output wire cfo
- );
- assign sum = a^b^cfi;
- assign cfo= (a&b)|(a^b&cfi);
- endmodule
- //4 mux
- module mux4
- (
- input wire [3:0]din,
- input wire [1:0]s,
- output reg dout
- );
- always @ *
- begin
- case(s)
- 0 : dout = din ;
- 1: dout = din ;
- 2 : dout = din ;
- 3: dout = din ;
- endcase
- end
- endmodule
本菜鸟才玩FPGA,期望认识一些大牛,我用的Xilinx的不是Altera的。
顶起 这个活动不错啊