【Verilog】Verilog的八个经典入门例题

这篇具有很好参考价值的文章主要介绍了【Verilog】Verilog的八个经典入门例题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Verilog的八个经典入门例题


前言

西安电子科技大学大三上学期硬件描述语言与可编程逻辑设计上机作业,本文作者采用vivado软件编译,Vivado自带的Simulation工具仿真,效果完全等同于Quartus编译+Modelsim仿真的组合


提示:以下是本篇文章正文内容,提供的程序仅供参考

一、7人表决器设计

题目内容:设计一个表决器,实现功能大于3人同意,表决通过,输出“1’b1”,否则输出“1’b0”。

源程序(示例):

module vote_7in(
input a,b,c,d,e,f,g,
output out
    );
assign out = (a+b+c+d+e+f+g >3)?1:0;
endmodule

测试程序(示例):

`timescale 1ns / 1ns
module vote_7in_tb;
reg a,b,c,d,e,f,g;
wire out;

vote_7in U1(.a(a),.b(b),.c(c),.d(d),.e(e),.f(f),.g(g),.out(out));

initial 
begin
	{a,b,c,d,e,f,g} = 7'b0;
	#5 a = 1'b1;
	#5 b = 1'b1;
	#5 c = 1'b1;
	#5 d = 1'b1;
	#5 e = 1'b1;
	#5 f = 1'b1;
	#5 g = 1'b1;

end
endmodule

仿真波形截图(示例):
verilog实例,fpga开发

二、8位的ALU设计

题目内容: 设计一个8位的ALU(算术逻辑单元),该单元具有两个输入数据a,b和一个输入操作符Oper及输出数据c_out, sum,并且还具有下表所示的功能。

操作符 功能
Add a+b
Subtract a-b
Subtract_a b-a
Or a | b
And a&b
Xor a^b
Xnor a~^b

源程序(示例):

/*仅考虑无符号情况*/
module alu_8bit(
input[7:0] a,b,
input[2:0]Oper,
output reg c_out,
output reg[7:0] sum
    );
	
always@(a or b or Oper)
begin
	case(Oper)
	3'b000:  {c_out,sum} = a + b;
	3'b001:  {c_out,sum} = a - b;
	3'b010:  {c_out,sum} = b - a;
	3'b011:  {c_out,sum} = a | b;
	3'b100:  {c_out,sum} = a & b;
	3'b101:  {c_out,sum} = a ^ b;
	3'b110:  {c_out,sum} = a ~^ b;
	default: {c_out,sum} = 9'bx;
	endcase
end
endmodule

测试程序(示例):

`timescale 1ns / 1ns
module alu_8bit_tb;
	reg[7:0] a,b;
	reg[2:0] Oper;
	wire c_out;
	wire[7:0] sum;
	
	alu_8bit u1(.a(a),.b(b),.Oper(Oper),.c_out(c_out),.sum(sum));
	
	initial
	begin
	a = 8'b01110000; b = 4'b11110011; Oper = 3'b0;
		#5 Oper = 3'b000;
		#5 Oper = 3'b001;
		#5 Oper = 3'b010;
		#5 Oper = 3'b011;
		#5 Oper = 3'b100;
		#5 Oper = 3'b101;
		#5 Oper = 3'b110;
		#5 Oper = 3'b111;
	end
endmodule

仿真波形截图(示例):
verilog实例,fpga开发

三、JK触发器的设计

题目内容: 编写Verilog代码使之能正确描述下表所示的1bit JK触发器功能,其中Q+表示在时钟上升沿到来后的Q值。要求该触发器还具有异步复位的功能。

J K Q+
0 0 Q
1 0 1
0 1 0
1 1 ~Q

源程序(示例):

