搜索
bottom↓
回复: 12

第一次使用流水线设计,16位二进制转换成5位十进制,这个应...

[复制链接]

出0入0汤圆

发表于 2012-10-8 15:33:19 | 显示全部楼层 |阅读模式
流水线听得多了,但一直没有使用过,今天要用到将16进制转换到10进制,想到好可以使用流水线提高速度,所以就试了一下,请大家指教.我想这个应该算是流水线了吧,以下是代码及testbench
  1. module H2D(clk,rst,hex,dec);
  2.         input clk;
  3.         input rst;
  4.         input [15:0] hex;
  5.         output [19:0] dec;

  6.         reg [3:0] TenThousand;        //万位
  7.         reg [15:0] d1;
  8.        
  9.         reg [7:0] Thousand;                //千位
  10.         reg [15:0] d2;
  11.        
  12.         reg [11:0] Hundred;                //百位
  13.         reg [15:0] d3;
  14.        
  15.         reg [15:0] Ten;                        //十位
  16.         reg [15:0] d4;
  17.        
  18.         reg [19:0] dout;
  19.        
  20.         initial begin
  21.                 TenThousand=4'h0;
  22.                 d1=16'h0000;
  23.                 Thousand=8'h00;
  24.                 d2=16'h0000;
  25.                 Hundred=12'h000;
  26.                 d3=16'h0000;
  27.                 d4=16'h0000;
  28.                 dout=20'h0_0000;
  29.         end
  30.        
  31.         //万位
  32.         always@(posedge clk) begin
  33.                 if(!rst) begin                                        //同步复位
  34.                         TenThousand<=4'h0;
  35.                         d1<=16'h0000;
  36.                 end else begin
  37.                         if(hex>59999) begin
  38.                                 TenThousand<=4'd6;
  39.                                 d1<=hex-16'd60000;
  40.                         end else if(hex>49999) begin
  41.                                 TenThousand<=4'd5;
  42.                                 d1<=hex-16'd50000;
  43.                         end else if(hex>39999) begin
  44.                                 TenThousand<=4'd4;
  45.                                 d1<=hex-16'd40000;
  46.                         end else if(hex>29999) begin
  47.                                 TenThousand<=4'd3;
  48.                                 d1<=hex-16'd30000;
  49.                         end else if(hex>19999) begin
  50.                                 TenThousand<=4'd2;
  51.                                 d1<=hex-16'd20000;
  52.                         end else if(hex>9999) begin
  53.                                 TenThousand<=4'd1;
  54.                                 d1<=hex-16'd10000;
  55.                         end else begin
  56.                                 TenThousand<=4'd0;
  57.                                 d1<=hex;
  58.                         end
  59.                 end
  60.         end
  61.         //千位
  62.         always@(posedge clk) begin
  63.                 if(!rst) begin
  64.                         Thousand<=8'h00;
  65.                         d2<=16'h0000;
  66.                 end else begin
  67.                         if(d1>8999) begin
  68.                                 Thousand<={TenThousand,4'd9};
  69.                                 d2<=d1-16'd9000;
  70.                         end else if(d1>7999) begin
  71.                                 Thousand<={TenThousand,4'd8};
  72.                                 d2<=d1-16'd8000;
  73.                         end else if(d1>6999) begin
  74.                                 Thousand<={TenThousand,4'd7};
  75.                                 d2<=d1-16'd7000;
  76.                         end else if(d1>5999) begin
  77.                                 Thousand<={TenThousand,4'd6};
  78.                                 d2<=d1-16'd6000;
  79.                         end else if(d1>4999) begin
  80.                                 Thousand<={TenThousand,4'd5};
  81.                                 d2<=d1-16'd5000;
  82.                         end else if(d1>3999) begin
  83.                                 Thousand<={TenThousand,4'd4};
  84.                                 d2<=d1-16'd4000;
  85.                         end else if(d1>2999) begin
  86.                                 Thousand<={TenThousand,4'd3};
  87.                                 d2<=d1-16'd3000;
  88.                         end else if(d1>1999) begin
  89.                                 Thousand<={TenThousand,4'd2};
  90.                                 d2<=d1-16'd2000;
  91.                         end else if(d1>999) begin
  92.                                 Thousand<={TenThousand,4'd1};
  93.                                 d2<=d1-16'd1000;
  94.                         end else begin
  95.                                 Thousand<={TenThousand,4'd0};
  96.                                 d2<=d1;
  97.                         end
  98.                 end
  99.         end
  100.         //百位
  101.         always@(posedge clk) begin
  102.                 if(!rst) begin
  103.                         Hundred<=12'h000;
  104.                         d3<=16'h000;
  105.                 end else begin
  106.                         if(d2>899) begin
  107.                                 Hundred<={Thousand,4'd9};
  108.                                 d3<=d2-16'd900;
  109.                         end else if(d2>799) begin
  110.                                 Hundred<={Thousand,4'd8};
  111.                                 d3<=d2-16'd800;
  112.                         end else if(d2>699) begin
  113.                                 Hundred<={Thousand,4'd7};
  114.                                 d3<=d2-16'd700;
  115.                         end else if(d2>599) begin
  116.                                 Hundred<={Thousand,4'd6};
  117.                                 d3<=d2-16'd600;
  118.                         end else if(d2>499) begin
  119.                                 Hundred<={Thousand,4'd5};
  120.                                 d3<=d2-16'd500;
  121.                         end else if(d2>399) begin
  122.                                 Hundred<={Thousand,4'd4};
  123.                                 d3<=d2-16'd400;
  124.                         end else if(d2>299) begin
  125.                                 Hundred<={Thousand,4'd3};
  126.                                 d3<=d2-16'd300;
  127.                         end else if(d2>199) begin
  128.                                 Hundred<={Thousand,4'd2};
  129.                                 d3<=d2-16'd200;
  130.                         end else if(d2>99) begin
  131.                                 Hundred<={Thousand,4'd1};
  132.                                 d3<=d2-16'd100;
  133.                         end else begin
  134.                                 Hundred<={Thousand,4'd0};
  135.                                 d3<=d2;
  136.                         end
  137.                 end
  138.         end
  139.         //十位
  140.         always@(posedge clk) begin
  141.                 if(!rst) begin
  142.                         Ten<=16'h0000;
  143.                         d4<=16'h0000;
  144.                 end else begin
  145.                         if(d3>89) begin
  146.                                 Ten<={Hundred,4'd9};
  147.                                 d4<=d3-16'd90;
  148.                         end else if(d3>79) begin
  149.                                 Ten<={Hundred,4'd8};
  150.                                 d4<=d3-16'd80;
  151.                         end else if(d3>69) begin
  152.                                 Ten<={Hundred,4'd7};
  153.                                 d4<=d3-16'd70;
  154.                         end else if(d3>59) begin
  155.                                 Ten<={Hundred,4'd6};
  156.                                 d4<=d3-16'd60;
  157.                         end else if(d3>49) begin
  158.                                 Ten<={Hundred,4'd5};
  159.                                 d4<=d3-16'd50;
  160.                         end else if(d3>39) begin
  161.                                 Ten<={Hundred,4'd4};
  162.                                 d4<=d3-16'd40;
  163.                         end else if(d3>29) begin
  164.                                 Ten<={Hundred,4'd3};
  165.                                 d4<=d3-16'd30;
  166.                         end else if(d3>19) begin
  167.                                 Ten<={Hundred,4'd2};
  168.                                 d4<=d3-16'd20;
  169.                         end else if(d3>9)        begin
  170.                                 Ten<={Hundred,4'd1};
  171.                                 d4<=d3-16'd10;
  172.                         end else begin
  173.                                 Ten<={Hundred,4'd0};
  174.                                 d4<=d3;
  175.                         end
  176.                 end
  177.         end
  178.         //个位
  179.         always@(posedge clk) begin
  180.                 if(!rst) begin
  181.                         dout<=20'h0_0000;
  182.                 end else begin
  183.                         dout<={Ten,d4[3:0]};
  184.                 end
  185.         end
  186.         assign dec=dout;
  187.        
  188. endmodule

复制代码
testbench
  1. `timescale 1ps/1ps
  2. module tb;

  3.         reg clk;
  4.         reg rst;
  5.         reg [15:0] hex;
  6.         wire [19:0] dec;
  7.        
  8.         initial begin
  9.                 clk=0;
  10.                 rst=0;
  11.                 hex=16'h0000;
  12.                 #200000
  13.                 rst=1;
  14.         end
  15.        
  16.         always #50000 clk=~clk;
  17.         always #200000 hex=hex-1;
  18.        
  19.         H2D U0(.clk(clk),.rst(rst),.hex(hex),.dec(dec));

  20. endmodule
复制代码
RTL仿真

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出110入0汤圆

发表于 2012-10-8 19:34:54 | 显示全部楼层
以我那好几十天的Verilog经验,表示全忘了,基本看不懂

出0入0汤圆

发表于 2012-10-8 21:12:06 | 显示全部楼层
本帖最后由 NJ8888 于 2012-10-8 21:18 编辑

不像流水线概念(不过verilog我不用),另外BIN2BCD我贴过代码,看似比你简单。是VHDL的,原理上不是很直观,要靠时钟工作,不是组合逻辑
http://www.amobbs.com/thread-4215535-1-1.html

出0入0汤圆

 楼主| 发表于 2012-10-8 21:44:15 | 显示全部楼层
NJ8888 发表于 2012-10-8 21:12
不像流水线概念(不过verilog我不用),另外BIN2BCD我贴过代码,看似比你简单。是VHDL的,原理上不是很直观 ...

你这个是用状态机吧(不懂VHDL,但看起来很像是使用状态机的样子),这可不是流水线吧,
我想像中的流水线应该是这样的吧:
时刻0输入0xFFFF,时刻1输入0xFFFE ... ...
时刻5输出65535,时刻6输出65534 ... ...
数据源源不断的输入,经过流水线的延时后,数据也是源源不断的输出.
你那个程序用状态机,好是16个状态吧,应该不像是流水线啊.我的理解是:时钟0读入一个BIN,时钟15输出1个BCD,再在时钟16读入一个BIN,时钟31输出一个BCD.
如果这样要做成流水线,起码要16条流水线,而且每条流水线的状态机相差1位才可以.
以上是我的理解,不是是否正确,我还是一个FPGA的初学者,请指教.

出0入0汤圆

发表于 2012-10-8 21:50:09 | 显示全部楼层
huatong 发表于 2012-10-8 21:44
你这个是用状态机吧(不懂VHDL,但看起来很像是使用状态机的样子),这可不是流水线吧,
我想像中的流水线应该 ...

你你的理解对的,靠16个时钟把他《65536的数据转成20位BCD。与流水线没关系。

出0入0汤圆

 楼主| 发表于 2012-10-8 21:54:41 | 显示全部楼层
NJ8888 发表于 2012-10-8 21:50
你你的理解对的,靠16个时钟把他《65536的数据转成20位BCD。与流水线没关系。 ...

不过还是要谢谢你给我了一个思路,用你的方法可以做成一条16位深度的流水线,而且时钟会跑得更快.

出0入0汤圆

发表于 2012-10-8 21:55:23 | 显示全部楼层
/********************************************************************************
// @file    project/BinaryToBCD.v
// @author  Richards
// @version V1.0
// @date    28-May-2012
// @brief   8位二进制 转 BCD码
********************************************************************************/
module BinaryToBCD(bin,BCD,ONES,TENS,HUNDREDS);
input [7:0] bin;
output [9:0] BCD;
output [3:0] ONES,TENS;
output [1:0] HUNDREDS;
wire [3:0] c1,c2,c3,c4,c5,c6,c7;
wire [3:0] d1,d2,d3,d4,d5,d6,d7;

assign d1 = {1'b0,bin[7:5]};
assign d2 = {c1[2:0],bin[4]};
assign d3 = {c2[2:0],bin[3]};
assign d4 = {c3[2:0],bin[2]};
assign d5 = {c4[2:0],bin[1]};
assign d6 = {1'b0,c1[3],c2[3],c3[3]};
assign d7 = {c6[2:0],c4[3]};

add3 m1(d1,c1);
add3 m2(d2,c2);
add3 m3(d3,c3);
add3 m4(d4,c4);
add3 m5(d5,c5);
add3 m6(d6,c6);
add3 m7(d1,c7);

assign ONES = {c5[2:0],bin[0]};
assign TENS = {c7[2:0],c5[3]};
assign HUNDREDS = {c6[3],c7[3]};
assign BCD = {HUNDREDS,TENS,ONES};

endmodule

module add3(in,out);
input [3:0] in;
output [3:0] out;
reg [3:0] out;

always @(in)
        case (in)
                4'b0000 : out <= 4'b0000;
                4'b0001 : out <= 4'b0001;
                4'b0010 : out <= 4'b0010;
                4'b0011 : out <= 4'b0011;
                4'b0100 : out <= 4'b0100;

                4'b0101 : out <= 4'b1000;
                4'b0110 : out <= 4'b1001;
                4'b0111 : out <= 4'b1010;
                4'b1000 : out <= 4'b1011;
                4'b1001 : out <= 4'b1100;
                default : out <= 4'b0000;
        endcase
endmodule

出0入0汤圆

 楼主| 发表于 2012-10-8 22:02:04 | 显示全部楼层
richards 发表于 2012-10-8 21:55
/********************************************************************************
// @file    proje ...

谢谢你哦.

出0入0汤圆

发表于 2012-10-8 22:04:11 | 显示全部楼层
huatong 发表于 2012-10-8 22:02
谢谢你哦.

互相参考吧,你的设计思路也不错呢。那是我上学期做秒表时候用的BCD转换代码。

出0入0汤圆

发表于 2013-5-3 19:26:26 | 显示全部楼层
学习了!!!

出0入0汤圆

发表于 2013-5-7 19:22:19 | 显示全部楼层
学习了~~~~

出0入0汤圆

发表于 2013-6-30 18:50:14 | 显示全部楼层
BCD转十进制有方法的,坛子里有,你这样写太耗资源了

出0入0汤圆

 楼主| 发表于 2013-6-30 19:05:56 | 显示全部楼层
本帖最后由 huatong 于 2013-6-30 19:07 编辑
yixinyiyi 发表于 2013-6-30 18:50
BCD转十进制有方法的,坛子里有,你这样写太耗资源了


现在已经改了,40位二进制转换成8位十进制5级流水线.没有贴出来罢了
  1. /***********************************************************
  2.         40位二进制转换为8位十进制
  3. ***********************************************************/
  4. module BinaryToBCD(clk,bin,bcd);
  5. input  clk;
  6. input  [31:0] bin;
  7. output [39:0] bcd;
  8. reg    [39:0] bcd;

  9. reg  [31:0] bin0,bin1,bin2,bin3,bin4;        // /*synthesis noprune*/;

  10. always@(posedge clk) begin
  11.         bin0<=bin;
  12.         bin1<=bin0;
  13.         bin2<=bin1;
  14.         bin3<=bin2;
  15.         bin4<=bin3;
  16. end

  17. wire [3:0] o1,o2,o3;
  18. wire [5:0] i1;
  19. Add3 c1({1'b0,bin0[31:29]},o1);
  20. Add3 c2({o1[2:0],bin0[28]},o2);
  21. Add3 c3({o2[2:0],bin0[27]},o3);
  22. assign i1={o1[3],o2[3],o3};

  23. wire [7:0] o21,o22,o23;
  24. reg  [9:0] i2;
  25. add3_8 c4({1'b0,i1,bin0[26]},o21);
  26. add3_8 c5({o21[6:0],bin0[25]},o22);
  27. add3_8 c6({o22[6:0],bin0[24]},o23);
  28. always@(posedge clk) i2<={o21[7],o22[7],o23};                                // 第一级流水线

  29. wire [11:0] o31,o32,o33;
  30. wire [13:0] i3;
  31. add3_12 c7({1'b0,i2,bin1[23]},o31);
  32. add3_12 c8({o31[10:0],bin1[22]},o32);
  33. add3_12 c9({o32[10:0],bin1[21]},o33);
  34. assign i3={o31[11],o32[11],o33};

  35. wire [15:0] o41,o42,o43;
  36. reg  [17:0] i4;
  37. add3_16 c10({1'b0,i3,bin1[20]},o41);
  38. add3_16 c11({o41[14:0],bin1[19]},o42);
  39. add3_16 c12({o42[14:0],bin1[18]},o43);
  40. always@(posedge clk) i4<={o41[15],o42[15],o43};                                // 第二级流水线

  41. wire [19:0] o51,o52,o53;
  42. wire [21:0] i5;
  43. add3_20 c13({1'b0,i4,bin2[17]},o51);
  44. add3_20 c14({o51[18:0],bin2[16]},o52);
  45. add3_20 c15({o52[18:0],bin2[15]},o53);
  46. assign i5={o51[19],o52[19],o53};

  47. wire [23:0] o61,o62,o63;
  48. reg  [25:0] i6;
  49. add3_24 c16({1'b0,i5,bin2[14]},o61);
  50. add3_24 c17({o61[22:0],bin2[13]},o62);
  51. add3_24 c18({o62[22:0],bin2[12]},o63);
  52. always@(posedge clk) i6<={o61[23],o62[23],o63};                                // 第三级流水线

  53. wire [27:0] o71,o72,o73;
  54. wire [29:0] i7;
  55. add3_28 c19({1'b0,i6,bin3[11]},o71);
  56. add3_28 c20({o71[26:0],bin3[10]},o72);
  57. add3_28 c21({o72[26:0],bin3[9]},o73);
  58. assign i7={o71[27],o72[27],o73};

  59. wire [31:0] o81,o82,o83;
  60. reg  [33:0] i8;
  61. add3_32 c22({1'b0,i7,bin3[8]},o81);
  62. add3_32 c23({o81[30:0],bin3[7]},o82);
  63. add3_32 c24({o82[30:0],bin3[6]},o83);
  64. always@(posedge clk) i8<={o81[31],o82[31],o83};                                // 第四级流水线

  65. wire [35:0] o91,o92,o93;
  66. wire  [37:0] i9;
  67. add3_36 c25({1'b0,i8,bin4[5]},o91);
  68. add3_36 c26({o91[34:0],bin4[4]},o92);
  69. add3_36 c27({o92[34:0],bin4[3]},o93);
  70. assign i9={o91[35],o92[35],o93};

  71. wire [39:0] o101,o102,o103;
  72. wire [41:0] i10;
  73. add3_40 c28({1'b0,i9,bin4[2]},o101);
  74. add3_40 c29({o101[38:0],bin4[1]},o102);
  75. assign i10={o101[39],o102,bin4[0]};

  76. always@(posedge clk) bcd<=i10[39:0];                                                        // 第五级流水线

  77. endmodule


  78. /*********** 4位比较加3模块 *************/
  79. module Add3(in,out);
  80. input  [3:0] in;
  81. output reg [3:0] out;

  82. always@(in)
  83.         case(in)
  84.                 4'b0000:                out<=4'b0000;
  85.                 4'b0001:                out<=4'b0001;
  86.                 4'b0010:                out<=4'b0010;
  87.                 4'b0011:                out<=4'b0011;
  88.                 4'b0100:                out<=4'b0100;
  89.                 //
  90.                 4'b0101:                out<=4'b1000;
  91.                 4'b0110:                out<=4'b1001;
  92.                 4'b0111:                out<=4'b1010;
  93.                 4'b1000:                out<=4'b1011;
  94.                 4'b1001:                out<=4'b1100;
  95.                 //
  96.                 default:                out<=4'b0000;
  97.         endcase
  98. endmodule

  99. module add3_8(in,out);
  100.         input  [7:0] in;
  101.         output [7:0] out;
  102.        
  103.         Add3 m1(in[7:4],out[7:4]);
  104.         Add3 m2(in[3:0],out[3:0]);
  105. endmodule

  106. module add3_12(in,out);
  107.         input  [11:0] in;
  108.         output [11:0] out;
  109.        
  110.         Add3 m1(in[11:8],out[11:8]);
  111.         add3_8 m2(in[7:0],out[7:0]);
  112. endmodule

  113. module add3_16(in,out);
  114.         input  [15:0] in;
  115.         output [15:0] out;
  116.        
  117.         Add3 m1(in[15:12],out[15:12]);
  118.         add3_12 m2(in[11:0],out[11:0]);
  119. endmodule

  120. module add3_20(in,out);
  121.         input  [19:0] in;
  122.         output [19:0] out;
  123.        
  124.         Add3 m1(in[19:16],out[19:16]);
  125.         add3_16 m2(in[15:0],out[15:0]);
  126. endmodule

  127. module add3_24(in,out);
  128.         input [23:0] in;
  129.         output [23:0] out;
  130.        
  131.         Add3 m1(in[23:20],out[23:20]);
  132.         add3_20 m2(in[19:0],out[19:0]);
  133. endmodule

  134. module add3_28(in,out);
  135.         input [27:0] in;
  136.         output [27:0] out;
  137.        
  138.         Add3 m1(in[27:24],out[27:24]);
  139.         add3_24 m2(in[23:0],out[23:0]);
  140. endmodule

  141. module add3_32(in,out);
  142.         input  [31:0] in;
  143.         output [31:0] out;
  144.        
  145.         Add3 m1(in[31:28],out[31:28]);
  146.         add3_28 m2(in[27:0],out[27:0]);
  147. endmodule

  148. module add3_36(in,out);
  149.         input  [35:0] in;
  150.         output [35:0] out;
  151.        
  152.         Add3 m1(in[35:32],out[35:32]);
  153.         add3_32 m2(in[31:0],out[31:0]);
  154. endmodule

  155. module add3_40(in,out);
  156.         input  [39:0] in;
  157.         output [39:0] out;
  158.        
  159.         Add3 m1(in[39:36],out[39:36]);
  160.         add3_36 m2(in[35:0],out[35:0]);
  161. endmodule
复制代码
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 10:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表