如何用VERILOG实现串-并转换?请各位达人指教!
本帖最后由 fpgaw 于 2010-7-3 06:37 编辑如何用VERILOG实现串-并转换?请各位达人指教!
用FPGA实现л/4DQPSK的调制解调,这是我第一次做项目,不会的很多,请大家帮忙,感激不尽! 串并转换用一个任务实现,然后在通过在always里调用任务;如把一串数据转换位一个8位并行数据输出:注意代码如下<br>
...<br>
reg serial; //存储串行数据的寄存器<br>
reg parallel; //并行数据的输出寄存器<br>
reg shift_state; //状态机变量<br>
parameter shift_bit7 = 9'b000000001,<br>
shift_bit6 = 9'b000000010,<br>
shift_bit5 = 9'b000000100,<br>
shift_bit4 = 9'b000001000, <br>
shift_bit3 = 9'b000010000, <br>
shift_bit2 = 9'b000100000,<br>
shift_bit1 = 9'b001000000,<br>
shift_bit0 = 9'b010000000,<br>
shift_end = 9'b100000000;<br>
<br>
always @ (posedge clk)<br>
begin<br>
shift_state <= shift_bit7; //初始化移位状态变量,使其有一个初状态<br>
if(...) <br>
shift; //在条件成立的时候调用任务 <br>
end<br>
<br>
//定义串并移位的任务<br>
task shift;<br>
begin<br>
case(shift_state)<br>
shift_bit7: begin <br>
parallel <= serial;<br>
shift_state <= shift_bit6; <br>
end<br>
shift_bit6: begin <br>
parallel <= serial;<br>
shift_state <= shift_bit5; <br>
end<br>
shift_bit5: begin <br>
parallel <= serial;<br>
shift_state <= shift_bit4; <br>
end<br>
shift_bit4: begin <br>
parallel <= serial;<br>
shift_state <= shift_bit3; <br>
end<br>
shift_bit3: begin <br>
parallel <= serial;<br>
shift_state <= shift_bit2; <br>
end<br>
shift_bit2: begin <br>
parallel <= serial;<br>
shift_state <= shift_bit1; <br>
end<br>
shift_bit1: begin <br>
parallel <= serial;<br>
shift_state <= shift_bit0; <br>
end<br>
shift_bit0: begin <br>
parallel <= serial;<br>
shift_state <= shift_end; <br>
end<br>
shift_end: shift_state <= shift_end;<br>
default:shift_state <= shift_end;<br>
endcase<br>
end<br>
endtask 如果只是2位的输出的话,有没有比较简单的方法? 两位的话直接在alwas里用一个状态变量为两位的状态机实现就可,不用单独写任务也可以吧<br>
任务就是实现某种功能,然后调用,这样程序更有条理,个人理解 真的很谢谢你的热心帮助!<br>
如果这样的话 能否实现:<br>
input in; //定义输入是1位的数据<br>
output out; //定义输出是2位的数据<br>
reg out;<br>
....<br>
out={out,in}; //使用拼接符 串行数据是每个时钟下只有一个数据,要用位拼接,就要把前一个时钟的数据保存一个时钟然后再和后一个时钟的数据一起用位拼接输出吧<br>
input rst_n;<br>
input in;<br>
output out;<br>
reg out;<br>
reg in_reg; //锁存in的寄存器<br>
reg cnt; //一位计数器<br>
<br>
always @ (posedge clk or negedge rst_n)<br>
begin <br>
if(!rst_n)<br>
begin<br>
cnt <= 1'b0;<br>
in_reg <= 1'b0; <br>
out <= 2'b00;<br>
end<br>
else if(cnt == 1'b1)<br>
begin<br>
cnt <= 1'b0;<br>
out <= {in_reg,in}; //当两个时钟后用位拼接方式并行输出一次<br>
end<br>
else<br>
begin<br>
cnt <= cnt + 1'b1;<br>
in_reg <= in; //对in锁存一个时钟<br>
end<br>
end 太好了,找了很久才找到的东西,谢谢 学习学习<br>
不错 3x 谢谢
页:
[1]