当前位置:   article > 正文

Verilog实验总结_verilog实验报告心得体会

verilog实验报告心得体会

一.组合电路设计

(1)数字加法器

a. 利用连续赋值语句实现

  1. module add(a,b,sum,c_in,c_out);
  2. output sum,c_out;
  3. input a,b,c_in;
  4. assign sum=(a^b)^c_in;
  5. assign c_out=(a&b)|((a^b)&c_in);
  6. endmodule

b.利用行为描述方式实现

  1. module add(sum,a,b,c_in,c_out);
  2. output c_out,sum;
  3. input c_in,a,b;
  4. assign {c_out,sum}=a+b+c_in;
  5. endmodule

 

c.2输入8 bit加法器(行为描述方式)

  1. module add(sum,a,b,c_in,c_out);
  2. output c_out;
  3. output [7:0]sum;
  4. input [7:0]a,b;
  5. input c_in;
  6. assign {c_out,sum}=a+b+c_in;
  7. endmodule

(2)数据比较器

例1:4位数据比较器

  1. module comp(a,b,c,out);
  2. input [3:0]a,b;
  3. input c;
  4. output [2:0]out;
  5. reg [2:0]out;
  6. always@ (a or b or c)
  7. if(a>b)
  8. out=3'b100;
  9. else if(a<b)
  10. out=3'b001;
  11. else
  12. out=c;
  13. endmodule

(3).数据选择器

例1: 81数据选择器。

  1. module select_8to1(sel,out,data_in);
  2. input[7:0]data_in;
  3. output out;
  4. input[2:0]sel;
  5. reg out;
  6. always@(*)
  7. case(sel)
  8. 3'b000:out=data_in[0];
  9. 3'b001:out=data_in[1];
  10. 3'b010:out=data_in[2];
  11. 3'b011:out=data_in[3];
  12. 3'b100:out=data_in[4];
  13. 3'b101:out=data_in[5];
  14. 3'b110:out=data_in[6];
  15. 3'b111:out=data_in[7];
  16. default:out=1'bx;
  17. endcase
  18. endmodule

(4).  数字编码器

(有几个输入值,输入就为几位)

例1:二进制转化十进制8421BCD编码器,将十进制数012345678910个信号编成二进制代码的电路叫做二进制转化十进制编码器。 

  1. module BCD8421(din,dout);
  2. input [9:0]din;
  3. output [3:0]dout;
  4. reg [3:0] dout;
  5. always@(din)
  6. case(din)
  7. 10'b0000000001:dout=4'b0000;
  8. 10'b0000000010:dout=4'b0001;
  9. 10'b0000000100:dout=4'b0010;
  10. 10'b0000001000:dout=4'b0011;
  11. 10'b0000010000:dout=4'b0100;
  12. 10'b0000100000:dout=4'b0101;
  13. 10'b0001000000:dout=4'b0110;
  14. 10'b0010000000:dout=4'b0111;
  15. 10'b0100000000:dout=4'b1000;
  16. 10'b1000000000:dout=4'b1001;
  17. default:dout=4'bx;
  18. endcase
  19. endmodule

(5).数字译码器

译码是编码的逆过程;

输出有几种可能,输出就为几位;

例1:2线—4线译码器

  1. module _2to4(e,din,dout);
  2. input e;//使能,低电平有效
  3. input [1:0] din;
  4. output [3:0]dout;
  5. reg [3:0]dout;
  6. always@(din or e)
  7. case({din,e})
  8. 3'b??1:dout=4'b1111;
  9. 3'b000:dout=4'b1110;//0
  10. 3'b010:dout=4'b1101;//1
  11. 3'b100:dout=4'b1011;//2
  12. 3'b110:dout=4'b0111;//3
  13. default:dout=4'bx;
  14. endcase
  15. endmodule

(6)奇偶校验器

  1. module checker(fod,fev,a);
  2. input[7:0]a;
  3. output fod,fev; //fod为奇校验
  4. assign fod=^a;
  5. assign fev=~fod;
  6. endmodule

 

二.时序电路设计

(1)触发器

例1:实现同步清0、置数和异步清0、置数共同在一个触发器上的复杂D触发器。

代码:

  1. module dff(din,clk,clr,clr1,dout);
  2. output dout;
  3. input din,clk,clr,clr1;
  4. reg dout;
  5. //同步
  6. always @(posedge clk)
  7. begin
  8. if(clr==0)
  9. dout<=0;
  10. else dout<=din;
  11. end
  12. always@(posedge clk or clr1)
  13. //begin
  14. if(!clr1)
  15. dout<=0;
  16. else dout<=din;
  17. //end
  18. endmodule

