差别
这里会显示出您选择的修订版和当前版本之间的差别。
| 两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
|
实验2-2_4位比较器 [2017/03/02 10:56] zhijun |
实验2-2_4位比较器 [2017/03/02 16:38] (当前版本) zhijun |
||
|---|---|---|---|
| 行 5: | 行 5: | ||
| ===== 1.实验目的 ===== | ===== 1.实验目的 ===== | ||
| - | (1)熟悉和掌握FPGA开发流程和Lattice Diamond软件使用方法 | + | * 熟悉和掌握FPGA开发流程和Lattice Diamond软件使用方法 |
| - | (2)通过实验理解和掌握比较器原理 | + | |
| - | (3)学习用Verilog HDL描述多位比较器级联电路 | + | * 通过实验理解和掌握比较器原理 |
| + | |||
| + | * 学习用Verilog HDL描述多位比较器级联电路 | ||
| 行 16: | 行 18: | ||
| ===== 3.实验原理 ===== | ===== 3.实验原理 ===== | ||
| - | 1位的比较器有如下性能: | + | 1位的比较器有如下性能: |
| - | (1)如果X>Y或者X=Y且Gin=1,那么输出Gout为1; | + | * 如果X>Y或者X=Y且Gin=1,那么输出Gout为1; |
| - | (2)如果X=Y且Gin=0和Lin=0,那么输出Eout为1; | + | * 如果X=Y且Gin=0和Lin=0,那么输出Eout为1; |
| - | (3)如果X<Y或者X= Y且Lin=1 ,那么输出Lout为1 。 | + | * 如果X<Y或者X= Y且Lin=1 ,那么输出Lout为1 。 |
| 1位比较器原理图与真值表如下: | 1位比较器原理图与真值表如下: | ||
| - | {{ ::bijiaoqiyuanlitu.png?300 |}} | + | {{ ::bijiaoqiyuanlitu.png?600 |}} |
| + | 写一个如下图所示的4位比较器的Verilog程序,我们可以使用1位比较器的Verilog模块,然后使用4个模块实例语句创建这个顶层模块设计。若想增加比较器的大小,需要为增加的X和y的每一位写新的模块例化语句。在Verilog always块中使用for循环语句,就可以很方便地实现任意位比较器。然而,模块实例语句不能用在always模块中,但可以用在任务(task)中。 | ||
| + | Verilog for循环语句的一般形式为 | ||
| + | // | ||
| + | {{ ::foryunju.png?200 |}} | ||
| + | // | ||
| + | 初始分配为循环变量设置初始值。当条件为真时,执行表达式,然后由语句描述的for循环实体执行。之后,增量更新,再执行一次表达式。for循环的实体一直循环执行,直到条件表达式的值为假。如果for循环的实体部分包含多条语句,那么应该放在begin和end之间。 | ||
| + | {{ ::forxunhuan.png?600 |}} | ||
| ===== 4.Verilog HDL建模描述 ===== | ===== 4.Verilog HDL建模描述 ===== | ||
| - | ==== 程序清单gates.v ==== | + | ==== 程序清单comp4.v ==== |
| <code verilog> | <code verilog> | ||
| 行 33: | 行 42: | ||
| // >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<< | // >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<< | ||
| // -------------------------------------------------------------------- | // -------------------------------------------------------------------- | ||
| - | // File name : gates.v | + | // File name : comp4.v |
| - | // Module name : gates | + | // Module name : comp4 |
| // Author : Step | // Author : Step | ||
| - | // Description : Logic gates | + | // Description : comp4 |
| // Web : www.stepfpga.com | // Web : www.stepfpga.com | ||
| // | // | ||
| 行 45: | 行 54: | ||
| // V1.0 |2015/11/11 |Initial ver | // V1.0 |2015/11/11 |Initial ver | ||
| // -------------------------------------------------------------------- | // -------------------------------------------------------------------- | ||
| - | module gates | + | module comp4 |
| - | ( | + | ( |
| - | //INPUT | + | //INPUT |
| - | a , | + | x , |
| - | b , | + | y , |
| - | //OUTPUT | + | |
| - | led , | + | //OUTPUT |
| - | empty | + | gt_led , |
| - | ); | + | eq_led , |
| - | //******************* | + | lt_led , |
| - | //DEFINE INPUT | + | empty |
| - | //******************* | + | ); |
| - | input a,b; | + | |
| + | //******************* | ||
| + | //DEFINE INPUT | ||
| + | //******************* | ||
| + | |||
| + | input [3:0] x ; //4 bit input x (switch) | ||
| + | input [3:0] y ; //4 bit input y (button) | ||
| | | ||
| - | //******************* | ||
| - | //DEFINE OUTPUT | ||
| - | //******************* | ||
| - | output [7:0] empty; | ||
| - | output [5:0] led; | ||
| | | ||
| - | wire [5:0] z; | ||
| | | ||
| - | //Combinational logic style | + | //******************* |
| - | assign z[5]=a&b; //AND | + | //DEFINE OUTPUT |
| - | assign z[4]=~(a&b); //NAND | + | //******************* |
| - | assign z[3]=a|b; //OR | + | output gt_led ; //x is bigger than y |
| - | assign z[2]=~(a|b); //NOR | + | output eq_led ; //x is equal to y |
| - | assign z[1]=a^b; //XOR | + | output lt_led ; //x is smaller than y |
| - | assign z[0]=a~^b; //XNOR | + | output empty ; |
| | | ||
| - | assign led=~z; //led is low active | + | //******************** |
| + | //OUTPUT ATTRIBUTE | ||
| + | //******************** | ||
| + | //REGS | ||
| + | reg gt_led ; | ||
| + | reg eq_led ; | ||
| + | reg lt_led ; | ||
| | | ||
| - | assign empty=8'b1111_1111; //led's defualt mode is lighted | + | //WIRE |
| + | wire [10:0] empty ; | ||
| + | |||
| + | //********************* | ||
| + | //INNER SIGNAL DECLARATION | ||
| + | //********************* | ||
| + | //REGS | ||
| + | reg [4:0] G =0 ; | ||
| + | reg [4:0] L =0 ; | ||
| + | reg [4:1] E ; | ||
| | | ||
| - | endmodule | + | //WIRES |
| + | integer i ; | ||
| - | </code> | + | |
| + | //********************* | ||
| + | //MAIN CORE | ||
| + | //********************* | ||
| + | |||
| + | always @ (*) | ||
| + | begin | ||
| + | for(i=0;i<4;i=i+1) | ||
| + | comp1(x[i],y[i],G[i],L[i],G[i+1],L[i+1],E[i+1]); | ||
| + | gt_led=~G[4]; //the led's default mode is lighted | ||
| + | eq_led=~E[4]; //the led's default mode is lighted | ||
| + | lt_led=~L[4]; //the led's default mode is lighted | ||
| + | end | ||
| + | |||
| + | |||
| + | task comp1( | ||
| + | input x , | ||
| + | input y , | ||
| + | input Gin , | ||
| + | input Lin , | ||
| + | output Gout , | ||
| + | output Lout , | ||
| + | output Eout | ||
| + | ); | ||
| + | begin | ||
| + | Gout=x&~y|x&Gin|~y&Gin; | ||
| + | Eout=~x&~y&~Gin&~Lin|x&y&~Gin&~Lin; | ||
| + | Lout=~x&y|~x&Lin|y&Lin; | ||
| + | end | ||
| + | endtask | ||
| + | |||
| + | assign empty=11'b111_1111_1111; | ||
| - | ==== 仿真程序清单gates_tb.v ==== | + | endmodule |
| - | + | ||
| - | + | ||
| - | <code verilog> | + | |
| - | //******************************************************** | + | |
| - | // | + | |
| - | // Copyright(c)2016, STEP FPGA | + | |
| - | // All rights reserved | + | |
| - | // | + | |
| - | // File name : gates_tb.v | + | |
| - | // Module name : gates_tb | + | |
| - | + | ||
| - | // Author : STEP | + | |
| - | // Email : info@stepfpga.com | + | |
| - | // Data : 2016/08/19 | + | |
| - | + | ||
| - | // Version : V1.0 | + | |
| - | // Description : testbench module | + | |
| - | // | + | |
| - | // Modification history | + | |
| - | // ---------------------------------------------------------------------------- | + | |
| - | // Version Data(2016/08/19) V1.0 | + | |
| - | // Description | + | |
| - | // | + | |
| - | //******************************************************** | + | |
| - | // | + | |
| - | // | + | |
| - | //******************* | + | |
| - | //DEFINE MODULE PORT | + | |
| - | //******************* | + | |
| - | `timescale 1ns/100ps | + | |
| - | module gates_tb; | + | |
| - | + | ||
| - | reg a,b; | + | |
| - | wire [5:0] led; | + | |
| - | initial | + | |
| - | begin | + | |
| - | a=0; | + | |
| - | b=0; | + | |
| - | #50; | + | |
| - | a=0; | + | |
| - | b=1; | + | |
| - | #50; | + | |
| - | a=1; | + | |
| - | b=0; | + | |
| - | #50; | + | |
| - | a=1; | + | |
| - | b=1; | + | |
| - | #50; | + | |
| - | end | + | |
| - | gates gates_tb_uut( | + | |
| - | .a (a), | + | |
| - | .b (b), | + | |
| - | .led (led), | + | |
| - | .empty () | + | |
| - | ); | + | |
| - | endmodule | + | |
| </code> | </code> | ||
| - | |||
| - | |||