名称:时分数据交换系统Verilog代码vivado仿真
软件:vivado
语言:Verilog
代码功能:
请设计一个串行输入、串行输出的时分数据交换系统。该时分数据输入如下图所示:
针对上述输入信号,现要求给出如下的输出(可以有不超过8个时钟延时):
请给出详细的设计思路、实现步骤、电路原理图,并在给出时序图的基础上说明“将第1路数据交换至第4路数据输出时”的工作原理。
其中:
时钟端?Clk:?电路的工作时钟
串行输入Din:?串行输入数据,图中序号表示对应的信道号
输入使能端En:?高有效,表示当前对应的信道需要进行交换
串行输出Dout:?指示交换之后的数据输出
输出有效Eo:?高有效,指示当前输出的Dout数据为有效交换数据
信道指示Ind[1:0]:?指示当前输出Dout数据对应的信道号
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
1. 工程文件
2. 程序文件
3. 程序编译
4. Testbench
5. 仿真图
部分代码展示:
reg?[3:0]?cnt=0; reg?[3:0]?in_cnt=0; reg?[3:0]?out_cnt1=0; reg?[3:0]?data_in=0; reg?[3:0]?cnt1=0; reg?[3:0]?cnt2=0; parameter?state1?=?4'b0001;//状态机 parameter?state2?=?4'b0010; parameter?state3?=?4'b0011; parameter?state4?=?4'b0100; reg?[3:0]?state?=?4'b0001;//输入状态 always?@(posedge?CLK?) begin ?case(state) ????????state1:? if(EN) begin state?<=?state2; data_in?<=?{data_in[2:0],DIN}; cnt2?<=?cnt2?+1'd1; end state2:? if(EN) begin state?<=?state3; data_in?<=?{data_in[2:0],DIN}; cnt2?<=?cnt2?+1'd1; end state3:? if(EN) begin state?<=?state4; data_in?<=?{data_in[2:0],DIN}; cnt2?<=?cnt2?+1'd1; end state4:? if(EN) begin state?<=?state1; data_in?<=?{data_in[2:0],DIN}; in_cnt?<=?in_cnt?+?1'd1; cnt2?<=?cnt2?+1'd1; end endcase end reg?[3:0]?data,data1; always@(posedge?CLK) begin if(state?==?state1)//数据缓存 begin data?<=?data_in; end end reg?[3:0]?state_out?=?4'b0001;//输出状态 always?@(posedge?CLK?) begin if(cnt2?>=?5) begin ?case(state_out) state1: if(out_cnt1?<?in_cnt) begin cnt1?<=?4'd1; state_out?<=?state2; EO?<=?1'd1; Ind?<=?Ind?-?1; end else begin EO?<=?1'd0; end state2: begin cnt1?<=?4'd2; state_out?<=?state3; Ind?<=?Ind?-?1; end state3: begin cnt1?<=?4'd3; state_out?<=?state4; Ind?<=?Ind?-?1; end state4: begin cnt1?<=?4'd0; out_cnt1?<=?out_cnt1?+?1'd1; state_out?<=?state1; Ind?<=?Ind?-?1; end ?endcase end else begin Ind?<=?2'b00; end end always@(posedge?CLK) begin case(cnt1) 4'd0:DOUT?<=?data[0]; 4'd1:DOUT?<=?data[1]; 4'd2:DOUT?<=?data[2]; 4'd3:DOUT?<=?data[3]; endcase end endmodule
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=479
347