测试代码:

  1. module dff_tb;
  2. wire dout;
  3. reg din,clk,clr,clr1;
  4. dff uua(din,clk,clr,clr1,dout);
  5. always #10 clk=~clk;
  6. always #20 din=~din;
  7. initial
  8. begin
  9. clk=1;
  10. din=0;
  11. clr=0;
  12. clr1=0;
  13. #20 clr=1;
  14. #40 clr1=1;
  15. end
  16. endmodule

注意:

当clr,与clr1任何一个为零时,输出都为零

输出波形:

 

(2)计数器

例2:采用反馈清零法设计的十一进制计数器

  1. module comp_11(clk,clr,dout);
  2. output [3:0]dout;
  3. input clk,clr;
  4. reg [3:0]dout;
  5. always @(posedge clk)
  6. if(clr)
  7. dout<=4'b0000;
  8. else if(dout==4'b1010)
  9. dout<=4'b0000;
  10. else dout<=dout+1;
  11. endmodule

 

(3)移位寄存器

例3:N位环型寄存器由N个移位寄存器组成,它可以实现环型移位。

  1. module shift(clr,clk,dout);
  2. parameter width=4,data=4'b0000;
  3. output[width-1:0] dout;
  4. input clr,clk;
  5. reg [width-1:0] dout;
  6. always@(posedge clk)
  7. if(!clr)
  8. dout<=data;
  9. else
  10. dout<={dout[width-2:0],dout[width-1]};
  11. endmodule

 

三.有限同步状态机

(1)基础概念

a.摩尔型:输出仅与当前状态有关(看C2模块)

b.米利型:与当前状态和输入共同决定

c.三段式

d.两段式

(2)Verilog HDL设计一个“111”序列检测器,当输入三个或三个以上的“1”时,电路输出为1,否则为0

a.摩尔型

第一步:先画出状态转移图(摩尔:四种状态)

 

三段式代码:

  1. module moore(din,clk,clr,dout);
  2. input din,clr,clk;
  3. output dout;
  4. reg dout;
  5. parameter s0=2'b00,s1=2'b01,s2=2'b11,s3=2'b10;
  6. reg [1:0]present_state,next_state;
  7. //状态寄存器
  8. always@(posedge clk or posedge clr)
  9. begin
  10. if(clr==1)
  11. present_state<=s0;//此处为当前状态输出
  12. else
  13. present_state<=next_state;
  14. end
  15. //C1模块,为组合逻辑用=
  16. always@(*)
  17. begin
  18. case(present_state)
  19. s0:if(din==0) next_state=s0;
  20. else next_state=s1;
  21. s1:if(din==0) next_state=s0;
  22. else next_state=s2;
  23. s2:if(din==0) next_state=s0;
  24. else next_state=s3;
  25. s3:if(din==0) next_state=s0;
  26. else next_state=s3;
  27. default:next_state=s0;
  28. endcase
  29. end
  30. //C2模块
  31. always@(*)
  32. begin
  33. if(present_state==s3)
  34. dout=1;
  35. else dout=0;
  36. end
  37. endmodule

测试代码:
 

  1. module moore_tb;
  2. reg din,clr,clk;
  3. wire dout;
  4. moore uua(din,clk,clr,dout);
  5. always #10 clk=~clk;
  6. initial
  7. begin
  8. clr=0;
  9. clk=0;din=1;
  10. #20 din=0;
  11. #20 din=1;
  12. #40 din=1;
  13. #10 din=0;
  14. #20 din=1;
  15. #10 din=1;
  16. #20 din=1;
  17. end
  18. endmodule

运行结果: 

 

b.米利型

状态转移图:

二段式代码:

  1. module mealy_(din,dout,clk,clr);
  2. input clk,clr,din;
  3. output dout;
  4. reg [1:0]present_state,next_state;
  5. reg dout;
  6. parameter s0=2'b00,s1=2'b01,s2=2'b11;
  7. //状态寄存器
  8. always@(posedge clk or posedge clr)
  9. begin
  10. if(clr==1)
  11. present_state<=s0;
  12. else
  13. present_state<=next_state;
  14. end
  15. always@(*)
  16. begin
  17. case(present_state)
  18. s0:if(din==1) begin next_state=s1;dout=0;end
  19. else begin next_state=s0;dout=0;end
  20. s1:if(din==1)begin next_state=s2;dout=0;end
  21. else begin next_state=s0;dout=0;end
  22. s2:if(din==1)begin next_state=s2;dout=1;end
  23. else begin next_state=s0;dout=0;end
  24. default next_state=s0;
  25. endcase
  26. end
  27. endmodule

测试代码:

  1. module mealy__tb;
  2. reg clk,clr,din;
  3. wire dout;
  4. mealy_ uut(din,dout,clk,clr);
  5. always #10 clk=~clk;
  6. initial
  7. begin
  8. clk=0;clr=0;din=0;
  9. #10 din=1;
  10. #20 din=1;
  11. #40 din=0;
  12. #20 din=1;
  13. #10 din=0;
  14. #60 din=1;
  15. #10 din=0;
  16. #20 din=1;
  17. end
  18. endmodule

运行结果:


 

四.存储器

(1)设计位宽为8bit,深度为8的ROM

其端口有四个为:输出,时钟,片选,地址线

rom代码:

  1. module rom(out,clk,cs,addr);
  2. input clk,cs;
  3. input [2:0]addr;
  4. output [7:0]out;
  5. reg [7:0]rom [7:0]; //注意不要忘记
  6. reg [7:0]out;
  7. initial
  8. begin
  9. rom[0]=8'b0000_0000;
  10. rom[1]=8'b0000_0001;
  11. rom[2]=8'b0000_0010;
  12. rom[3]=8'b0000_0011;
  13. rom[4]=8'b0000_0100;
  14. rom[5]=8'b0000_0101;
  15. rom[6]=8'b0000_0110;
  16. rom[7]=8'b0000_0111;
  17. end
  18. always@(posedge clk) //不要忘记写@
  19. begin
  20. if(cs)
  21. out<=8'bzzzz_zzzz;
  22. else
  23. out<=rom[addr];
  24. end
  25. endmodule

测试代码:

  1. module rom_tb;
  2. reg clk,cs;
  3. reg [2:0]addr;
  4. wire [7:0]out; //注意输出为wire型,输入引脚为reg
  5. rom uut(out,clk,cs,addr);
  6. initial
  7. begin
  8. cs=1;
  9. addr=0;
  10. clk=0;
  11. #20 cs=0;
  12. end
  13. always #10 clk=~clk;
  14. //repeat只能写在过程语句内
  15. initial
  16. repeat(7)
  17. #20 addr=addr+1;
  18. endmodule

实验结果:

 

 

(2)设计位宽为8bit,深度为8的RAM

其端口有:输入端口,输出端口,片选端口,读写选择端口,时钟,地址线

代码:

  1. module ram(din,dout,we,cs,clk,addr);
  2. input clk,cs,we;
  3. input[2:0]addr;
  4. input [7:0]din;
  5. output [7:0]dout;
  6. reg[7:0]ram[7:0]; //前[7:0]代表8位,后[7:0]代表深度为8
  7. reg [7:0]dout;
  8. always@(posedge clk) //注意写always而不是initial
  9. begin
  10. if(cs) //低电平有效
  11. dout<=8'bzzzz_zzzz;
  12. else
  13. if(we) //低电平有效
  14. dout<=ram[addr];
  15. else ram[addr]<=din;
  16. end
  17. endmodule

测试代码:

注意

  • 前160单位时间写入数据,之后读出数据;
  • 重复7次,是因为刚开始的时候,din=0;addr=0;
  • 在重复第一次的时候,#20  addr=addr+1; din=din+1;则20单位的时候,addr为1,din为1;重复7次刚好到7;
  1. module ram_tb;
  2. reg clk,cs,we;
  3. reg [2:0]addr;
  4. reg [7:0]din;
  5. wire [7:0]dout;
  6. ram uut(din,dout,we,cs,clk,addr);
  7. initial
  8. begin
  9. clk=0;
  10. addr=0;
  11. cs=0;
  12. we=0;
  13. din=0;
  14. #160 we=1;
  15. end
  16. always #10 clk=~clk;
  17. initial
  18. begin
  19. repeat(7)
  20. begin
  21. #20 addr=addr+1;
  22. din=din+1;
  23. end
  24. #40 repeat(7)
  25. #20 addr=addr-1;
  26. end
  27. endmodule

写入的仿真图:

 输出的仿真图:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/411128
推荐阅读
相关标签
  

闽ICP备14008679号