• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Verilogのことで質問です。)

Verilog初心者の質問: TENKEYの指定したビットを制御する方法について

このQ&Aのポイント
  • Verilog初心者の方が、学習ソフトでTENKEYの指定したビットを制御する方法について質問しました。
  • 電子錠のテストベンチの一部分で、指定したビットを1にする方法と0にする方法を教えて欲しいとのことです。
  • 学習ソフトには解答がなく、アドバイスはあるものの、正解がわからず困っています。

質問者が選んだベストアンサー

  • ベストアンサー
  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.1

何をするものなのかが全く分からないので間違っているかもしれませんが。テストベンチ用のタスク? おそらく、両方の■とも {KEYNO} だと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Verilogの学習ソフトをやっているのですが。

    初心者ですがある学習ソフトをやっているのですが下の■の部分が結構考えたのですがどうしても正解を導き出せなくて困っていたので質問させていただきます。■の部分のはそれぞれ、「TENKEYの指定したビットを1にします」「TENKEYの指定したビットを0にします」とアドバイスがでます。 ちなみにこれは電子錠のテストベンチの記述の一部分です。アドバイスは出ますが解答がどこにもない学習ソフトですのでどなたか教えていただけたらなと思い質問しました。 TENKEYは reg [9:0] TENKEY と定義されています。 task KEYIN; //暗証番号入力タスク input [3:0] KEYNO; begin TENKEY ■■■= 1'b1; //テンキー入力 #(STEP*3) TENKEY ■■■= 1'b0; //テンキーoff #STEP; end endtask キー入力タスクの部分です。 ちなみに{KEYNO}と入力しても正解にはなりませんでした。 どなたかお願いします。

  • Verilog HDLについて質問

    以下のプログラムを入力し、試してもうまくいきません。どこがいけないのでしょうか。 しようとおもっていることを大まかにいうと、 ・x1の立ち上がりに、money1に1を足す ・x2の立ち上がりに、money2に2を足す ・クロックの立ち上がりに、sumにmoney1とmoney2を足したものを入れて、 sumが3だったら、z1に割り当てたLEDを光らせる sumが4だったら、z2に割り当てたLEDを光らせる というものです。 試してみると結果はz1,z2両方のLEDが、x1,x2を立ち上げなくても最初から光ってしまいます。 module vendmachine(x1,x2,z1,z2,clk); input x1,x2,clk; output z1,z2; reg [2:0] money1; reg [2:0] money2; reg [2:0] sum; reg ledz1,ledz2; always@(posedge x1) begin money1=money1+3'd1; end always@(posedge x2) begin    money2=money2+3'd2; end always@(posedge clk) begin sum=money1+money2; if(sum==3'd3)begin ledz1=1'b1; end if(sum==3'd4)begin ledz1=1'b1; ledz2=1'b1; end end assign z1=ledz1; assign z2=ledz2; endmodule

  • フリーのverilog-HDLシミュレータ

    Windows上で動作するフリーのverilog-HDLシミュレータを探しています。 Siliosが少し前までフリーでダウンロードできたそうなのですが、今はダウンロードが禁止されています。。 例えば、このような回路を波形を見ながら解析したいと考えています。 //○シミュレーション対象:4ビット加算回路 module adder ( a, b, q ); input [3:0] a,b; output [3:0] q; assign q = a + b; endmodule //○シュミレーション記述 `timescale 1us/1us module adder_test; reg [3:0] a,b; wire [3:0] q; parameter STEP=1000 adder adder ( a, b, q ); initial begin a = 4'h0; b = 4'h0; #STEP a = 4'h5; b = 4'ha; #STEP a = 4'h7; b = 4'ha; #SEEP $finish; end endmodule

  • Verilogで動的なモジュールを作る方法

    Verilogで動的なモジュールを作る方法 たとえば、どのような周波数であっても 1秒のウェイトをする回路を作りたいと思っています。 試験的に、 `define time (1) //1S `define tCK (20) //周期20nS module wait( input iCLOCK, input inRESET, output reg oWAITEND); localparam = loop_end (1/(`time * 1000000000))/`tCK; reg [31 : 0] loop; always@(posedge iCLOCK or negedge inRESET)begin if(inRESET == 1'b0)begin loop <= 32'h00000000; end else begin if(loop < loop_end)begin loop <= loop + 32'h00000001; oWAITEND <= 1'b0; end else begin oWAITEND <= 1'b0; loop <= loop; end end end //always endmodule というものを作って、defineの値(このdefineは別ヘッダファイルからincludeしてやりました)を変えてやれば目的の周波数で動き、目的のウェイト作るモジュールををソース自体を変えずに得られると思いましたが、 シミュレーションではうまくいったものの、QuartusIIではうまく論理合成されませんでした。 もし、他に方法がありましたら教えていただけないでしょうか? よろしくおねがいします。

  • Verilogでメモリのmoduleと演算のmoduleを組み合わせたい

    module spram_sr(clk, we, address, data_i, data_o); input clk; input we; input [7:0] address; input [2:0] data_i; output [2:0] data_o; reg [6:0] ram [15:0]; reg [6:0] read_a; always @(posedge clk) begin if (we) begin ram[address] <= data_i; end read_a <= address; end assign data_o = ram[read_a]; endmodule を使って、メモリから8bitの整数を取り出して、0~15個の数値をたすような計算をさせたいと思って別に計算させるmoduleを作りました。これに計算をさせるスタート信号と計算終了を知らせるフィニッシュ信号を加えています。 module sigma(clk,x,sum,start,finish); input clk; input[7:0] x, start; output[7:0] sum; output finish; reg[7:0] sum,start,write_add; reg finish; integer i; always@(posedge clk) begin if(start) for(i=0;i<=15;i=i+1) sum<=sum+x[i]; write_add<=sum; finish<=1'b1; end endmodule この二つを使いたいのですが、メモリから演算のモジュールに整数を渡すやりかたがわかりません。もう一つmoduleを使って制御する必要があるのでしょうか?すいませんが、どなたか教えていただけないでしょうか?

  • Verilog-HDLによる設計において

    現在Z8085のCPUを設計しており、テンポラリレジスタにラッチする部分でなかなか上手くいきませんので質問させていただきます。 always文を使用したステートマシンにより制御しようとしているのですが次のようなWarningが出ます。 Warning: Latch IR[0]$latch has unsafe behavior Warning: Latch IR[1]$latch has unsafe behavior            : Warning: Latch IR[7]$latch has unsafe behavior Warning: Latch TMP1[0]$latch has unsafe behavior Warning: Latch TMP1[1]$latch has unsafe behavior            : Warning: Latch TMP1[7]$latch has unsafe behavior Warning: Latch TMP2[0]$latch has unsafe behavior Warning: Latch TMP2[1]$latch has unsafe behavior            : Warning: Latch TMP2[7]$latch has unsafe behavior Warning: Latch NEXT_STATE[0]$latch has unsafe behavior Warning: Latch NEXT_STATE[1]$latch has unsafe behavior <ソース> module CPU_TMP( CLK, nRST, FROM_DCD, IR, TMP1, TMP2, STATE, NEXT_STATE ); input CLK;//クロック input nRST;//リセット input [7:0] FROM_DCD;//入力命令 output [7:0] IR;//命令レジスタ output [7:0] TMP1;//テンポラリレジスタ1 output [7:0] TMP2;//テンポラリレジスタ2 output [1:0] STATE;//現在のステート output [1:0] NEXT_STATE;//次のステート reg [7:0] IR; reg [7:0] TMP1; reg [7:0] TMP2; reg [1:0] STATE; reg [1:0] NEXT_STATE; //状態 parameter S0 = 2'b00; parameter S1 = 2'b01; parameter S2 = 2'b10; parameter SD = 2'b11; //命令 parameter INRA = 8'h11; parameter MVIA = 8'h22; parameter JMP = 8'h33; always @( posedge CLK ) begin     if( nRST == 0 )       STATE <= SD;     else       STATE <= NEXT_STATE; end always @( STATE ) begin    case( STATE )      SD : begin            IR <= 0;            TMP1 <= 0;            TMP2 <= 0;            NEXT_STATE <= S0;          end      S0 : begin            IR <= FROM_DCD;            case( FROM_DCD )              INRA : NEXT_STATE <= S0;              MVIA : NEXT_STATE <= S1;              JMP : NEXT_STATE <= S2;            endcase          end      S1 : begin              TMP1 <= FROM_DCD;              NEXT_STATE <= S0;          end      S2 : begin              TMP2 <= FROM_DCD;              NEXT_STATE <= S0;          end endcase end endmodule どのようにしたらこのWarningを消すことができるでしょうか。

  • verilog で「*」を使って2の補数形式の乗算って・・・

    加算器、減算器 どうやらうまくいったようでやっと乗算器を作っています。それで早速質問ですが、2の補数形式を「*」をつかって作りたいのですが、次のようにやると文法エラーになってしまいます。 ****************************** module mul(a,b,q); input [15:0] a,b; output [32:0] q; reg [32:0] q; always@(a or b) begin if((a == 16'h8000) || (b == 16'h8000)) $monitor("error"); else if((a[15] == 0) && (b[15] == 0)) q = a * b; else if((a[15] == 0) && (b[15] == 1)) begin q =a * (~b+1); q = ~q+1; end else if((a[15] == 1) && (b[15] == 0)) begin q =(~a+1) * b; q = ~q+1; end elseif((a[15] == 1) && (b[15] == 1)) q = (~a + 1) * (~b + 1); else q = a * b; end endmodule ******************************** 内容は q = (~a + 1) * (~b + 1); (mul.v,28|16): expecting a semicolon(';') けれどどこが間違っているのか… ちなみにalways@(a[15] or b[15])のように書き換えるとシミュレーションできるのですが、結果があっていません。 どなたか教えてくださいm(_ _)m

  • verilog ALU

    verilog初心者です。4ビットALUを作っているのですが、いくつかの点で躓いています。最初に2点だけ質問させて下さい。 このALUでは、4ビットの入力AとB、1ビットの入力x、y、z、 そして4ビット出力のResultと1ビット出力のOverflowを使います。 x、y、z、はオペレーションコントロールで、例えばx=0, y=1, z=0 の時A+Bを行うのですが、 もしこの時A=8、B=8だとResult=16(5ビット)になるのでOverflow=1とセットします。 しかしResultは4ビットなのでどのようにしたらOverflow=1にセットできますでしょうか。 例えば、予め5ビットの変数(temp)を用意しA+Bの結果を5ビットに拡張して計算。 もしtempが16以上ならオーバーフローということでOverflow=1としたのですが、うまくいきません。 if(x==0&&y==1&&z==0)begin  //加算の処理 Result <= A + B;   //普通に加算 temp <= {A[3], A} + {B[3], B}; //拡張して加算 if(temp >= 5'b10000)begin //16以上か比較 Overflow <= 1; end else begin Overflow <= 0; end end それと、2の補数も考慮しないといけないのですが、正の計算と負の計算では、どのように区別して計算すればいいのでしょうか。 最上位ビットが0か1かで正か負を分けるのはわかるのですが、例えば 1111は、正で言えば15ですが2の補数でいえば-1になります。Aが15、Bが-1で引き算をする場合、15-(-1)で16となってしまいます。 これはどのように考えたらいいのでしょうか。 もちろん答えが-16以下となってもOverflow=1とセットします。 宜しくお願いいたします。

  • Verilogでモンゴメリ乗算

    私はVerilogについてはド素人で全くと言っていいほど書くことができません。そこに仕事上でVerilogでモンゴメリ乗算をしなくてはならなくなりました。どうかわかる方はこの以下のアルゴリズムを利用してプログラムを教えてください。お願いします。 まずはそのアルゴリズムを紹介します。 [モンゴメリ乗算アルゴリズム] Input: N,0<A<N,0<B<N,V  前計算: V=-N-1mod2r output: M=A・BmodN Step 1:Q=A・B・VmodR R=2r   Step 2:M=AB+QN Step 3: M=M/R 注.前計算,step1の2rは“2のr乗”です。また前計算の-N-1は   “-Nの-1乗”のことです。 ビット数は全て8bitでお願いします。  

  • 2ビットのレジスタのVerilog HDL記述

    QuatusIIで2ビットのレジスタをつくっているのですが、ブロック図をコンパイルするときにエラーがでてしまいます。 エラー内容をみるとVerilog HDL記述が間違えているみたいなのですが、どこが間違えているか教えてください。 /* REG2 */ module REG2module ( EN, CLR_B, IN1, IN2, CLK, Q ); input CLR_B, CLK; input IN1, IN2; output [1:0] Q; output EN; assign EN=FUNC_EN (IN1, IN2); function FUNC_EN; input IN1,IN2; if (IN1>0|IN2>0) FUNC_EN=1; else FUNC_EN=0; endfunction wire [1:0] D; CONECT (IN1,D[0]); CONECT (IN2,D[1]); reg [1:0] Q; always @( posedge CLK or negedge CLR_B ) if( !CLR_B ) Q <= 0; else if(EN) Q <= D; endmodule エラーにはError: Node instance "comb_8" instantiates undefined entity "CONECT" Error: Node instance "comb_9" instantiates undefined entity "CONECT" と出ています。意味を調べたのですが、CONECTが定義されていない?という事は具体的にどうすればいいでしょうか。 CONECT (IN1,D[0]); CONECT (IN2,D[1]); の部分が間違っているのはなんとなくわかるのですが、どうしたらいいかわかりません。 よろしくお願いします