刚学习verilog,何如实现8位串并转换
本帖最后由 fpgaw 于 2010-6-29 05:07 编辑刚学习verilog,何如实现8位串并转换
刚学习verilog
求教高手哦!
当标志位为1串->并
为0 并 串 做了个两位的 8位要用到分频 主要用到移位寄存器 搜一下以前的相关帖子,好像以前有人讨论过 用移位寄存器啊!<br>
给你贴一个<br>
3.3.1源代码<br>
/////////////////////////////////////////////////////<br>
// 试验名称 : 串并转换<br>
// 程序名称 : czb_8.v(测试平台)<br>
// 日 期 : 2006/6/11<br>
// 实验者 : <br>
///////////////////////////////////////////////////////////<br>
//*********************************************************<br>
// 定义模块(module) <br>
//*********************************************************<br>
module czb_8 (clk,in,out,data_in_8,rst,sp); <br>
inout in; //串并转换_串行输入,并串转换_串行输出<br>
input data_in_8; //并转串……并行信号输入<br>
output out; //串转并……并行信号输出<br>
input clk,rst,sp; //时钟和清零和使能信号和功能选择 <br>
reg out;<br>
reg Tmp_data_in_8; <br>
reg data_in;<br>
reg count_B,count_C; //count_B用与并转串计数,count_C用于串转并计数; <br>
assign in = ((sp==0)&&(rst==1))?data_in:1'bz; //将寄存器data_in与in关联 <br>
always@(posedge clk or negedge rst)<br>
if (!rst)<br>
begin <br>
count_B<=0;<br>
count_C<=0; <br>
Tmp_data_in_8<= 8'bz;<br>
data_in <= 1'bz;<br>
out <= 8'bz; <br>
end <br>
else<br>
begin<br>
if(sp) // 由串向并转换<br>
begin <br>
if(count_C<=7)<br>
begin <br>
if((in==0)||(in==1)) <br>
begin<br>
out <= {out,in};<br>
count_C<=count_C+1;<br>
end<br>
else begin<br>
count_C<=0;<br>
end<br>
end<br>
else begin<br>
count_C<=0;<br>
out <= 8'bz;<br>
end <br>
end<br>
else <br>
begin<br>
if(count_B<=7)<br>
begin<br>
Tmp_data_in_8<=data_in_8;<br>
data_in <= Tmp_data_in_8; <br>
Tmp_data_in_8<= Tmp_data_in_8>>1;<br>
Tmp_data_in_8<=1'bz; <br>
count_B <= count_B+1;<br>
end<br>
else begin<br>
data_in <= 1'bz;<br>
Tmp_data_in_8<=data_in_8;<br>
count_B <=0;<br>
end<br>
end<br>
end<br>
endmodule<br>
3.3.2 测试代码<br>
///////////////////////////////////////////////////////<br>
// 实验名称 : 串并转换<br>
// 程序名称 : tb_czb_8.v(测试平台)<br>
// 日 期 : 2006/6/11<br>
// 实验者 : <br>
///////////////////////////////////////////////////////<br>
<br>
//*********************************************************<br>
// 定义模块(module) <br>
//*********************************************************<br>
module tb_czb_8;<br>
<br>
reg tb_clk; //时钟<br>
reg tb_rst; //清零信号<br>
reg tb_sp; //功能选择<br>
wire tb_out; //串并转换输出和串并转换输入数据数据<br>
wire tb_in; //并串转换输出和串并转换输入数据数据<br>
reg tb_Tmp_data_in_8;<br>
reg tb_data_in; <br>
//*********************************************************<br>
// 激活仿真后的串并转换时序设定<br>
//*********************************************************<br>
assign tb_in = ((tb_sp==1)&&(tb_rst==1))?tb_data_in:1'bz; //将寄存器tb_Tmp_out与tb_in关联<br>
always #50 tb_clk<=~tb_clk;<br>
initial <br>
begin<br>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br>
//初始给tb_sp 设为1,tb_rst设为 0,tb_clk设为0, tb_data_in 设为高阻;<br>
//tb_Tmp_data_in_8 设为8'bz;<br>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br>
tb_sp <= 1;<br>
tb_rst<= 0;<br>
tb_clk<=0;<br>
tb_data_in <=1'bz;<br>
tb_Tmp_data_in_8 <= 8'bz;<br>
<br>
////////////////////////////////////////////////////////////////////////<br>
//清零后输入1011_0010,进行串转并模块测试<br>
////////////////////////////////////////////////////////////////////////<br>
<br>
#20 tb_rst <=0;<br>
#100 tb_rst <= 1;<br>
#100 tb_data_in <= 1;<br>
#100 tb_data_in <= 0;<br>
#100 tb_data_in <= 1;<br>
#100 tb_data_in <= 1;<br>
#100 tb_data_in <= 0;<br>
#100 tb_data_in <= 0;<br>
#100 tb_data_in <= 1;<br>
#100 tb_data_in <= 0;<br>
#100 tb_data_in <= 1'bz;<br>
///////////////////////////////////////////////////////////////////////////<br>
//tb_sp设为0,tb_Tmp_data_in_8 设为 10101101;进行并转串测试<br>
///////////////////////////////////////////////////////////////////////////<br>
<br>
#100 tb_sp <=0;<br>
#40 tb_Tmp_data_in_8 <= 8'b10101101;<br>
#100<br>
#900 tb_Tmp_data_in_8 <= 8'b11011001;<br>
#800 tb_Tmp_data_in_8 <=8'bz;<br>
end <br>
czb_8 czb_8(<br>
// 将tb_clk讯号连接到czb_8的clk port<br>
.clk( tb_clk ),<br>
// 将tb_in讯号连接到czb_8的in port<br>
.in(tb_in),<br>
// 将tb_out讯号连接到czb_8的out port<br>
.out( tb_out ),<br>
// 将tb_Tmp_data_in_8向量讯号连接到czb_8的data_in_8 port<br>
.data_in_8( tb_Tmp_data_in_8 ),<br>
// 将tb_rst向量讯号连接到czb_8的rst port<br>
.rst( tb_rst ),<br>
//将tb_sp讯号连接到czb_8的sp port<br>
.sp(tb_sp)<br>
); <br>
endmodule<br>
<br>
//***************************************************************<br>
<br>
这段代码我仿真和综合都没有问题,功能:实现串并和并串转换,双向的! 新手,学习来了! 不错,参考一下 //model for serial to parallel<br>
module ser_pal(clk,en,in,out);<br>
input clk,in;<br>
output out;<br>
reg out;<br>
<br>
always @ (posedge clk)<br>
begin<br>
if(en) out<={out,in};<br>
end 原帖由 keaty 于 2006-7-21 13:59 发表<br>
//model for serial to parallel<br>
module ser_pal(clk,en,in,out);<br>
input clk,in;<br>
output out;<br>
reg out;<br>
<br>
always @ (posedge clk)<br>
begin<br>
if(en) out<={out,in};<br>
end 你的程序简单,在altera fpga/cpld设计的高级篇里看过,<br>
但你的输入位数跟输出相同吗 ? 用移位寄存器做的话用不用考虑所传输数据的问题?因为这样的话一个字节数据所用时间会增加8倍
页:
[1]
2