各位大侠,怎么用Verilog设计串并转换电路啊
用移位寄存器
先把课本读完,再来问问题吧。
具体点 啊
串行输入,并行输出
多时钟输入,单时钟输出
/***************************************
简单的例子,仅供参考
***************************************/
`define data_width 32
module example(
data_out,
dout_en,
data_in,
data_wr,
clk,
rst_n
);
//=============================
//ports declaration
//=============================
output[`data_width -1 : 0] data_out;
output dout_en;
input data_in;
input data_wr;
input clk;
input rst_n;
//=============================
//parameter declaration
//=============================
parameter UDLY = 1;
//=============================
//signals declaration
//=============================
reg[`data_width -1 : 0] shift_reg;
reg[`data_width -1 : 0] shift_cnt;
wire shift_done;
wire dout_ne;
//=============================
//main code
//=============================
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n)
shift_reg <= {`data_width{1'b0}};
else if(data_wr)
shift_reg <= #UDLY {shift_reg[`data_width -2 : 0],data_in};
end
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n)
shift_cnt <= {`data_width{1'b0}};
else if(shift_done)
shift_cnt <= #UDLY {`data_width{1'b0}};
else if(data_wr)
shift_cnt <= shift_cnt + 1'b1;
end
assign shift_done = (shift_cnt == `data_width);
assign dout_en = shift_done;
//================================code end=================================
endmodule
you'd better add a define choise for left shift or right shift
data_out呢?
用移位寄存器和选通器就可以实现了。
/***************************************
简单的例子,仅供参考
楼上的说对,写漏了些东西,
改一改哈
***************************************/
`define data_width 32
`define right_shift
module example(
data_out,
dout_en,
data_in,
data_wr,
clk,
rst_n
);
//=============================
//ports declaration
//=============================
output[`data_width -1 : 0] data_out;
output dout_en;
input data_in;
input data_wr;
input clk;
input rst_n;
//=============================
//parameter declaration
//=============================
parameter UDLY = 1;
//=============================
//signals declaration
//=============================
reg[`data_width -1 : 0] shift_reg;
reg[`data_width -1 : 0] shift_cnt;
wire shift_done;
wire dout_en;
//=============================
//main code
//=============================
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n)
shift_reg <= {`data_width{1'b0}};
else if(data_wr)
`ifdef right_shift
shift_reg <= #UDLY {data_in,shift_reg[`data_width -1 : 1]};
`else
shift_reg <= #UDLY {shift_reg[`data_width -2 : 0],data_in};
`endif
end
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n)
shift_cnt <= {`data_width{1'b0}};
else if(shift_done)
shift_cnt <= #UDLY {`data_width{1'b0}};
else if(data_wr)
shift_cnt <= shift_cnt + 1'b1;
end
assign shift_done = (shift_cnt == `data_width);
assign dout_en = shift_done;
assign data_out = shift_reg;
//================================code end=================================
endmodule
看过这个代码
哥们你弄的太复杂了
那些define要那些干嘛?
直接一点不就行了
还有下面那些`````号,不能综合的
是啊,串转并,按位存就可以了吧。书上的
有没有范例?可以综合的
学习了。呵呵
想学习。
自己动手写写就知道了
呵呵 不错哦
#UDLY 这个不推荐吧!
受教海鸥拉了拉
路过,看看
可以去网上搜索, 最多的还是用shift register 做。
这个闭着眼都能出来了。
支持一个。
kanakn
感觉写得不错啊 受教
