微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > FPGA的HDL建模第一周

FPGA的HDL建模第一周

时间:10-02 整理:3721RD 点击:
【FPGA每周一练】FPGA的HDL建模第一练
本次电子发烧友论坛邀请@chenchu0910 ,来和大家一起练习FPGA的HDL建模。
课程简介:这一版的论坛笔记只适合入门者,因为这论坛笔记按着由浅入深编辑的,只适合做入门引子。建议初学者者先从一些权威的参考书去了解“什么是Verlilog HDL 语言”,同时在跟着我们的论坛笔记进行练习,以达到快速理解的目的。FPGA 宛一堆乐高积和Verilog HDL 是自己的手(工具) ,自己可以随心所愿的要怎么拆就怎么拆。
课程分类:
一、基础电路设计;
二、典型常用电路设计;
三、综合运用电路设计。
首先,我们练习基础电路。因为大规模设计就是由像触发器、锁存器、多路选择器、解码器、编码器、饱和/非饱和计数器、FSM等常用基本电路组成。也就是说电路设计,你写到这要的单元就可以啦。在复杂的电路也是由他们构成。所以基础电路是根本,一点要练熟基础。
本周课题:
1、设计一个全加器。
2、四选一的多路选择器
是不是觉得很简单,一蹴而就?答案下周三更新。(您可以随时在网上搜索,但不建议将与他人讨论)
PS:每周我们将在回答的用户中由嘉宾抽取一位幸运用户进行积分奖励!



我来回答第一题:

  1. 1位二进制全加器:
  2. 先做一个底层设计:
  3. library ieee;
  4. use ieee.std_logic_1164.all;
  5. entity or2a is
  6. port(a,b:in std_logic;
  7. c:out std_logic):
  8. end;
  9. architecture one of or2a is
  10. begin
  11. c ain,b=>bin,co=>d,so=>e) ;
  12.   u2 : h_adder PORT MAP (a=>e,b=>cin,co=>f,so=>sum) ;
  13.   u3 : or2a    PORT MAP (a=>d,b=>f,c=>cout) ;
  14. END ARCHITECTURE fa1;
  15. 注意元件例化,要打包底层设计

复制代码

首先是半加器

  1. module h(
  2. input a,b,cin,
  3. output sum,out);
  4. assign sum=a^b^cin;
  5. assign out=a&b+b&cin+a&cin;
  6. endmodule
  7. 然后是顶层例化
  8. module ADD (a,b,cin,sum,out);
  9. parameter SIZE=4;
  10. input[SIZE:1] a,b;
  11. output[SIZE:1]sum;
  12. input cin;
  13. output out;
  14. wire [SIZE:1] temp;
  15. h
  16.     add1(.a(a[1]),.b(b[1]),.cin(cin),
  17.          .sum(sum[1]),.out(temp[1])
  18.              ),
  19.          add2(.a(a[2]),.b(b[2]),.cin(temp[1]),
  20.          .sum(sum[2]),.out(temp[2])
  21.                         ),
  22.          add3(.a(a[3]),.b(b[3]),.cin(temp[2]),
  23.          .sum(sum[3]),.out(temp[3])
  24.          ),
  25.          add4(a[4],b[4],temp[3],sum[4],out);               
  26. endmodule

复制代码


有空把选择器补上

选择器

  1. module MUX4(
  2. input in0,in1,in2,in3,sel,
  3. output reg out);

  4. always @*
  5.   begin
  6.      case(sel)
  7.             0: out=in0;
  8.                  1: out=in1;
  9.                  2: out=in2;
  10.                  3: out=in3;
  11.                  default : out=1'b0;
  12.                 endcase       
  13.   end
  14. endmodule

复制代码



全加器顶层文件

  1. library ieee;
  2. use ieee.std_logic_1164.all;

  3. entity f_adder is
  4.   port(ain,bin,cin:in std_logic;
  5.           cout,sum:out std_logic);
  6. end f_adder;

  7. architecture fd1 of f_adder is
  8.   component h_adder
  9.     port(a,b:in std_logic;
  10.         c0,s0:out std_logic);
  11.   end component;
  12.   component or2a
  13.     port(a,b:in std_logic;
  14.            c:out std_logic);
  15.   end component;
  16. signal d,e,f:std_logic;
  17.   begin
  18.    u1:h_adder port map (a=>ain,b=>bin,c0=>d,s0=>e);
  19.    u2:h_adder port map (a=>e,b=>cin,c0=>f,s0=>sum);
  20.    u3:or2a   port map (a=>d,b=>f,c=>cout);
  21. end fd1;

