差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
实验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> | ||
- | |||
- | |||