张家港做网站的,2012版本wordpress,php网站开发开发网站教程,成都市网站建设公描述 实现数据位宽转换电路#xff0c;实现24bit数据输入转换为128bit数据输出。其中#xff0c;先到的数据应置于输出的高bit位。 电路的接口如下图所示。valid_in用来指示数据输入data_in的有效性#xff0c;valid_out用来指示数据输出data_out的有效性#xff1b;clk是时…描述 实现数据位宽转换电路实现24bit数据输入转换为128bit数据输出。其中先到的数据应置于输出的高bit位。 电路的接口如下图所示。valid_in用来指示数据输入data_in的有效性valid_out用来指示数据输出data_out的有效性clk是时钟信号rst_n是异步复位信号。 接口时序示意图
输入描述 input clk , input rst_n ,input valid_in ,input [23:0] data_in 输出描述 output reg valid_out ,output reg [127:0] data_out
解题分析
输入valid_in, data_in[23:0]输出valid_out,data_out[127:0] 输入数据是24bit输出数据是128bit。 因为128×324×16128\times324\times16128×324×16所以每输入16个有效数据就可以产生三个完整的输出。因此设置一个仅在输入数据有效时工作的计数器cnt计数范围是0-15。 reg [3:0] cnt;always(posedge clk or negedge rst_n) beginif(~rst_n)cnt 0;elsecnt ~valid_in? cnt:cnt15 ? 0 :cnt1;end然后设置一个数据暂存器data_lock每当输入有效时将数据从低位移入。
reg [127:0] data_lock;
always(posedge clk or negedge rst_n) beginif(~rst_n)data_lock 0;elsedata_lock valid_in? {data_lock[103:0], data_in}: data_lock;
end由上图易得每当计数器cnt计数到5、10、15时data_out要进行更新并拉高valid_out一个周期。 always(posedge clk or negedge rst_n) beginif(~rst_n)valid_out 0;elsevalid_out (cnt5 || cnt10 || cnt15)valid_in;endalways(posedge clk or negedge rst_n) beginif(~rst_n)data_out 0;else if(cnt5)data_out valid_in? {data_lock[119:0], data_in[23:16]}: data_out;else if(cnt10)data_out valid_in? {data_lock[111:0], data_in[23: 8]}: data_out;else if(cnt15)data_out valid_in? {data_lock[103:0], data_in[23: 0]}: data_out;elsedata_out data_out;end参考代码
timescale 1ns/1nsmodule width_24to128(input clk , input rst_n ,input valid_in ,input [23:0] data_in ,output reg valid_out ,output reg [127:0] data_out
);reg [3:0] cnt;reg [127:0] data_lock;always(posedge clk or negedge rst_n) beginif(~rst_n)cnt 0;elsecnt ~valid_in? cnt:cnt1;endalways(posedge clk or negedge rst_n) beginif(~rst_n)valid_out 0;elsevalid_out (cnt5 || cnt10 || cnt15)valid_in;endalways(posedge clk or negedge rst_n) beginif(~rst_n)data_lock 0;elsedata_lock valid_in? {data_lock[103:0], data_in}: data_lock;endalways(posedge clk or negedge rst_n) beginif(~rst_n)data_out 0;else if(cnt5)data_out valid_in? {data_lock[119:0], data_in[23:16]}: data_out;else if(cnt10)data_out valid_in? {data_lock[111:0], data_in[23: 8]}: data_out;else if(cnt15)data_out valid_in? {data_lock[103:0], data_in[23: 0]}: data_out;elsedata_out data_out;end
endmodule注解题分析来源于网友如有侵权请告删之。