复制代码


半加器文件

  1. library ieee;
  2. use ieee.std_logic_1164.all;

  3. entity h_adder is
  4. port(a,b:in std_logic;
  5.      c0,s0:out std_logic);
  6. end h_adder;

  7. architecture fh1 of h_adder is
  8.   begin
  9.     s0 module full_adder(a,b,cin,sum,cout); input a,b,cin; output sum,cout; assign sum assign cout endmodule

复制代码





    1.     四选一的多路选择器
    2. 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. //1 bit full adder;
    2. module fa1b
    3. (
    4. input wire a,
    5. input wire b,
    6. input wire cfi,
    7. output wire sum,
    8. output wire cfo
    9. );

    10. assign sum = a^b^cfi;
    11. assign cfo= (a&b)|(a^b&cfi);

    12. endmodule

    13. //4 mux
    14. module mux4
    15. (
    16. input wire [3:0]din,
    17. input wire [1:0]s,
    18. output reg dout
    19. );

    20. always @ *
    21. begin
    22.     case(s)
    23.     0 : dout = din ;
    24.     1: dout = din ;
    25.     2 : dout = din ;
    26.     3: dout = din ;
    27.     endcase
    28. end
    29. endmodule

    复制代码




    本菜鸟才玩FPGA,期望认识一些大牛,我用的Xilinx的不是Altera的。

    顶起 这个活动不错啊


    1. 来个VHDL的4选1选择器

    复制代码

    1. library ieee;
    2. use ieee.std_logic_1164.all;
    3. entity mux41 is
    4. port(s: in std_logic_vector (1 down to 0);
    5.      a,b,c,d: in std_logic;
    6.      y:out std_logic;)
    7. end entity;
    8. architecture one of mux41 is
    9. begin
    10. process(s)
    11. begin
    12. case s is
    13. when"00"=>y y y y null;
    14. end case;
    15. end process;
    16. end architecture one;

    复制代码


    1. //四选一选择器
    2. //四个输入 abcd 宽度为2的选择sl,输出out
    3. module mux(
    4. a,b,c,d,sl,out);

    5. input a,b,c,d;
    6. input[2:0] sl;
    7. output out;
    8. reg out;

    9. always @(*)
    10. begin
    11.   case(sl)
    12.      2'b00: out = a;
    13.          2'b01: out = b;
    14.          2'b10: out = c;
    15.          2'b11: out = d;
    16.   default: out = 1'bx;
    17.   endcase
    18. end

    复制代码


    第一次发这个,学了很久,但是学的很水,不知道怎么提高比较好

    1. //8位全加器
    2. //采用的是数据流描述,改变位宽较简单
    3. module add_8(
    4. a,b,sum,cin,cout);

    5. input[7:0] a,b;
    6. input cin;
    7. output[7:0] sum;
    8. output cout;

    9. assign {cout,sum} = a + b + cin;
    10. endmodule

    复制代码


    有错误请各位指教一下

    顶起,,,,,,,,,,,,,,,,

    【FPGA每周一练】FPGA的HDL建模第一练
    本次电子发烧友论坛邀请@chenchu0910 ,来和大家一起练习FPGA的HDL建模。
    课程简介:这一版的论坛笔记只适合入门者,因为这论坛笔记按着由浅入深编辑的,只适合做入门引子。建议初学者者先从一些权威的参考书去了解“什么是Verlilog HDL 语言”,同时在跟着我们的论坛笔记进行练习,以达到快速理解的目的。FPGA 宛一堆乐高积和Verilog HDL 是自己的手(工具) ,自己可以随心所愿的要怎么拆就怎么拆。
    课程分类:
    一、基础电路设计;
    二、典型常用电路设计;
    三、综合运用电路设计。
    首先,我们练习基础电路。因为大规模设计就是由像触发器、锁存器、多路选择器、解码器、编码器、饱和/非饱和计数器、FSM等常用基本电路组成。也就是说电路设计,你写到这要的单元就可以啦。在复杂的电路也是由他们构成。所以基础电路是根本,一点要练熟基础。
    本周课题:
    1、设计一个全加器。
    2、四选一的多路选择器
    是不是觉得很简单,一蹴而就?答案下周三更新。(您可以随时在网上搜索,但不建议将与他人讨论)
    PS:每周我们将在回答的用户中由嘉宾抽取一位幸运用户进行积分奖励!



    我来回答第一题:

    1. 1位二进制全加器:
    2. 先做一个底层设计:
    3. library ieee;
    4. use ieee.std_logic_1164.all;
    5. entity or2a is
    6. port(a,b:in std_logic;
    7. c:out std_logic):
    8. end;
    9. architecture one of or2a is
    10. begin
    11. c ain,b=>bin,co=>d,so=>e) ;
    12.   u2 : h_adder PORT MAP (a=>e,b=>cin,co=>f,so=>sum) ;
    13.   u3 : or2a    PORT MAP (a=>d,b=>f,c=>cout) ;
    14. END ARCHITECTURE fa1;
    15. 注意元件例化,要打包底层设计

    复制代码

    首先是半加器

    1. module h(
    2. input a,b,cin,
    3. output sum,out);
    4. assign sum=a^b^cin;
    5. assign out=a&b+b&cin+a&cin;
    6. endmodule
    7. 然后是顶层例化
    8. module ADD (a,b,cin,sum,out);
    9. parameter SIZE=4;
    10. input[SIZE:1] a,b;
    11. output[SIZE:1]sum;
    12. input cin;
    13. output out;
    14. wire [SIZE:1] temp;
    15. h
    16.     add1(.a(a[1]),.b(b[1]),.cin(cin),
    17.          .sum(sum[1]),.out(temp[1])
    18.              ),
    19.          add2(.a(a[2]),.b(b[2]),.cin(temp[1]),
    20.          .sum(sum[2]),.out(temp[2])
    21.                         ),
    22.          add3(.a(a[3]),.b(b[3]),.cin(temp[2]),
    23.          .sum(sum[3]),.out(temp[3])
    24.          ),
    25.          add4(a[4],b[4],temp[3],sum[4],out);               
    26. endmodule

    复制代码


    有空把选择器补上

    选择器

    1. module MUX4(
    2. input in0,in1,in2,in3,sel,
    3. output reg out);

    4. always @*
    5.   begin
    6.      case(sel)
    7.             0: out=in0;
    8.                  1: out=in1;
    9.                  2: out=in2;
    10.                  3: out=in3;
    11.                  default : out=1'b0;
    12.                 endcase       
    13.   end
    14. endmodule

    复制代码



    全加器顶层文件

    1. library ieee;
    2. use ieee.std_logic_1164.all;

    3. entity f_adder is
    4.   port(ain,bin,cin:in std_logic;
    5.           cout,sum:out std_logic);
    6. end f_adder;

    7. architecture fd1 of f_adder is
    8.   component h_adder
    9.     port(a,b:in std_logic;
    10.         c0,s0:out std_logic);
    11.   end component;
    12.   component or2a
    13.     port(a,b:in std_logic;
    14.            c:out std_logic);
    15.   end component;
    16. signal d,e,f:std_logic;
    17.   begin
    18.    u1:h_adder port map (a=>ain,b=>bin,c0=>d,s0=>e);
    19.    u2:h_adder port map (a=>e,b=>cin,c0=>f,s0=>sum);
    20.    u3:or2a   port map (a=>d,b=>f,c=>cout);
    21. end fd1;

    复制代码


    半加器文件

    1. library ieee;
    2. use ieee.std_logic_1164.all;

    3. entity h_adder is
    4. port(a,b:in std_logic;
    5.      c0,s0:out std_logic);
    6. end h_adder;

    7. architecture fh1 of h_adder is
    8.   begin
    9.     s0 module full_adder(a,b,cin,sum,cout); input a,b,cin; output sum,cout; assign sum assign cout endmodule

    复制代码





    1.     四选一的多路选择器
    2. 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. //1 bit full adder;
    2. module fa1b
    3. (
    4. input wire a,
    5. input wire b,
    6. input wire cfi,
    7. output wire sum,
    8. output wire cfo
    9. );

    10. assign sum = a^b^cfi;
    11. assign cfo= (a&b)|(a^b&cfi);

    12. endmodule

    13. //4 mux
    14. module mux4
    15. (
    16. input wire [3:0]din,
    17. input wire [1:0]s,
    18. output reg dout
    19. );

    20. always @ *
    21. begin
    22.     case(s)
    23.     0 : dout = din ;
    24.     1: dout = din ;
    25.     2 : dout = din ;
    26.     3: dout = din ;
    27.     endcase
    28. end
    29. endmodule

    复制代码




    本菜鸟才玩FPGA,期望认识一些大牛,我用的Xilinx的不是Altera的。

    顶起 这个活动不错啊

  • Copyright © 2017-2020 微波EDA网 版权所有

    网站地图

    Top