一个16bit字中两个相邻1之间最大间隙的电路verilog

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

设计一个能求出一个16bit字中两个相邻1之间最大间隙的电路。完成HDL设计及testbench描述,给出综合后的时序仿真结果。提交纸质文档。

系统化分为状态机控制器和数据通路,信号的接口关系如图(a)所示:

数据通路包括一个位计数器(k)、一个存储寄存器(tmp)、一个间隙寄存器(Gap)。

控制器产生的控制信号包括:

flush_tmp:清空tmp寄存器

incr_tmp:增加tmp寄存器

store_tmp:用tmp加载Gap

incr_k:增加k计数器

Verilog 代码:

module gap(data,clk,rst,gap);

input clk,rst;

input [15:0] data;

output [3:0] gap;

reg [3:0] gap,tmp,k;

reg flush_tmp,store_tmp,incr_k,incr_tmp;

parameter s_idle=0,s_1=1,s_2=2,s_done=3;

reg[1:0] state,next_state;

wire Bit=data[k];

always @(posedge clk,posedge rst)

if(rst)

state<=s_idle;

else

state<=next_state;

always @(state or Bit or k)

begin

next_state=state;

incr_tmp=0;

incr_k=0;

store_tmp=0;

flush_tmp=0;

case(state)

s_idle : if(k==15) next_state=s_done;

else if(Bit) begin next_state=s_1;incr_k=1;end

else begin next_state=s_idle;incr_k=1;end s_1 : if(k==15) next_state=s_done;

else if(!Bit) begin next_state=s_2;incr_k=1;incr_tmp=1;end

else begin next_state=s_1;incr_k=1;end

s_2 : if(k==15)

if(Bit)

if(tmp>gap)

begin store_tmp=1;next_state=s_done;end

else next_state=s_done;

else next_state=s_done;

else begin

if(Bit)

if(tmp>gap)

begin

store_tmp=1;next_state=s_1;incr_k=1;flush_tmp=1;end

else begin flush_tmp=1;incr_k=1;end

else begin incr_tmp=1;incr_k=1;next_state=s_2;end

end

s_done : begin next_state=s_idle;incr_k=1;end

default :next_state=s_idle;

endcase

end

always @(posedge clk,posedge rst)

begin

if(rst)

begin

k<=0;

tmp<=0;

gap<=0;

end

else

begin

if(flush_tmp) tmp<=0;

if(store_tmp) gap<=tmp;

if(incr_k)k<=k+1;

if(incr_tmp) tmp<=tmp+1;

end

end

endmodule

test-bench:

`timescale 1 ns/ 1 ps

module gap_vlg_tst();

reg clk;

reg [15:0] data;

reg rst;

wire [3:0] gap;

gap i1 (

.clk(clk),

.data(data),

.gap(gap),

.rst(rst)

);

initial

begin rst=1;

clk=0;

#10 rst=0;data=16'b1000_0000_0010_0001;

#640 rst=1; data=16'b1000_0000_0000_0001;

#10 rst=0;

#640 rst=1; data=16'b1000_1110_0010_0001;

#10 rst=0;

$display("Running testbench");

end

always #20 clk=~clk; endmodule

仿真波形:

相关文档
最新文档