基于modelsim的十个Verilog入门试验程序(2)(JK触发器+环形计数器)—程序+测试代码+波形+结果分析

内容
实验一:7人表决器的设计
实验二:算数逻辑单元的设计
实验三:JK触发器的设计
实验四:环形计数器的设计
实验五:顺序排列的设计
实验六:二进制除法器的设计
实验七:数字显示频率计的设计
实验八:序列检测器的设计
实验九:数字秒表的设计
实验十:自助售票机的设计

实验三:JK触发器的设计
编写Verilog代码使之能正确描述下表所示的1bit JK触发器功能,其中Q+表示在时钟上升沿到来后的Q值。要求该触发器还具有异步复位的功能在这里插入图片描述

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

//测试代码:
`timescale 1ns/ 1ns
module jk_tb;
reg j,k,clk,rst;
wire q;
jk_ff tb(.j(j), .k(k), .clk(clk), .q(q), .rst(rst));
always #2 clk= ~clk;
initial
begin
     j= 0; k= 0;clk= 0; rst= 1'b1;
  #10 rst<= 0;
    #5 {j,k}<= 2'b00; #8 {j,k}<= 2'b01;
    #13 {j,k}<= 2'b10; #18 {j,k}<= 2'b11;
  #20 rst<= 1'b1;	  //测试异步复位功能
    #25 {j,k}<= 2'b00; #28 {j,k}<= 2'b01;
    #33 {j,k}<= 2'b10; #38 {j,k}<= 2'b11;
  #40 rst<= 0;
    #35 {j,k}<= 2'b00; #38 {j,k}<= 2'b01;
    #43 {j,k}<= 2'b10; #48 {j,k}<= 2'b11;
  #100 $stop;
end
endmodule

波形仿真:
在这里插入图片描述
结果分析:
JK触发器要实现置0、置1、保持和取反的功能,还要异步置位,设置输入变量为j, k, clk, rst, 输出为q;
在时钟上升沿JK触发器工作,将时钟上升沿写入敏感事件表,又因为需要用到异步复位功能,复位信号也要写到敏感事件表;
根据上表功能用case语句编辑函数,对应 置0、置1、保持和取反四个输出状态,将输出赋值给q。

实验四:环形计数器的设计
编写设计下图所示寄存顺序的环形计数器,异步复位,复位时计数器中的值为4’b0001。
要求:(1)用参数定义此计数器的位宽; (2)仿真测试对象为8bit的环形计数器
在这里插入图片描述

//程序:
module ring(reset,clk,count);
parameter width= 4;
input reset,clk;
output reg[width-1:0] count;
reg [3:0] i;
always@(posedge clk,negedge reset)
begin  if(!reset) 
    begin count=4'b0001; i=0; end
  else if(i<3)
    begin count={count[2:0],count[width-1]}; i= i+1; end
  else if(i>= 3 && i< 5)
    begin  count={count[0], count[width-1:1]}; i= i+1; end
  else if( i>=5) 
    begin count = 4'b0001; i = 0;end
end
endmodule

//测试代码:
`timescale 1ns/ 1ns
module ring_tb;
reg reset,clk;
wire[3:0] count;
parameter half_clk_pried= 5;
ring u1(.reset(reset), .clk(clk), .count(count));
always  #half_clk_pried clk= ~clk;
initial begin	
	clk = 0;
	reset = 0;
	#18 reset <= 1'b1;
	#500 $stop;
	end
endmodule

波形仿真:
在这里插入图片描述
结果分析:
环形计数器初始值为4’b0001,不断循环左移右移,顺序如上表所示。输入时钟信号和复位信号,输出为上表计数结果;设置一个4位用于比较的变量i,当i<3,每次左移一位,i 自加1, 当3<= i < 5, 每次右移一位, i自加1;i>= 5, 回到初始状态。在仿真过程中,在时钟上升沿信号下,实现上述计数功能。波形如下图所示。

  • 6
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这里提供一个基本的FPGA对正弦AD采样的Verilog程序样例,供您参考: ``` module sin_adc( input clk, // 时钟信号 input rst, // 复位信号 input [7:0] sin_in, // 正弦信号输入 output reg [7:0] adc_out // ADC输出 ); reg [7:0] adc_cnt = 0; // 计数器 reg [7:0] adc_data = 0; // ADC数据 always @(posedge clk) begin if (rst) begin adc_cnt <= 0; adc_data <= 0; end else begin adc_cnt <= adc_cnt + 1; if (adc_cnt == 10) begin adc_cnt <= 0; adc_data <= sin_in; end end end assign adc_out = adc_data; endmodule ``` 这个程序实现了一个简单的ADC采样模块,可以对8位正弦信号进行采样,并将采样结果输出到8位ADC输出端口。在这个模块中,时钟信号和复位信号需要外部提供,正弦信号输入需要用户通过其他方式提供,这里直接使用了一个8位的输入端口。 为了仿真这个模块,可以使用ModelSim进行仿真。以下是一个简单的仿真测试程序: ``` `timescale 1ns / 1ns module sin_adc_tb(); reg clk; reg rst; reg [7:0] sin_in; wire [7:0] adc_out; sin_adc dut ( .clk(clk), .rst(rst), .sin_in(sin_in), .adc_out(adc_out) ); initial begin clk = 0; rst = 1; sin_in = 0; #10 rst = 0; #100 $finish; end always #5 clk = ~clk; initial begin $dumpfile("sin_adc.vcd"); $dumpvars(0, sin_adc_tb); #10 sin_in = 100; #100 sin_in = 200; #100 sin_in = 50; #100 sin_in = 150; end endmodule ``` 这个测试程序实例化了sin_adc模块,并对其进行了简单的测试。在测试过程中,时钟信号和复位信号由测试程序提供,正弦信号输入则在仿真过程中动态改变。仿真结果可以通过ModelSim波形查看功能进行观察和分析
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值