Verilog数字系统设计十一
复杂数字电路设计1
前言
随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容:
采用双缓冲机制-输入缓冲和输出缓冲,在输出缓冲向外并行发送数据的同时如果输入缓冲器不满则可继续串行接收数据
一、什么是串入并出单元?
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
二、编程
1.要求:
- 编程实现串入并出单元,该单元至少应包括如下端口:
- 端口说明如下:
a) i_clk:串口时钟
b) i_rest:模块复位信号
c) i_data:串口输入端
d) i_ena:片选信号
e) i_full:模块输入缓冲器已满(提醒发送端停止发送)
f) o_ready:模块输出缓冲器已准备好数据(提醒并行接收端可以接收数据了)
g) o_cout[7:0]:并行数据输出端
h) i_ack:并行接端数据接收完成反馈信息(这时如果模块输入缓冲区有已接收的数据则可将数据传送至输出缓冲区进行发送) - 注意各端口的数据流向并准确理解端口定义;
- 该模块采用双缓冲机制-输入缓冲和输出缓冲,在输出缓冲向外并行发送数据的同时如果输入缓冲器不满则可继续串行接收数据;
- 各控制信号高有效还是低有效自行定义;
2.设计思路:
3.串入并出单元实现:
代码如下:
module sipo(o_cout,o_ready,i_rest,i_full,i_clk,i_data,i_ena,i_ack);
input i_rest,i_clk,i_data,i_ena,i_ack;
output o_ready,i_full;
reg i_full,o_ready;
output [7:0] o_cout;
reg [7:0] i_dataBuff,o_dataBuff ;
reg[2:0] cnt;
always@(negedge i_rest, posedge i_clk,negedge i_ena,posedge i_ack)
begin
if(i_ena==1'b0)
begin
i_full<=1'bz;
o_ready<=1'bz;
i_dataBuff<= 8'bz;
o_dataBuff<= 8'bz;
cnt<=3'bz;
end
else
begin
if(i_rest == 1'b0)//reset signial
begin
i_full<=1'b0;
o_ready<=1'b0;
i_dataBuff<= 8'b0;
o_dataBuff<= 8'b0;
cnt<=3'b0;
end
else if(i_ack)
begin
if(i_full)
begin
i_full<=0;
o_ready<=1;
cnt<=3'b0;
o_dataBuff[7:0]=i_dataBuff[7:0];
$display("Input buffer full!");
$display("o_dataBuff=%b",o_dataBuff);
end
else
begin
o_ready<=0;
end
end
else
begin
if (cnt == 3'b111)//get all 8bit data,change dout
begin
i_full<=1;
end
else
begin
i_dataBuff[7-cnt] <= i_data;
$display("i_dataBuff[%d]=%b",(7-cnt),i_data);
cnt <= cnt + 1;
i_full<=0;
end
end
end
end
assign o_cout=o_ready?o_dataBuff:8'hz;
endmodule
测试代码如下:
module sipo_tb;
reg i_rest_t,i_clk_t,i_data_t,i_ena_t,i_ack_t;
wire o_ready_t,i_full_t;
wire[7:0] o_cout_t;
sipo mysipo(
.i_rest(i_rest_t),
.i_clk(i_clk_t),
.i_data(i_data_t),
.o_cout(o_cout_t),
.i_ena(i_ena_t),
.i_ack(i_ack_t),
.o_ready(o_ready_t),
.i_full(i_full_t)
);
initial
begin
i_rest_t = 1;
i_clk_t = 0;
i_ena_t=1;
i_data_t=0;
i_ack_t=0;
#5 i_rest_t = 0;
#2 i_rest_t = 1;
end
always #5 i_clk_t = ~i_clk_t;
always #10 i_data_t={$random}%2;
always@(posedge i_full_t,posedge o_ready_t)
begin
i_ack_t= 1;
#1
i_ack_t = 0;
end
endmodule
仿真波形如下:
总结
提示:
以上就是今天要分享的内容,本文仅仅简单介绍了用Verilog实现串入并出单元设计。