module jk_ff(j,k,q,clk,rst);
input j,k,clk,rst;
output reg q;
always@(posedge clk or posedge rst)
begin
	if(rst == 1'b1)
		q = 0;
	else
		case({j,k})
		2'b00:q = q;
		2'b10:q = 1;
		2'b01:q = 0;
		2'b11:q = ~q;
		endcase
end
endmodule

测试程序(示例):

`timescale 1ns/1ns
module jk_ff_tb;
reg j,k,clk,rst;
wire q;
jk_ff u1(.j(j),.k(k),.clk(clk),.rst(rst),.q(q));
always #5 clk = ~clk;
initial
begin
	rst = 0; clk = 0; j = 1; k = 0;
	#10 j=0;k=0;
	#10 j=1;k=0;
	#10 j=0;k=1;
	#10 j=1;k=1;
	#15	rst = 1;
	#10 j=0;k=0;
	#10 j=1;k=0;
	#10 j=0;k=1;
	#10 j=1;k=1;
end
endmodule

仿真波形截图(示例):
verilog实例,fpga开发

四、环形计数器

题目内容: 设计下图所示寄存顺序的环形计数器,异步复位,复位时计数器中的值为4’b0001。
要求:(1)用参数定义此计数器的位宽;
            (2)仿真测试对象为8bit的环形计数器;

0 0 0 1
0 0 1 0
0 1 0 0
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

源程序(示例):

module ring_count(reset, clk, count);
parameter width = 4;
input reset, clk;
output reg[width - 1:0] count;
integer I;
always@(posedge clk or posedge reset)
begin
	if(reset == 1'b1)
		begin
		count <= 4'b0001;
		I <= 0;
		end
	else
	begin
		if(I<width - 1)
			begin
			count <= {count[2:0],count[width - 1]};
			I <= I + 1;
			end
		else if(I<5&&I>=width - 1)
			begin
			count <= {count[0],count[width - 1:1]};
			I <= I + 1;
			end
		else
			begin
				count <= {count[0],count[width - 1:1]};
				I <= 0;
			end
	end
end
endmodule

测试程序(示例):

`timescale 1ns/1ns
module ring_count_tb;
reg clk,reset;
wire [7:0] count;

ring_count u1(.reset(reset),.clk(clk),.count(count));

always #5 clk = ~clk;

initial
begin
clk <= 1'b0;
reset <= 1'b1;
#15 reset = 1'b0;
#100 reset = 1'b1;
end
endmodule

仿真波形截图(示例):

verilog实例,fpga开发

五、二进制整数除法器设计

要求:(1)分析除法器工作原理,不能使用整除运算符/ 和求余运算符% ;
            (2)设被除数位数=8,除数位数=4
            (3)输出商和余数

源程序(示例):

/*二进制无符号整数除法*/
module divider_2bit(a,b,c,d);
input [7:0]a;//a为被除数
input [3:0]b;//b为除数
output reg[7:0]c;//c为商
output reg[3:0]d;//d为余数

reg[15:0] temp_a=0;
reg[7:0] temp_c=0;

integer I;

always@(a or b)
begin
	temp_a = a;
	for(I=0;I<9;I=I+1)//效果等同于repeat(9),只有循环次数确定的for、while、repeat语句才可综合,否则不可综合
	begin
		temp_c = temp_c<<1;//移位运算符的结果是一串数,并不能改变移位对象的值
		if(temp_a[15:8]>=b)
		begin
			temp_c = temp_c + 1'b1;
			temp_a[15:8] = temp_a[15:8] - b;
			temp_a = temp_a<<1;//效果等同于temp_a = {temp_a[14:0],1'b0};切记使用位拼接运算符要注明位宽
		end
		else
			temp_a = temp_a<<1;//不可写作temp_a = {temp_a[14:0],0};因为0没有注明位宽
	end
	c <= temp_c;
	d <= temp_a[12:9];
end

endmodule

测试程序(示例):

`timescale 1ns / 1ns
module divider_2bit_tb;
reg[7:0] a;
reg[3:0] b;
wire[7:0]c;
wire[3:0]d;

divider_2bit u1(.a(a),.b(b),.c(c),.d(d));

initial
begin
a = 8'b0001_1011;
b = 4'b0101;
#100
a = 8'b1001_1011;
b = 4'b0001;
#100
a = 8'b0000_0011;
b = 4'b1101;
#100
a = 8'd250;
b = 4'd15;
#100
a = 8'd6;
b = 4'd3;
#100
a = 8'd97;
b = 4'd13;
end
endmodule

仿真波形截图(示例):

verilog实例,fpga开发

六、排序任务

设a,b,c,d四个数,按从小到大的顺序重新排列并输出到ra,rb,rc,rd中。
要求:(1)需在Verilog HDL描述中使用任务(task)。

源程序(示例):

module sort_task(a,b,c,d,ra,rb,rc,rd);
parameter width = 4;
input [width-1:0] a,b,c,d;
output reg[width-1:0] ra,rb,rc,rd;

always@(a or b or c or d)
begin
	sort(a,b,c,d,ra,rb,rc,rd);
end

task sort;
input [width-1:0] a,b,c,d;
output reg[width-1:0] ra,rb,rc,rd;
reg [width-1:0]temp;
integer i,j;
reg [width-1:0]data[3:0];

begin
data[0] = a;
data[1] = b;
data[2] = c;
data[3] = d;

for(i=0;i<3;i=i+1)
	begin
	for(j=0;j<3-i;j=j+1)
		begin
		if(data[j]>data[j+1])
			begin
			temp = data[j+1];
			data[j+1] = data[j];
			data[j] = temp;
			end
		end
	end

ra = data[0];
rb = data[1];
rc = data[2];
rd = data[3];
end

endtask

endmodule

测试程序(示例):

`timescale 1ns / 1ns
module sort_task_tb;
parameter width = 4;
reg[width-1:0] a,b,c,d;
wire[width-1:0] ra,rb,rc,rd;

sort_task u1(.a(a),.b(b),.c(c),.d(d),.ra(ra),.rb(rb),.rc(rc),.rd(rd));

initial
begin
a <= 4'd4;
b <= 4'd3;
c <= 4'd2;
d <= 4'd1;
#500
a <= 4'd0;
b <= 4'd7;
c <= 4'd3;
d <= 4'd5;
end
endmodule

仿真波形截图(示例):
verilog实例,fpga开发

七、简易频率计

设计一个8 位数字显示的简易频率计
要求:
①能够测试10Hz~10MHz 方波信号;
②电路输入的基准时钟为1Hz,要求测量值以8421BCD 码形式输出;
③系统有复位键;
④采用分层次分模块的方法;

源程序(示例):

module freq_cnt(clk_1Hz, fin, rst, d0, d1, d2, d3, d4, d5, d6, d7);  
  input clk_1Hz;
  input fin; 
  input rst;
  
  output[3:0] d0, d1, d2, d3, d4, d5, d6, d7; 
  wire[3:0] q0, q1, q2, q3, q4, q5, q6, q7;  
  //wire[3:0] d0, d1, d2, d3, d4, d5, d6, d7;  
  wire[3:0] en_out0,en_out1,en_out2,en_out3,en_out4,en_out5,en_out6,en_out7;
  wire count_en;  
  wire latch_en;  
  wire clear;
  
  

  control u_control(.clk_1Hz(clk_1Hz), .rst(rst), .count_en(count_en),  
                    .latch_en(latch_en), .clear(clear));  
    

  counter_10 counter0(.en_in(count_en), .clear(clear), .rst(rst),  
                      .fin(fin), .en_out(en_out0), .q(q0));  
  counter_10 counter1(.en_in(en_out0), .clear(clear), .rst(rst),  
                      .fin(fin), .en_out(en_out1), .q(q1));  
  counter_10 counter2(.en_in(en_out1), .clear(clear), .rst(rst),  
                      .fin(fin), .en_out(en_out2), .q(q2));  
  counter_10 counter3(.en_in(en_out2), .clear(clear), .rst(rst),  
                      .fin(fin), .en_out(en_out3), .q(q3));  
  counter_10 counter4(.en_in(en_out3), .clear(clear), .rst(rst),  
                      .fin(fin), .en_out(en_out4), .q(q4));  
  counter_10 counter5(.en_in(en_out4), .clear(clear), .rst(rst),  
                      .fin(fin), .en_out(en_out5), .q(q5));  
  counter_10 counter6(.en_in(en_out5), .clear(clear), .rst(rst),  
                      .fin(fin), .en_out(en_out6), .q(q6));  
  counter_10 counter7(.en_in(en_out6), .clear(clear), .rst(rst),  
                      .fin(fin), .en_out(en_out7), .q(q7));  
 
  ulatch u_latch(.clk_1Hz(clk_1Hz),.rst(rst),.latch_en(latch_en),
					.q0(q0),.q1(q1),.q2(q2),.q3(q3),.q4(q4),.q5(q5),.q6(q6),.q7(q7),
					.d0(d0),.d1(d1),.d2(d2),.d3(d3),.d4(d4),.d5(d5),.d6(d6),.d7(d7));
endmodule  
  

module control(clk_1Hz, rst, count_en, latch_en, clear);  
  input clk_1Hz;  
  input rst;  
  output count_en;  
  output latch_en;  
  output clear;  
  reg[1:0] state; 
  reg count_en;  
  reg latch_en;  
  reg clear;  
  always @(posedge clk_1Hz or negedge rst)  
  if(!rst)   
    begin    
      state <= 2'd0;  
      count_en <= 1'b0;  
      latch_en <=1'b0;  
      clear <= 1'b0;  
    end  
     else   
    begin  
      case(state)  
            2'd0:   
            begin 
            count_en <= 1'b1; 
            latch_en <=1'b0;  
            clear <= 1'b0;  
            state <= 2'd1;  
          end  
        2'd1:  
          begin   
            count_en <= 1'b0;  
            latch_en <=1'b1;  
            clear <= 1'b0;  
            state <= 2'd2;  
          end  
        2'd2:   
          begin 
            count_en <= 1'b0;  
            latch_en <=1'b0;  
            clear <= 1'b1;  
            state <= 2'd0;
          end  
        default:  
          begin  
            count_en <= 1'b0;  
            latch_en <=1'b0;  
            clear <= 1'b0;  
            state <= 2'd0;  
          end  
            
      endcase  
            
    end  
    
    
endmodule  
  

module counter_10(en_in, rst, clear, fin, en_out, q);  
  input en_in;  
  input rst;   
  input clear; 
  input fin;    
  output en_out; 
  output[3:0] q;  
    
  reg en_out;  
  reg[3:0] q;  
    
  always@ (posedge fin or negedge rst)  
  if(!rst) 
      begin  
        en_out <= 1'b0;  
        q <= 4'b0;  
      end  
        
    else if(en_in) 
      begin  
        if(q == 4'b1001)   
          begin  
            q <= 4'b0;  
            en_out <= 1'b1;  
          end  
             else   
          begin  
            q <= q + 1'b1;  
            en_out <=1'b0;  
          end  
      end  
        
    else if(clear) 
      begin  
        q <= 4'b0;  
        en_out <= 1'b0;  
      end  
    else  
    begin  
    q <= q;  
    en_out <=1'b0;  
    end   
    
endmodule  
   
module ulatch(clk_1Hz, latch_en, rst, q0, q1, q2, q3, q4, q5, q6, q7,  
            d0, d1, d2, d3, d4, d5, d6, d7);  
              
  input clk_1Hz, latch_en, rst;  
  input[3:0] q0, q1, q2, q3, q4, q5, q6, q7;  
  output[3:0] d0, d1, d2, d3, d4, d5, d6, d7;  
  reg[3:0] d0, d1, d2, d3, d4, d5, d6, d7;  
  always@ (posedge clk_1Hz or negedge rst)  
  if(!rst) 
    begin  
      d0 <= 4'b0; d1 <= 4'b0; d2 <= 4'b0; d3 <= 4'b0; d4 <= 4'b0;  
      d5 <= 4'b0; d6 <= 4'b0; d7 <= 4'b0;  
    end  
  else if(latch_en) 
    begin  
      d0 <= q0; d1 <= q1; d2 <= q2; d3 <= q3; d4 <= q4;  
      d5 <= q5; d6 <= q6; d7 <= q7;  
    end  
     else  
    begin  
      d0 <= d0; d1 <= d1; d2 <= d2; d3 <= d3; d4 <= d4;  
      d5 <= d5; d6 <= d6; d7 <= d7;  
    end  
  
endmodule


测试程序(示例):

`timescale 1ns/1ps  
//测试模块  
module freq_cnt_tb;  
  parameter CLK_1HZ_DELAY = 5_0000_0000; //1Hz基准信号  
  parameter FIN_DELAY = 100;             //5MHz待测信号  
  reg clk_1Hz;  
  reg fin;  
  reg rst;  
    
  wire[3:0] d0, d1, d2, d3, d4, d5, d6, d7;  
    
  initial  
    begin  
      rst =1'b0;  
      #1 rst = 1'b1;  
    end  
      
  initial  
    begin  
      fin = 1'b0;  
      forever  
      #FIN_DELAY fin = ~fin;  
    end  
      
  initial  
    begin  
      clk_1Hz = 1'b0;  
      forever  
      #CLK_1HZ_DELAY clk_1Hz = ~clk_1Hz;  
    end  
      
    freq_cnt freDetect1(.clk_1Hz(clk_1Hz), .rst(rst), .fin(fin),  
    .d0(d0), .d1(d1), .d2(d2), .d3(d3), .d4(d4), .d5(d5), .d6(d6), .d7(d7));  
      
     
endmodule  

仿真波形截图(示例):

verilog实例,fpga开发

八、序列检测器

要求:
(1)在每一个时钟下降沿检查输入数据,当输入数“10011”时,输出asm被置为1;其余情况asm为0。
(2)画出fsm(有限状态机);

源程序(示例):

module seq_detector(clk,ain,asm);
input clk,ain;
output reg asm;
reg[4:0] q;
q = 5'b00000;
always@(negedge clk) q <= {q[3:0],ain};

always@(negedge clk) 
	if(q == 5'b10011) asm = 1;
	else			  asm = 0;
endmodule

测试程序(示例):

`timescale 1ns/1ps
module seq_detector_tb;
wire asm,ain;
reg clk;
reg[19:0] arr;
seq_detector U0(.clk(clk),.ain(ain),.asm(asm));
initial 
begin 
	clk = 0;
	arr = 20'b_01001_11010_11001_10010;
	#500 $stop;
end
always #5 clk=~clk;
always @(negedge clk) arr = {arr[0],arr[19:1]};
assign ain = arr[0];
endmodule

仿真波形截图(示例):
verilog实例,fpga开发
文章来源地址https://www.toymoban.com/news/detail-782383.html

到了这里,关于【Verilog】Verilog的八个经典入门例题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【FPGA入门】第一篇、Verilog基本语法常识

    目录 第一部分、不同的变量类型 1、wire和reg的区别  2、如何对变量进行赋值呢? 3、什么是阻塞?什么是非阻塞? 第二部分、变量位宽的定义 1、各种系统默认情况 2、变量位宽声明方式 3、表明位宽的情况下,赋值方式 4、两个模块之间例化,不定义变量直接用的方式 5、常

    2024年02月04日
    浏览(53)
  • 【FPGA/verilog -入门学习5】verilog中的genrate for 和for 以及数组的用法

    本文参考:verilog generate语法总结-CSDN博客 Verilog数组赋值_笔记大全_设计学院 在Verilog中, generate for 和 for 都是用于循环的结构,但是它们具有不同的应用场合和语义。 for 循环: for 循环主要用于行为描述(behavioral description),通常用于描述算法或数学运算。 for 循环在仿真

    2024年02月03日
    浏览(47)
  • 【FPGA基础入门实践】Verilog 基本项目操作逐步演示

    0x00 回顾:AND/OR/NOT 逻辑的特性 AND: 与门可以具有两个或更多的输入,并返回一个输出。当所有输入值都为 1 时,输出值为 1。如果输入值中有任何一个为 0,则输出值为 0。 OR: 或门可以具有两个或更多的输入,并返回一个输出。如果输入值中至少有一个为 1,则输出值为

    2024年02月12日
    浏览(39)
  • 【FPGA/verilog -入门学习1】verlog中的BUFGCE,BUFGMUX原语

    参考:(详解)BUFG,IBUFG,BUFGP,IBUFGDS等含义以及使用 - 知乎 FPGA资源介绍——时钟资源(二)_fpga时钟资源-CSDN博客 是 带有时钟使能端的全局缓冲 。它有一个输入I、一个使能端CE和一个输出端O。只有当BUFGCE的使能端CE有效(高电平)时,BUFGCE才有输出。 对比发现:使用自己产生

    2024年02月21日
    浏览(68)
  • 网络安全渗透测试的八个步骤

    ​一、明确目标 ​1.确定范围:测试目标的范畴、ip、网站域名、内外网、检测帐户。 2.确定标准:能渗入到何种程度,所花费的时间、能不能改动提交、能不能漏洞利用、这些。 3.确定要求:web应用的漏洞、业务逻辑漏洞、工作人员管理权限管理漏洞、这些。 ​二、信息收

    2024年02月04日
    浏览(46)
  • 【FPGA/verilog -入门学习11】verilogTestbench中的文本文件写入,读出,打印等操作

    本文参考:Verilog中的系统任务(显示/打印类)--$display, $write,$strobe,$monitor-CSDN博客 Verilog:parameter、localparam的区别和用法-CSDN博客 Verilog的系统任务----$fopen、$fclose和$fdisplay, $fwrite,$fstrobe,$fmonitor_verilog fopen-CSDN博客 Verilog的系统任务----$readmemh和$readmemb-CSDN博客 $display可以

    2024年02月03日
    浏览(46)
  • FPGA/Verilog HDL/AC620零基础入门学习——第一个项目按键控制LED

    最近要考试了,所以我赶紧补习FPGA,我们用的是小梅哥的AC620开发板,软件是Quartus。推荐看这个视频教程:零基础轻松学习FPGA,小梅哥FPGA设计思想与验证方法视频教程 用按键控制LED灯的亮灭就是一个二选一多路器,两个IO,a、b,可以是高电平,也可以是低电平。 输入按键

    2024年02月05日
    浏览(57)
  • 值得深思的八个自动化测试疑难杂症

    去年有写过两篇博客,分别是浅谈UI自动化测试和浅谈接口自动化测试,都是一些基础的方法论的内容,今年转岗专门做自动化测试,有了很多新的发现,当然,也遇到了很多的挑战。 遂重开一篇博客,聊聊最近做自动化测试遇到的一些挑战,以及自己的解决方法和一些思考

    2024年02月11日
    浏览(50)
  • 关键信息基础设施安全保护应坚持的八个原则

    关键信息基础设施在规划设计、开发建设、运行维护、退役废弃等阶段应加强安全保护。关键信息基础设施运营者应按照《关键信息基础设施安全保护要求》等国家标准的要求,在落实网络安全等级保护制度要求和国家标准的基础上,从关键信息基础设施分析识别、安全防护

    2024年01月17日
    浏览(60)
  • Sora后观察:AI大模型产业落地的八个锚点

    自OpenAI推出其首个文生视频模型Sora以来,AI视频制作领域迎来了革命性的变革。短短不到三个月的时间里,Sora凭借其出色的视频生成能力,已经在视频时长、画幅和扩展性等方面取得了显著的进步,不仅引领了AI视频模型的新潮流,也在资本市场引发了AI热潮。本文将深入探

    2024年02月22日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包